ブラウザからNodejsサーバーに送信されたBlobを使用してSpeech-to-TextをGoogleで検索する方法

アリトロン

を使用してクライアントブラウザから音声を受信するようにサーバーを設定し、SocketIOそれをGoogle Speech-to-Textで処理して、最後にテキストでクライアントに返信しようとしています。

もともと理想的には、このページのツールのように機能するように設定したかった:https//cloud.google.com/speech-to-text/

を使用getUserMediaしてストリーミングしてみましたがSocketIO-Stream、「パイプ」する方法がわかりませんでしたMediaStream

代わりMediaRecorderに、クライアント側で使用し、データ全体をblobとして送信することにしました(この例を参照)。

次にtoString('base64')、blobに適用し、blobでgoogle-cloud / speech'sを呼び出しますclient.recognize()

クライアント側(私はVueJSを使用しています):

        new Vue({
            el: '#app',
            data: function () {
                return ({
                    msgs: [],
                    socket: null,
                    recorder: null,
                    : []
                })
            },
            mounted: function () {
                this.socket = io.connect('localhost:3000/user');
                console.log('Connected!')
                this.socket.on('text', function (text) {
                    this.msgs.push(text)
                })
            },
            methods: {
                startRecording: function () {
                    if (this.recorder && this.recorder.state == 'recording') {
                        console.log("Stopping!")
                        this.recorder.stop()
                    } else {
                        console.log("Starting!")
                        navigator.mediaDevices.getUserMedia({ audio: true, video: false })
                            .then(this.handleSuccess);
                    }
                },
                handleSuccess: function (stream) {
                    this.recorder = new MediaRecorder(stream)
                    this.recorder.start(10000)
                    this.recorder.ondataavailable = (e) => {
                        this.chunks.push(e.data)
                        console.log(e.data)
                    }
                    this.recorder.onstop = (e) => {
                        const blob = new Blob(this.chunks, { 'type': 'audio/webm; codecs=opus' })
                        this.socket.emit('audio', blob)
                    }
                }
            }
        })

サーバ側:

const speech = require('@google-cloud/speech');
const client = new speech.SpeechClient();

const io = require('socket.io').listen(3000)
const ss = require('socket.io-stream')

const encoding = 'LINEAR16';
const sampleRateHertz = 16000;
const languageCode = 'en-US';

const audio = {
    content: null
}

const config = {
    encoding: encoding,
    sampleRateHertz: sampleRateHertz,
    languageCode: languageCode,
}

async function main() {
    const [response] = await client.recognize({
        audio: audio,
        config: config
    })
    const transcription = response.results
        .map(result => result.alternatives[0].transcript)
        .join('\n');
    console.log(`Transcription: ${transcription}`);
}

io.of('/user').on('connection', function (socket) {
    console.log('Connection made!')
    socket.on('audio', function (data) {
        audio.content = data.toString('base64')
        main().catch(console.error)
    });
});




main()サーバー側の関数からのログは常に次のとおりです。

「文字起こし:」

-これは空です!

送信された音声からのテキストが含まれている必要があります。前もって感謝します!

O.ジョーンズ

nodejsアプリケーションは、'LINEAR16'16kサンプル/秒(16000)のレートで16ビット符号付き整数()の配列として記録された生のオーディオデータの処理を要求しますこの種のオーディオ表現は、古代の電話の伝承で失われた理由からパルス符号変調(PCM)として知られています。

しかし、クライアント側のコードから送信するBlobはそうではありません。これは、content-typeを持つメディアオブジェクトaudio/webm; codecs=opusです。オーディオトラックを使用して圧縮されることを意味するオーパスコーデック箱入りWEBMに(多重化)(Matroskaは、EBML)コンテナフォーマットクラウドのテキスト読み上げコードは、それを生の音声データとして解釈しようとしますが、失敗し、手を挙げて、空の文字列を返します。これは、テキストエディタでzipファイルを表示しようとするのと似ています。意味不明です。

テキスト読み上げをメディアオブジェクトで機能させるには、最初にそのオブジェクトからPCMオーディオを抽出する必要があります。これは、サーバーにセットアップする際の首の悪名高い痛みです。ffmpegを使用する必要があります。テキスト読み上げのドキュメントにチュートリアルがありますチュートリアルでは、ビデオファイルからオーディオをスクレイピングすることに言及しています。Blobは基本的に、ビデオトラックが含まれていないビデオファイルであるため、同じ手法が機能します。

ただし、MediaStreamブラウザのjavascript APIを使用して、最初のアプローチに戻る方がはるかに良いでしょう特に、ブラウザコードは、Web Audio APIの要素を使用して、生のPCMオーディオデータをインターセプトし、サーバーに送信するか、ブラウザから直接テキスト読み上げに送信する必要があります。

これらすべてを説明することは、StackOverflowの回答の範囲をはるかに超えています。ここにいくつかのヒントがあります。WebオーディオAPIを使用して生のpcmオーディオを取得する方法は?

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

javascriptを使用してユーザーから入力された文字列を文字列で検索する方法

分類Dev

Webブラウザ内で統合検索/アドレスバーを使用する場合、入力したURLをブラウザに検索させるにはどうすればよいですか?

分類Dev

XHRを介してblobデータをクライアントからNodeJSサーバーに送信します

分類Dev

Flaskを使用してjqueryデータテーブルから送信されたサーバー側パラメータを処理する方法は?

分類Dev

ブラウザが最初のWebサーバー応答を送信する前にJavascriptをサポートしているかどうかをサーバーサイドで検出するにはどうすればよいですか?

分類Dev

FirefoxでOpenDNS検索の代わりにGoogle検索を使用する方法

分類Dev

