打造我的聊天機器人!

系列一: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印在螢幕上。

詳細的範例程式可參考以下網址:

Like what you read? Give wesleyboy42 a round of applause.

From a quick cheer to a standing ovation, clap to show how much you enjoyed this story.