speech/recognize.js (670 lines of code) (raw):

// Copyright 2017 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. /** * This application demonstrates how to perform basic recognize operations with * with the Google Cloud Speech API. * * For more information, see the README.md under /speech and the documentation * at https://cloud.google.com/speech/docs. */ 'use strict'; async function syncRecognize( filename, encoding, sampleRateHertz, languageCode ) { // [START speech_transcribe_sync] // Imports the Google Cloud client library const fs = require('fs'); const speech = require('@google-cloud/speech'); // Creates a client const client = new speech.SpeechClient(); /** * TODO(developer): Uncomment the following lines before running the sample. */ // const filename = 'Local path to audio file, e.g. /path/to/audio.raw'; // const encoding = 'Encoding of the audio file, e.g. LINEAR16'; // const sampleRateHertz = 16000; // const languageCode = 'BCP-47 language code, e.g. en-US'; const config = { encoding: encoding, sampleRateHertz: sampleRateHertz, languageCode: languageCode, }; const audio = { content: fs.readFileSync(filename).toString('base64'), }; const request = { config: config, audio: audio, }; // Detects speech in the audio file const [response] = await client.recognize(request); const transcription = response.results .map(result => result.alternatives[0].transcript) .join('\n'); console.log('Transcription: ', transcription); // [END speech_transcribe_sync] } async function syncRecognizeGCS( gcsUri, encoding, sampleRateHertz, languageCode ) { // [START speech_transcribe_sync_gcs] // Imports the Google Cloud client library const speech = require('@google-cloud/speech'); // Creates a client const client = new speech.SpeechClient(); /** * TODO(developer): Uncomment the following lines before running the sample. */ // const gcsUri = 'gs://my-bucket/audio.raw'; // const encoding = 'Encoding of the audio file, e.g. LINEAR16'; // const sampleRateHertz = 16000; // const languageCode = 'BCP-47 language code, e.g. en-US'; const config = { encoding: encoding, sampleRateHertz: sampleRateHertz, languageCode: languageCode, }; const audio = { uri: gcsUri, }; const request = { config: config, audio: audio, }; // Detects speech in the audio file const [response] = await client.recognize(request); const transcription = response.results .map(result => result.alternatives[0].transcript) .join('\n'); console.log('Transcription: ', transcription); // [END speech_transcribe_sync_gcs] } async function syncRecognizeWords( filename, encoding, sampleRateHertz, languageCode ) { // [START speech_sync_recognize_words] // Imports the Google Cloud client library const fs = require('fs'); const speech = require('@google-cloud/speech'); // Creates a client const client = new speech.SpeechClient(); /** * TODO(developer): Uncomment the following lines before running the sample. */ // const filename = 'Local path to audio file, e.g. /path/to/audio.raw'; // const encoding = 'Encoding of the audio file, e.g. LINEAR16'; // const sampleRateHertz = 16000; // const languageCode = 'BCP-47 language code, e.g. en-US'; const config = { enableWordTimeOffsets: true, encoding: encoding, sampleRateHertz: sampleRateHertz, languageCode: languageCode, }; const audio = { content: fs.readFileSync(filename).toString('base64'), }; const request = { config: config, audio: audio, }; // Detects speech in the audio file const [response] = await client.recognize(request); response.results.forEach(result => { console.log('Transcription: ', result.alternatives[0].transcript); result.alternatives[0].words.forEach(wordInfo => { // NOTE: If you have a time offset exceeding 2^32 seconds, use the // wordInfo.{x}Time.seconds.high to calculate seconds. const startSecs = `${wordInfo.startTime.seconds}` + '.' + wordInfo.startTime.nanos / 100000000; const endSecs = `${wordInfo.endTime.seconds}` + '.' + wordInfo.endTime.nanos / 100000000; console.log(`Word: ${wordInfo.word}`); console.log(`\t ${startSecs} secs - ${endSecs} secs`); }); }); // [END speech_sync_recognize_words] } async function asyncRecognize( filename, encoding, sampleRateHertz, languageCode ) { // [START speech_transcribe_async] // Imports the Google Cloud client library const speech = require('@google-cloud/speech'); const fs = require('fs'); // Creates a client const client = new speech.SpeechClient(); /** * TODO(developer): Uncomment the following lines before running the sample. */ // const filename = 'Local path to audio file, e.g. /path/to/audio.raw'; // const encoding = 'Encoding of the audio file, e.g. LINEAR16'; // const sampleRateHertz = 16000; // const languageCode = 'BCP-47 language code, e.g. en-US'; const config = { encoding: encoding, sampleRateHertz: sampleRateHertz, languageCode: languageCode, }; /** * Note that transcription is limited to 60 seconds audio. * Use a GCS file for audio longer than 1 minute. */ const audio = { content: fs.readFileSync(filename).toString('base64'), }; const request = { config: config, audio: audio, }; // Detects speech in the audio file. This creates a recognition job that you // can wait for now, or get its result later. const [operation] = await client.longRunningRecognize(request); // Get a Promise representation of the final result of the job const [response] = await operation.promise(); const transcription = response.results .map(result => result.alternatives[0].transcript) .join('\n'); console.log(`Transcription: ${transcription}`); // [END speech_transcribe_async] } async function asyncRecognizeGCS( gcsUri, encoding, sampleRateHertz, languageCode ) { // [START speech_transcribe_async_gcs] // Imports the Google Cloud client library const speech = require('@google-cloud/speech'); // Creates a client const client = new speech.SpeechClient(); /** * TODO(developer): Uncomment the following lines before running the sample. */ // const gcsUri = 'gs://my-bucket/audio.raw'; // const encoding = 'Encoding of the audio file, e.g. LINEAR16'; // const sampleRateHertz = 16000; // const languageCode = 'BCP-47 language code, e.g. en-US'; const config = { encoding: encoding, sampleRateHertz: sampleRateHertz, languageCode: languageCode, }; const audio = { uri: gcsUri, }; const request = { config: config, audio: audio, }; // Detects speech in the audio file. This creates a recognition job that you // can wait for now, or get its result later. const [operation] = await client.longRunningRecognize(request); // Get a Promise representation of the final result of the job const [response] = await operation.promise(); const transcription = response.results .map(result => result.alternatives[0].transcript) .join('\n'); console.log(`Transcription: ${transcription}`); // [END speech_transcribe_async_gcs] } async function asyncRecognizeGCSWords( gcsUri, encoding, sampleRateHertz, languageCode ) { // [START speech_transcribe_async_word_time_offsets_gcs] // Imports the Google Cloud client library const speech = require('@google-cloud/speech'); // Creates a client const client = new speech.SpeechClient(); /** * TODO(developer): Uncomment the following lines before running the sample. */ // const gcsUri = 'gs://my-bucket/audio.raw'; // const encoding = 'Encoding of the audio file, e.g. LINEAR16'; // const sampleRateHertz = 16000; // const languageCode = 'BCP-47 language code, e.g. en-US'; const config = { enableWordTimeOffsets: true, encoding: encoding, sampleRateHertz: sampleRateHertz, languageCode: languageCode, }; const audio = { uri: gcsUri, }; const request = { config: config, audio: audio, }; // Detects speech in the audio file. This creates a recognition job that you // can wait for now, or get its result later. const [operation] = await client.longRunningRecognize(request); // Get a Promise representation of the final result of the job const [response] = await operation.promise(); response.results.forEach(result => { console.log(`Transcription: ${result.alternatives[0].transcript}`); result.alternatives[0].words.forEach(wordInfo => { // NOTE: If you have a time offset exceeding 2^32 seconds, use the // wordInfo.{x}Time.seconds.high to calculate seconds. const startSecs = `${wordInfo.startTime.seconds}` + '.' + wordInfo.startTime.nanos / 100000000; const endSecs = `${wordInfo.endTime.seconds}` + '.' + wordInfo.endTime.nanos / 100000000; console.log(`Word: ${wordInfo.word}`); console.log(`\t ${startSecs} secs - ${endSecs} secs`); }); }); // [END speech_transcribe_async_word_time_offsets_gcs] } async function streamingRecognize( filename, encoding, sampleRateHertz, languageCode ) { // [START speech_transcribe_streaming] const fs = require('fs'); // Imports the Google Cloud client library const speech = require('@google-cloud/speech'); // Creates a client const client = new speech.SpeechClient(); /** * TODO(developer): Uncomment the following lines before running the sample. */ // const filename = 'Local path to audio file, e.g. /path/to/audio.raw'; // const encoding = 'Encoding of the audio file, e.g. LINEAR16'; // const sampleRateHertz = 16000; // const languageCode = 'BCP-47 language code, e.g. en-US'; const request = { config: { encoding: encoding, sampleRateHertz: sampleRateHertz, languageCode: languageCode, }, interimResults: false, // If you want interim results, set this to true }; // Stream the audio to the Google Cloud Speech API const recognizeStream = client .streamingRecognize(request) .on('error', console.error) .on('data', data => { console.log( `Transcription: ${data.results[0].alternatives[0].transcript}` ); }); // Stream an audio file from disk to the Speech API, e.g. "./resources/audio.raw" fs.createReadStream(filename).pipe(recognizeStream); // [END speech_transcribe_streaming] } function streamingMicRecognize(encoding, sampleRateHertz, languageCode) { // [START speech_transcribe_streaming_mic] const recorder = require('node-record-lpcm16'); // Imports the Google Cloud client library const speech = require('@google-cloud/speech'); // Creates a client const client = new speech.SpeechClient(); /** * TODO(developer): Uncomment the following lines before running the sample. */ // const encoding = 'Encoding of the audio file, e.g. LINEAR16'; // const sampleRateHertz = 16000; // const languageCode = 'BCP-47 language code, e.g. en-US'; const request = { config: { encoding: encoding, sampleRateHertz: sampleRateHertz, languageCode: languageCode, }, interimResults: false, // If you want interim results, set this to true }; // Create a recognize stream const recognizeStream = client .streamingRecognize(request) .on('error', console.error) .on('data', data => process.stdout.write( data.results[0] && data.results[0].alternatives[0] ? `Transcription: ${data.results[0].alternatives[0].transcript}\n` : '\n\nReached transcription time limit, press Ctrl+C\n' ) ); // Start recording and send the microphone input to the Speech API. // Ensure SoX is installed, see https://www.npmjs.com/package/node-record-lpcm16#dependencies recorder .record({ sampleRateHertz: sampleRateHertz, threshold: 0, // Other options, see https://www.npmjs.com/package/node-record-lpcm16#options verbose: false, recordProgram: 'rec', // Try also "arecord" or "sox" silence: '10.0', }) .stream() .on('error', console.error) .pipe(recognizeStream); console.log('Listening, press Ctrl+C to stop.'); // [END speech_transcribe_streaming_mic] } async function syncRecognizeModelSelection( filename, model, encoding, sampleRateHertz, languageCode ) { // [START speech_transcribe_model_selection] // Imports the Google Cloud client library for Beta API /** * TODO(developer): Update client library import to use new * version of API when desired features become available */ const speech = require('@google-cloud/speech').v1p1beta1; const fs = require('fs'); // Creates a client const client = new speech.SpeechClient(); /** * TODO(developer): Uncomment the following lines before running the sample. */ // const filename = 'Local path to audio file, e.g. /path/to/audio.raw'; // const model = 'Model to use, e.g. phone_call, video, default'; // const encoding = 'Encoding of the audio file, e.g. LINEAR16'; // const sampleRateHertz = 16000; // const languageCode = 'BCP-47 language code, e.g. en-US'; const config = { encoding: encoding, sampleRateHertz: sampleRateHertz, languageCode: languageCode, model: model, }; const audio = { content: fs.readFileSync(filename).toString('base64'), }; const request = { config: config, audio: audio, }; // Detects speech in the audio file const [response] = await client.recognize(request); const transcription = response.results .map(result => result.alternatives[0].transcript) .join('\n'); console.log('Transcription: ', transcription); // [END speech_transcribe_model_selection] } async function syncRecognizeModelSelectionGCS( gcsUri, model, encoding, sampleRateHertz, languageCode ) { // [START speech_transcribe_model_selection_gcs] // Imports the Google Cloud client library for Beta API /** * TODO(developer): Update client library import to use new * version of API when desired features become available */ const speech = require('@google-cloud/speech').v1p1beta1; // Creates a client const client = new speech.SpeechClient(); /** * TODO(developer): Uncomment the following lines before running the sample. */ // const gcsUri = 'gs://my-bucket/audio.raw'; // const model = 'Model to use, e.g. phone_call, video, default'; // const encoding = 'Encoding of the audio file, e.g. LINEAR16'; // const sampleRateHertz = 16000; // const languageCode = 'BCP-47 language code, e.g. en-US'; const config = { encoding: encoding, sampleRateHertz: sampleRateHertz, languageCode: languageCode, model: model, }; const audio = { uri: gcsUri, }; const request = { config: config, audio: audio, }; // Detects speech in the audio file. const [response] = await client.recognize(request); const transcription = response.results .map(result => result.alternatives[0].transcript) .join('\n'); console.log('Transcription: ', transcription); // [END speech_transcribe_model_selection_gcs] } async function syncRecognizeWithAutoPunctuation( filename, encoding, sampleRateHertz, languageCode ) { // [START speech_transcribe_auto_punctuation] // Imports the Google Cloud client library for API /** * TODO(developer): Update client library import to use new * version of API when desired features become available */ const speech = require('@google-cloud/speech'); const fs = require('fs'); // Creates a client const client = new speech.SpeechClient(); /** * TODO(developer): Uncomment the following lines before running the sample. * Include the sampleRateHertz field in the config object. */ // const filename = 'Local path to audio file, e.g. /path/to/audio.raw'; // const encoding = 'Encoding of the audio file, e.g. LINEAR16'; // const sampleRateHertz = 16000; // const languageCode = 'BCP-47 language code, e.g. en-US'; const config = { encoding: encoding, languageCode: languageCode, enableAutomaticPunctuation: true, }; const audio = { content: fs.readFileSync(filename).toString('base64'), }; const request = { config: config, audio: audio, }; // Detects speech in the audio file const [response] = await client.recognize(request); const transcription = response.results .map(result => result.alternatives[0].transcript) .join('\n'); console.log('Transcription: ', transcription); // [END speech_transcribe_auto_punctuation] } async function syncRecognizeWithEnhancedModel( filename, encoding, sampleRateHertz, languageCode ) { // [START speech_transcribe_enhanced_model] // Imports the Google Cloud client library for Beta API /** * TODO(developer): Update client library import to use new * version of API when desired features become available */ const speech = require('@google-cloud/speech').v1p1beta1; const fs = require('fs'); // Creates a client const client = new speech.SpeechClient(); /** * TODO(developer): Uncomment the following lines before running the sample. */ // const filename = 'Local path to audio file, e.g. /path/to/audio.raw'; // const encoding = 'Encoding of the audio file, e.g. LINEAR16'; // const sampleRateHertz = 16000; // const languageCode = 'BCP-47 language code, e.g. en-US'; const config = { encoding: encoding, languageCode: languageCode, useEnhanced: true, model: 'phone_call', }; const audio = { content: fs.readFileSync(filename).toString('base64'), }; const request = { config: config, audio: audio, }; // Detects speech in the audio file const [response] = await client.recognize(request); response.results.forEach(result => { const alternative = result.alternatives[0]; console.log(alternative.transcript); }); // [END speech_transcribe_enhanced_model] } async function syncRecognizeWithMultiChannel(fileName) { // [START speech_transcribe_multichannel] const fs = require('fs'); // Imports the Google Cloud client library const speech = require('@google-cloud/speech').v1; // Creates a client const client = new speech.SpeechClient(); /** * TODO(developer): Uncomment the following lines before running the sample. */ // const fileName = 'Local path to audio file, e.g. /path/to/audio.raw'; const config = { encoding: 'LINEAR16', languageCode: 'en-US', audioChannelCount: 2, enableSeparateRecognitionPerChannel: true, }; const audio = { content: fs.readFileSync(fileName).toString('base64'), }; const request = { config: config, audio: audio, }; const [response] = await client.recognize(request); const transcription = response.results .map( result => ` Channel Tag: ${result.channelTag} ${result.alternatives[0].transcript}` ) .join('\n'); console.log(`Transcription: \n${transcription}`); // [END speech_transcribe_multichannel] } async function syncRecognizeWithMultiChannelGCS(gcsUri) { // [START speech_transcribe_multichannel_gcs] const speech = require('@google-cloud/speech').v1; // Creates a client const client = new speech.SpeechClient(); const config = { encoding: 'LINEAR16', languageCode: 'en-US', audioChannelCount: 2, enableSeparateRecognitionPerChannel: true, }; const audio = { uri: gcsUri, }; const request = { config: config, audio: audio, }; const [response] = await client.recognize(request); const transcription = response.results .map( result => ` Channel Tag: ${result.channelTag} ${result.alternatives[0].transcript}` ) .join('\n'); console.log(`Transcription: \n${transcription}`); // [END speech_transcribe_multichannel_gcs] } async function speechTranscribeDiarization(fileName) { // [START speech_transcribe_diarization] const fs = require('fs'); // Imports the Google Cloud client library const speech = require('@google-cloud/speech'); // Creates a client const client = new speech.SpeechClient(); // Set config for Diarization const diarizationConfig = { enableSpeakerDiarization: true, maxSpeakerCount: 2, }; const config = { encoding: 'LINEAR16', sampleRateHertz: 8000, languageCode: 'en-US', diarizationConfig: diarizationConfig, model: 'phone_call', }; /** * TODO(developer): Uncomment the following lines before running the sample. */ // const fileName = 'Local path to audio file, e.g. /path/to/audio.raw'; const audio = { content: fs.readFileSync(fileName).toString('base64'), }; const request = { config: config, audio: audio, }; const [response] = await client.recognize(request); const transcription = response.results .map(result => result.alternatives[0].transcript) .join('\n'); console.log(`Transcription: ${transcription}`); console.log('Speaker Diarization:'); const result = response.results[response.results.length - 1]; const wordsInfo = result.alternatives[0].words; // Note: The transcript within each result is separate and sequential per result. // However, the words list within an alternative includes all the words // from all the results thus far. Thus, to get all the words with speaker // tags, you only have to take the words list from the last result: wordsInfo.forEach(a => console.log(` word: ${a.word}, speakerTag: ${a.speakerTag}`) ); // [END speech_transcribe_diarization] } require(`yargs`) // eslint-disable-line .demand(1) .command( 'sync <filename>', 'Detects speech in a local audio file.', {}, opts => syncRecognize( opts.filename, opts.encoding, opts.sampleRateHertz, opts.languageCode ) ) .command( 'sync-gcs <gcsUri>', 'Detects speech in an audio file located in a Google Cloud Storage bucket.', {}, opts => syncRecognizeGCS( opts.gcsUri, opts.encoding, opts.sampleRateHertz, opts.languageCode ) ) .command( 'sync-words <filename>', 'Detects speech in a local audio file with word time offset.', {}, opts => syncRecognizeWords( opts.filename, opts.encoding, opts.sampleRateHertz, opts.languageCode ) ) .command( 'async <filename>', 'Creates a job to detect speech in a local audio file, and waits for the job to complete.', {}, opts => asyncRecognize( opts.filename, opts.encoding, opts.sampleRateHertz, opts.languageCode ) ) .command( 'async-gcs <gcsUri>', 'Creates a job to detect speech in an audio file located in a Google Cloud Storage bucket, and waits for the job to complete.', {}, opts => asyncRecognizeGCS( opts.gcsUri, opts.encoding, opts.sampleRateHertz, opts.languageCode ) ) .command( 'async-gcs-words <gcsUri>', 'Creates a job to detect speech with word time offset in an audio file located in a Google Cloud Storage bucket, and waits for the job to complete.', {}, opts => asyncRecognizeGCSWords( opts.gcsUri, opts.encoding, opts.sampleRateHertz, opts.languageCode ) ) .command( 'stream <filename>', 'Detects speech in a local audio file by streaming it to the Speech API.', {}, opts => streamingRecognize( opts.filename, opts.encoding, opts.sampleRateHertz, opts.languageCode ) ) .command( 'listen', 'Detects speech in a microphone input stream. This command requires that you have SoX installed and available in your $PATH. See https://www.npmjs.com/package/node-record-lpcm16#dependencies', {}, opts => streamingMicRecognize( opts.encoding, opts.sampleRateHertz, opts.languageCode ) ) .command( 'sync-model <filename> <model>', 'Detects speech in a local audio file using provided model.', {}, opts => syncRecognizeModelSelection( opts.filename, opts.model, opts.encoding, opts.sampleRateHertz, opts.languageCode ) ) .command( 'sync-model-gcs <gcsUri> <model>', 'Detects speech in an audio file located in a Google Cloud Storage bucket using provided model.', {}, opts => syncRecognizeModelSelectionGCS( opts.gcsUri, opts.model, opts.encoding, opts.sampleRateHertz, opts.languageCode ) ) .command( 'sync-auto-punctuation <filename>', 'Detects speech in a local audio file with auto punctuation.', {}, opts => syncRecognizeWithAutoPunctuation( opts.filename, opts.encoding, opts.sampleRateHertz, opts.languageCode ) ) .command( 'sync-enhanced-model <filename>', 'Detects speech in a local audio file using an enhanced model.', {}, opts => syncRecognizeWithEnhancedModel( opts.filename, opts.encoding, opts.sampleRateHertz, opts.languageCode ) ) .command( 'sync-multi-channel <filename>', 'Differentiates input by audio channel in local audio file.', {}, opts => syncRecognizeWithMultiChannel( opts.filename, opts.encoding, opts.sampleRateHertz, opts.languageCode ) ) .command( 'sync-multi-channel-gcs <gcsUri>', 'Differentiates input by audio channel in an audio file located in a Google Cloud Storage bucket.', {}, opts => syncRecognizeWithMultiChannelGCS( opts.gcsUri, opts.encoding, opts.sampleRateHertz, opts.languageCode ) ) .command( 'Diarization', 'Isolate distinct speakers in an audio file', {}, opts => speechTranscribeDiarization(opts.speechFile) ) .options({ encoding: { alias: 'e', default: 'LINEAR16', global: true, requiresArg: true, type: 'string', }, sampleRateHertz: { alias: 'r', default: 16000, global: true, requiresArg: true, type: 'number', }, languageCode: { alias: 'l', default: 'en-US', global: true, requiresArg: true, type: 'string', }, speechFile: { alias: 'f', global: true, requiresArg: false, type: 'string', }, }) .example('node $0 sync ./resources/audio.raw -e LINEAR16 -r 16000') .example('node $0 async-gcs gs://gcs-test-data/vr.flac -e FLAC -r 16000') .example('node $0 stream ./resources/audio.raw -e LINEAR16 -r 16000') .example('node $0 listen') .example( 'node $0 sync-model ./resources/Google_Gnome.wav video -e LINEAR16 -r 16000' ) .example( 'node $0 sync-model-gcs gs://gcs-test-data/Google_Gnome.wav phone_call -e LINEAR16 -r 16000' ) .example('node $0 sync-auto-punctuation ./resources/commercial_mono.wav') .example('node $0 sync-enhanced-model ./resources/commercial_mono.wav') .example('node $0 sync-multi-channel ./resources/commercial_stereo.wav') .wrap(120) .recommendCommands() .epilogue('For more information, see https://cloud.google.com/speech/docs') .help() .strict().argv;