|  | 
|  | 1 | +// Adapted from other examples | 
|  | 2 | +// Copyright (c) 2019 IBM | 
|  | 3 | +// | 
|  | 4 | +// This creates a redis list with the latest words picked up by watson speech to text | 
|  | 5 | +// This is a great starting out point for microservices reacting to live speech data | 
|  | 6 | +// Note: This deletes and populates the redis list multiple times a second, you may wish | 
|  | 7 | +// to optimize that out depending on your use case. | 
|  | 8 | +// | 
|  | 9 | +// IBM Cloud Redis: https://www.ibm.com/cloud/databases-for-redis | 
|  | 10 | +// | 
|  | 11 | +// set environment variables: SPEECH_TO_TEXT_IAM_APIKEY and REDIS_CONN_URL | 
|  | 12 | + | 
|  | 13 | +'use strict'; | 
|  | 14 | +var BUFFER_LENGTH = 100; | 
|  | 15 | + | 
|  | 16 | +var REDIS_CONN_URL = process.env.REDIS_CONN_URL; | 
|  | 17 | +var Redis = require('ioredis'); | 
|  | 18 | + | 
|  | 19 | +require('dotenv').config({ silent: true }); // optional, handy for local development | 
|  | 20 | +var SpeechToText = require('ibm-watson/speech-to-text/v1'); | 
|  | 21 | +// var LineIn = require('line-in'); // the `mic` package also works - it's more flexible but requires a bit more setup | 
|  | 22 | +var mic = require('mic'); | 
|  | 23 | +var wav = require('wav'); | 
|  | 24 | + | 
|  | 25 | +var speechToText = new SpeechToText({ | 
|  | 26 | +  // pick up SPEECH_TO_TEXT_IAM_APIKEY env variable here | 
|  | 27 | +}); | 
|  | 28 | + | 
|  | 29 | +// connect to "DB" | 
|  | 30 | +var redis = new Redis(REDIS_CONN_URL); | 
|  | 31 | + | 
|  | 32 | +// init buffer | 
|  | 33 | +redis.del('speech-to-text-buffer'); | 
|  | 34 | +for (var i = 0; i < BUFFER_LENGTH; i++) { | 
|  | 35 | +  redis.lpush('speech-to-text-buffer', 'init'); | 
|  | 36 | +} | 
|  | 37 | + | 
|  | 38 | +// var lineIn = new LineIn(); // 2-channel 16-bit little-endian signed integer pcm encoded audio @ 44100 Hz | 
|  | 39 | +var micInstance = mic({ | 
|  | 40 | +  rate: '48000', | 
|  | 41 | +  channels: '1', | 
|  | 42 | +  debug: false, | 
|  | 43 | +}); | 
|  | 44 | + | 
|  | 45 | +var micInputStream = micInstance.getAudioStream(); | 
|  | 46 | + | 
|  | 47 | +var wavStream = new wav.Writer({ | 
|  | 48 | +  sampleRate: 44100, | 
|  | 49 | +  channels: 2, | 
|  | 50 | +}); | 
|  | 51 | + | 
|  | 52 | +var recognizeStream = speechToText.recognizeUsingWebSocket({ | 
|  | 53 | +  content_type: 'audio/wav', | 
|  | 54 | +  interim_results: true, | 
|  | 55 | +  inactivity_timeout: -1, | 
|  | 56 | +  objectMode: true, | 
|  | 57 | +  max_alternatives: 1, | 
|  | 58 | +  word_alternatives_threshold: 0.9, | 
|  | 59 | +  speaker_labels: true, | 
|  | 60 | +}); | 
|  | 61 | + | 
|  | 62 | +// lineIn.pipe(wavStream); | 
|  | 63 | +micInputStream.pipe(wavStream); | 
|  | 64 | + | 
|  | 65 | +wavStream.pipe(recognizeStream); | 
|  | 66 | + | 
|  | 67 | +// recognizeStream.pipe(process.stdout); | 
|  | 68 | +recognizeStream.on('data', function(message) { | 
|  | 69 | +  console.log(message); | 
|  | 70 | + | 
|  | 71 | +  try { | 
|  | 72 | +    var transcript = message.results[0].alternatives[0].transcript; | 
|  | 73 | +    console.log(transcript); | 
|  | 74 | +    redis.del('speech-to-text-buffer'); | 
|  | 75 | +    transcript.split(' ').forEach(function(word) { | 
|  | 76 | +      // console.log(word); | 
|  | 77 | +      // redis.rpop('speech-to-text-buffer'); | 
|  | 78 | +      redis.rpush('speech-to-text-buffer', word); | 
|  | 79 | +    }); | 
|  | 80 | +  } catch (error) { | 
|  | 81 | +    console.log(error); | 
|  | 82 | +  } | 
|  | 83 | +}); | 
|  | 84 | + | 
|  | 85 | +console.log('Recording, press any key to exit'); | 
|  | 86 | + | 
|  | 87 | +micInstance.start(); | 
0 commit comments