getUserMediaを使用して、ブラウザからnodejsサーバーにデータをストリーミングします

分類Dev

ブラウザがOPTIONSリクエストを送信しても、Cookieがサーバーに送信されませんか?

分類Dev

セレンウェブドライバーc#を使用して新規ユーザー登録のために入力されたemailidの受信ボックスに送信されるEメール検証リンクを自動化する方法

分類Dev

node.jsを使用してサーバー側からブラウザーを更新するにはどうすればよいですか?

分類Dev

jsonwebtokenがサーバーnodejsに保存されている場所。ユーザーがログアウトしたらJWTを期限切れにする方法

分類Dev

Pythonを使用してウェブサイトの検索バーからデータを抽出するにはどうすればよいですか?

分類Dev

jspまたはjavascriptを使用してサーバー上にあるブラウザでpdfを表示する方法

分類Dev

Javascriptを使用してGoogle検索バーを選択する方法

分類Dev

MediaRecorderからサーバーにチャンクを送信し、ブラウザーで再生します

分類Dev

接続を開いている間、ブラウザからWebSocketサーバーにユーザーIDを送信します

分類Dev

方法:ブラウザはJSONをサーバーに送信しますか?

分類Dev

TCP / IP通信を使用して、ランダムに生成されたバイト配列をクライアントからサーバーに送信する

分類Dev

アプリがバックグラウンドにある場合、fcmを使用してサーバーから送信されたデータを取得するにはどうすればよいですか?

分類Dev

Python、Google検索結果でページを表示する方法は?

分類Dev

Sublime Text3で特殊文字を検索する方法

分類Dev

TwitterAPI検索でfull_textを取得する方法

分類Dev

javascriptを使用してブラウザにインストールされている検索エンジンのリストを取得できますか

分類Dev

JAVAGUIでGoogle検索スタイルに似た検索バーを作成する方法

分類Dev

データがウェブブラウザを介してGoogleChromeのサーバーに送信されているかどうかを確認する方法はありますか

分類Dev

opencvを使用してC ++サーバーから送信されたJavaクライアントでMatオブジェクトを作成します

分類Dev

Sparkを使用して、メモリ内で生成された.docxファイルをサーバーからクライアントに送信する

分類Dev

NodeJSサーバーでajaxによって送信された配列/オブジェクトを解析する方法

分類Dev

freadを使用してCのWebサーバーを使用してブラウザーに画像を表示するにはどうすればよいですか?

Related 関連記事

  1. 1

    javascriptを使用してユーザーから入力された文字列を文字列で検索する方法

  2. 2

    Webブラウザ内で統合検索/アドレスバーを使用する場合、入力したURLをブラウザに検索させるにはどうすればよいですか?

  3. 3

    XHRを介してblobデータをクライアントからNodeJSサーバーに送信します

  4. 4

    Flaskを使用してjqueryデータテーブルから送信されたサーバー側パラメータを処理する方法は?

  5. 5

    ブラウザが最初のWebサーバー応答を送信する前にJavascriptをサポートしているかどうかをサーバーサイドで検出するにはどうすればよいですか?

  6. 6

    FirefoxでOpenDNS検索の代わりにGoogle検索を使用する方法

  7. 7

    getUserMediaを使用して、ブラウザからnodejsサーバーにデータをストリーミングします

  8. 8

    ブラウザがOPTIONSリクエストを送信しても、Cookieがサーバーに送信されませんか?

  9. 9

    セレンウェブドライバーc#を使用して新規ユーザー登録のために入力されたemailidの受信ボックスに送信されるEメール検証リンクを自動化する方法

  10. 10

    node.jsを使用してサーバー側からブラウザーを更新するにはどうすればよいですか?

  11. 11

    jsonwebtokenがサーバーnodejsに保存されている場所。ユーザーがログアウトしたらJWTを期限切れにする方法

  12. 12

    Pythonを使用してウェブサイトの検索バーからデータを抽出するにはどうすればよいですか?

  13. 13

    jspまたはjavascriptを使用してサーバー上にあるブラウザでpdfを表示する方法

  14. 14

    Javascriptを使用してGoogle検索バーを選択する方法

  15. 15

    MediaRecorderからサーバーにチャンクを送信し、ブラウザーで再生します

  16. 16

    接続を開いている間、ブラウザからWebSocketサーバーにユーザーIDを送信します

  17. 17

    方法:ブラウザはJSONをサーバーに送信しますか?

  18. 18

    TCP / IP通信を使用して、ランダムに生成されたバイト配列をクライアントからサーバーに送信する

  19. 19

    アプリがバックグラウンドにある場合、fcmを使用してサーバーから送信されたデータを取得するにはどうすればよいですか?

  20. 20

    Python、Google検索結果でページを表示する方法は?

  21. 21

    Sublime Text3で特殊文字を検索する方法

  22. 22

    TwitterAPI検索でfull_textを取得する方法

  23. 23

    javascriptを使用してブラウザにインストールされている検索エンジンのリストを取得できますか

  24. 24

    JAVAGUIでGoogle検索スタイルに似た検索バーを作成する方法

  25. 25

    データがウェブブラウザを介してGoogleChromeのサーバーに送信されているかどうかを確認する方法はありますか

  26. 26

    opencvを使用してC ++サーバーから送信されたJavaクライアントでMatオブジェクトを作成します

  27. 27

    Sparkを使用して、メモリ内で生成された.docxファイルをサーバーからクライアントに送信する

  28. 28

    NodeJSサーバーでajaxによって送信された配列/オブジェクトを解析する方法

  29. 29

    freadを使用してCのWebサーバーを使用してブラウザーに画像を表示するにはどうすればよいですか?

ホットタグ

アーカイブ