브라우저 버전의 라쿠토 시스템 : 웹 브라우저의 음성 인식/독서 API를 사용하여 VRChat에서 음성 발레없이 핸즈프리 대화

바로 사용하고 싶은 사람에게



바로 사용하고 싶은 사람은 이쪽 h tps : // spee ch-Agen t. 어리석은 p. 코m/

이 기사에서는 무엇을하고 있는지



"웹 브라우저에서 Web Speech API를 사용하여 마이크의 목소리를 인식하고 텍스트화하고 목소리 입력이 끝나면 Web Speech API에서 텍스트를 읽는 것을 반복한다"라는 웹 앱입니다.

이 Web Speech API에 의한 읽기는 브라우저로부터의 음성 출력이므로, Windows의 설정→시스템→사운드→어플리의 음량과 디바이스의 기본 설정으로부터 브라우저의 음성 출력처를 NetDuetto(가상 라인 입출력)로 해, VRChat측에서도 Microphone의 설정을 NetDuetto로 하면 브라우저에서 읽은 음성이 VRChat에서 흐릅니다! (이어서 브라우저상에서 흐르고 있는 임의의 소리도 VRChat로 흘릴 수 있다/흐른다)

실현까지의 사이에 시도해 좌절한 다른 수법에 대해서


  • Python3과 Google Cloud Speech API를 통해 마이크의 음성을 인식하여 인식 결과를 Softalk에 알립니다.

    녹음한 음성 데이터의 음성 인식은 아무리 짧아도 1요청으로 카운트되어 버리므로 어쨌든 말할 수 없다. 스트리밍 음성 인식은 1분이라는 제한이 있다. 거기서 말하기 시작하고 나서 스트리밍 리퀘스트를 던지게 하고 싶었지만 Python2에 의한 선인의 코드를 Python3에 이식하는 곳에서 挫挫, 일정 시간마다 차분을 취한다든가?)
  • SPTK를 Windows에 설치하고 파이썬에서 두드려 육성에서 로봇 목소리를 만듭니다

  • nmake했지만 bin의 내용이 엉망진창 빠져 버렸다(잘 된 분의 코멘트 기다리고 있습니다!!) 실시간으로 음성 스트림을 받아 피치를 펄스 음원으로 대체 로봇 음성으로 하는 최유력 후보였다 하지만...
    Linux 환경이라면 SPTK의 설치는 용이한 한편, VRChat의 동작이나 가상 라인 출력 등 너무 태스크가 늘어 버린다, Ubuntu on WSL은 Windows측과의 음성 파일의 교환이 귀찮아, Cygwin도 그다지 부드럽지 않을 것 같다
    예 아바타도 만들고 싶지만 거기까지 할 수 없다고 생각하면 시도합니다.
  • PyWorld와 Jupyter Notebook (IPython)에서 육성을 로봇 음성으로 변환

  • 특징 량 검출을 걸면 엉망이 되어 듣는 커녕 이야기가 아니게 되었다
    (내 발성에 문제가 있는지 녹음 방법에 문제가 있는지)
    본가 WORLD를 컴파일하고 시험하는 것은 또 마음이 향하면 시험해 보겠습니다…

    음성인식·판독 페이지 만들기



    【입문 샘플】Web Speech API를 사용해 브라우저와 음성으로 교환 가 대단히 참고가 되었습니다.

    그 대부분을 상속하면서 콘솔의 로그를 출력하지 않도록 변경하고 설정을 추가했습니다. 또한 API 사양 변경에 대응하기 위해 버튼 클릭으로 speak()시켜 음성 인식을 시작하도록 했습니다.
    htps : // 기주 b. 코 m / 나 피에 r JP / 시 mp ぇ S 페에 찬 t 에 최소 구성의 것을 ready-to-deploy인 상태로 두고 있습니다.
    htps : // spee ch-Gen t. 어리석은 p. 코m/ 의 내용은 htps : // 기주 b. 코 m / 나 피에 r JP / S 페에 찬 t 에.

    index.html
    
    <!DOCTYPE html>
    <html lang="jp">
    
    <head>
        <meta charset="UTF-8">
        <title>Speech-to-Talkback</title>
        <script>
            let talkbackEnabled = false;
    
            function talkback() {
                // 利用するWebAPIをインスタンス化する
                window.SpeechRecognition = window.SpeechRecognition || window.webkitSpeechRecognition;
                const recog = new SpeechRecognition();
                const synth = new SpeechSynthesisUtterance();
    
                // 設定項目
                const pitchSetting = 1.0;  // ピッチ 0(min) - 2(max), default 1.0
                const volumeSetting = 1.0; // 音量 0(min) - 1(max), default 1.0
                const rateSetting = 1.0; // 話す速さ 0.1(min) - 10(max), default 1.0
                // 設定項目終わり
    
                const defaultInput = "";
                let input = defaultInput;
                recog.lang = "ja-JP";
                synth.lang = "ja-JP";
                synth.pitch = pitchSetting;
                synth.volume = volumeSetting;
                synth.rate = rateSetting;
                // 聞き取り中に、マイクからの入力があったときのイベント
                recog.addEventListener("result", e => {
                    // 入力結果をテキストで取得し、それをグローバル変数に格納し、聞き取りを終了する
                    input = e.results[0][0].transcript;
                    recog.stop();
                });
                // 聞き取りを終了したときのイベント
                recog.addEventListener("end", () => {
                    // 入力結果が初期状態の場合は聞き取りが自動終了したと判断し、聞き取りを再開する
                    if (input === defaultInput) {
                        recog.start();
                    }
                    // 入力結果に値があればそれを読み上げ、入力結果を初期化する
                    else {
                        synth.text = input;
                        document.querySelector("#recognizedText").textContent = input;
                        input = defaultInput;
                        speechSynthesis.speak(synth);
                    }
                });
                // 読み上げを終了したときのイベント
                synth.addEventListener("end", () => {
                    // 聞き取りを再開する
                    recog.start();
                });
                // 聞き取りを開始する
                recog.start();
            }
    
            function initSpeak() {
                let initSynth = new SpeechSynthesisUtterance("自動読み上げ 有効");
                initSynth.lang = "ja-JP";
                speechSynthesis.speak(initSynth);
                talkback();
            }
    
        </script>
    </head>
    
    <body>
        認識内容:<div id="recognizedText"></div><br>
        <button onclick="initSpeak();">最初に一度押してください</button><br>
        (APIの仕様変更によりユーザーがボタンを押して許可することが必要になりました。「自動読み上げ有効」と読み上げられます)<br>
    </body>
    
    </html>
    

    실현할 수 있었던 것, 할 수 없었던 것



    화면을 전환하지 않고 항상 마이크에서의 음성 입력을 기다려 주고, 게다가 무료이고 고정밀도로 인식해 주는 것이 실현될 수 있었다
    일단 Web 어플리를 deploy 하면, 음성 출력처와 마이크마저 준비하면 다른 Win10기로 이행이 용이(웹사이트이므로)
    말을 끝내지 않으면 소리내어 읽기 시작하지 않기 때문에, 몇 초의 타임 래그는 여전히 남는다. 시간 지연을 짧게 하고 오인식을 줄이기 위해서도 말을 끊으면서 말할 필요가 있다

    참고 사이트



    【입문 샘플】Web Speech API를 사용해 브라우저와 음성으로 교환
    [HTML5] Web Speech API 시작

    좋은 웹페이지 즐겨찾기