打造我的聊天機器人!
系列一:IBM Watson 語音轉文字服務(Speech to Text)
本文將會介紹怎麼從系統收音並傳送到 IBM Watson 的語音轉文字服務,在開始之前,要先快速帶大家開通 Watson 語音轉文字服務。
首先先登入 IBM Bluemix 平台,如果沒有就先註冊一個:
登入後點選型錄頁面,並在搜尋區塊輸入:語言,接下來就會看到語音轉文字的圖示,點一下圖示就可以準備新增服務。
點選後會進入說明頁,基本上就全都預設,直接按下建立按鈕就好。
按下建立後,需要等個幾分鐘才會看到以下頁面,IBM Bluemix將會花一段時間準備。
要先確定上面說明頁出現後再點選服務認證,因為沒準備好前是無法產生服務認證的。
服務準備好後,預設會改一組服務認證,通常就用這組就好,不管怎麼新增,帳號密碼都還是一樣難記。
接下來將會使用這組 password 和 username 來進入到今天的主題了。
在開始撰寫程式之前,要先感謝我朋友 Fred Chien 提供的純 JS 轉檔模組(wav_stream.js),可先到以下網址下載:
在今天的程式中將會分成四個部分:
- 麥克風收音
- 收音結果轉成wav
- 初始化Watson服務
- 將wav資料上傳到Watson
麥克風收音
首先用npm install安裝 mic 模組,安裝完後照以下設定就能建立完收音部分:
var mic = require('mic');var micInstance = mic({
'rate': '16000',
'channels': '1',
'debug': false,
'exitOnSilence': 6
});var micInputStream = micInstance.getAudioStream()
以上設定是指取樣頻率(sampling rate)為16000Hz,單聲道,不用debug訊息,最後一個exitOnSilence的意思是聲音取樣多少回仍然沒聲音的話,就觸發Silence事件。
micInputStream物件則是會一直接收到麥克風的音訊資料。
聲音轉檔
剛下載的轉檔模組(wav_stream.js)可以放在lib資料夾中,接下來只要定義聲道數目和取樣頻率就完成了:
var WavStream = require('./lib/wav_stream');var pcm2wav = new WavStream({
channels: 1,
sampleRate: 16000
});
建立 Watson 物件
IBM Watson Developer Cloud團隊開發了一套watson-developer-cloud模組,只要只用npm install就可以安裝了:
var watson = require('watson-developer-cloud');var speech_to_text = watson.speech_to_text({
username: 'e19d8ae4–00ad-4300-a660–6d2ee29d79e3',
password: 'mC1KpDzeuDHU',
version: 'v1'
});var watson_params = {
content_type: 'audio/wav; rate=44100',
model: 'zh-CN_BroadbandModel',
continuous: true,
max_alternatives: 10
};var stt = speech_to_text.createRecognizeStream(watson_params);
stt.setEncoding('utf8');
watson-developer-cloud模組有支援許多watson服務,在本文只有先用到speech to text(stt),其中username和password欄位指的是一開始建立的語言轉文字服務。
上傳音訊資料到 Watson
micInputStream 物件收到聲音之後,當然要傳到轉檔物件 pcm2wav,所以以下將使用 pipe 把音訊資料傳給 pcm2wav。
pcm2wav 轉檔處理完之後,最後就是要送到 Waston 的語音轉文字服務(stt),這邊一樣透過 pipe 的方式把音訊資料傳給stt。
pcm2wav.pipe(stt);
micInputStream.pipe(pcm2wav);stt.on('results', function(data) {
console.log('data:' + JSON.stringify(data));
});micInstance.start();
最後micInstance.start()則是代表開始從麥克風收音。
如果Watson處理完音訊資料後,會有results的事件,本文就先不處理,僅僅就先用console.log印在螢幕上。
詳細的範例程式可參考以下網址: