4

マイクからオーディオ ストリームを入力し、それを blob に保存して、Speech Recognition API エンドポイントに送信できるようにしようとしています。これはデスクトップの Google Chrome では完全に機能しますが、モバイル デバイスのブラウザー (Android Google Chrome) に切り替えるとエラーが発生することに気付きました。オーディオをファイルに出力した後、デスクトップではファイルの音は問題なく聞こえますが、私の電話では完全に歪んでいることがわかりました。さらに調査した結果、Android chromeは Blob をサポートしていないようです。

この問題の回避策はありますか?

これは、音声を Blob に追加してファイルに保存する方法です。

                var blob = new Blob([audio], { type: 'audio/wav' });
                var reader = new FileReader;
                reader.onload = function() {
                    window.open(this.result.replace(/data:.+?\/[^;]+/, "data:application/octet-stream"));
                };
                reader.readAsDataURL(blob);

更新: オーディオをファイルに保存しようとしていますが、reader.readAsDataURL() およびその他のリーダー メソッド (このリンクによると) は blob オブジェクトを想定しています。私のオーディオ オブジェクトは ArrayBuffer の型です。私の他の質問は、ArrayBuffer をファイルに出力するにはどうすればよいですか?

別の更新:このリンクによると、Blob は android chrome でサポートされている必要があります。それにもかかわらず、音声が歪んでいます。問題は別の場所にある可能性がありますか?

更新: さらに調査した結果、オーディオ配列が適切にエンコードされていない可能性があることがわかりました。マイクからの音声を処理するために、ScriptProcessor を使用していますが、このリンクによると、これは非推奨であり、android chrome ではサポートされていません。オーディオ入力のエンコード方法については、このライブラリをご覧ください。Audio Workletを使用するように切り替えることで、この問題を解決できるのではないかと考えています。これが、スクリプト プロセッサ ノードの使用方法です (参照ライブラリでも確認できます)。

       // Create ScriptProcessorNode
        this.scriptProcessorNode = this.options.context.createScriptProcessor(this.options.bufferLen, numChannels, numChannels);
        // Connect scriptProcessorNode (Theretically, not required)
        this.scriptProcessorNode.connect(this.options.context.destination);
        // Create callback to update/analyze floatFrequencyData
        var self = this;
        this.scriptProcessorNode.onaudioprocess = function (event) {
            self.analyser.getFloatFrequencyData(self.floatFrequencyData);
            self.update();
            self.store(event);
            self.monitor();
        };
        // Connect scriptProcessorNode
        this.options.source.connect(this.scriptProcessorNode);
4

0 に答える 0