Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to Google Speech-to-Text using Blob sent from Browser to Nodejs Server

I am trying to set up a server to receive audio from a client browser using SocketIO, then process it through Google Speech-to-Text, and finally reply back to the client with the text.

Originally and ideally, I wanted to set up to function somewhat like the tool on this page: https://cloud.google.com/speech-to-text/

I tried using getUserMedia and streaming it through SocketIO-Stream, but I couldn't figure out how to 'pipe' MediaStream.

Instead, now I've decided to use MediaRecorder on the client side, and then send the data altogether as a blob(seen in this example).

I then apply toString('base64') to the blob and call google-cloud/speech's client.recognize() on the blob.

Client Side(i'm using 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)
                    }
                }
            }
        })

Server Side:

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)
    });
});




The log from the main() function in the Server side is always:

"Transcription: "

-- which is empty!

It should contain the text from the audio sent. Thank you in advance!

like image 841
Alitron Avatar asked Jun 05 '19 03:06

Alitron


People also ask

Is Google Text-to-Speech API free?

Text-to-Speech is priced based on the number of characters sent to the service to be synthesized into audio each month. You must enable billing to use Text-to-Speech, and will be automatically charged if your usage exceeds the number of free characters allowed per month.

How do I use Google Text-to-Speech offline?

You can activate this by going to Settings - Language and Input - Voice Input and touch the cog icon next to Enhanced Google Services. Choose "Offline Speech Recognition" and select the "All" tab to download your preferred language if it's not already installed.

Is Google speech to text open source?

All sessions are now available for viewing in our on-demand library. Click here to start watching. Google today open-sourced the speech engine that powers its Android speech recognition transcription tool Live Transcribe.


2 Answers

Your nodejs application asks for the processing of raw audio data, recorded as an array of 16-bit signed integers ('LINEAR16') at a rate if 16k samples/sec (16000) . This sort of audio representation is known as pulse-code modulation (PCM) for reasons lost in ancient telephony lore.

But the Blob you send from your client-side code is not that. It's a media object with the content-type audio/webm; codecs=opus. That means the audio track is compressed using the Opus codec and boxed (multiplexed) in the webm (Matroska, ebml) container format. The cloud text-to-speech code tries to interpret that as raw audio data, fails, throws up its hands and returns an empty transcription string. It's analogous to trying to view a zip file in a text editor: it's just gibberish.

To get text-to-speech to work with a media object, you have to extract the PCM audio from it first. This is a notorious pain in the neck to set up on a server; you have to use ffmpeg. There's a tutorial on it in the text-to-speech documentation. The tutorial mentions scraping the audio out of video files. Your Blob is, basically, a video file with no video track in it, so the same techniques work.

But, you'll be much better off returning to your first approach, using the MediaStream browser javascript APIs. In particular, your browser code should use elements of the Web Audio API to intercept the raw PCM audio data and send it to your server or directly from your browser to text-to-speech.

Explaining all this is way beyond the scope of a StackOverflow answer. Here are some hints. How to use web audio api to get raw pcm audio?

like image 95
O. Jones Avatar answered Sep 28 '22 12:09

O. Jones


The Google Text-To-Speech v1p1beta1 API end point supports MP3 files now. As O.Jones says, above MediaRecorder API is a good option, but now you can just get MP3 instead of raw PCM data, I found it difficult to implement the RecordRTC library with the intention of getting raw PCM because I ran into sound quality and cross-browser issues.

My solution: I used the mimeType audio/mp3 when creating my blob as such: const blob = new Blob(chunks, { 'type' : 'audio/mp3' }); Then I converted the blob to a base64 string like in this SO example. Then when you send an api call to Google's Speech-To-Text api, you have to specify the v1p1beta1 beta endpoint, as well as set the config as I have done in the cURL request below. Note that the default sampling rate for MediaRecorder is 16000Hz. An example CURL call could be the following (you must specify your api key):

curl --location --request POST 'https://speech.googleapis.com/v1p1beta1/speech:recognize?key=yourkey' \
--header 'Content-Type: application/json' \
--data-raw '{
  "config": {
      "encoding":"MP3",
      "sampleRateHertz": 16000,
      "languageCode": "en-US"
  },
  "audio": {
      "content":"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"
  }
}'

Also, this is working for me on Chrome, Firefox and Safari, but for Safari you must enable the MediaRecorder in Develop -> Experimental Features -> Media Recorder

like image 33
axme100 Avatar answered Sep 28 '22 12:09

axme100