close

今天要來跟大家講要如何在rpi的子上面實現讓機器人可以聽的懂人話的stt 也就是speak to text

今天就直接進入我們的node.js程式碼!

 

讓我們看看以下程式碼


var mic;
 mic = cp.spawn('arecord', ['--device=plughw:0,0', '--format=S16_LE', '--rate=44100', '--channels=1']); //, '--duration=10'
 mic.stderr.pipe(process.stderr);
 stt();
 
 function stt() {
	console.log("openCMDS");
	var speech_to_text = watson.speech_to_text({
	username: '',
	password: '', 
	version: 'v1'
	});


	var params = {
	content_type: 'audio/wav',
	model: 'zh-CN_BroadbandModel',
	continuous: true,
	inactivity_timeout: -1
	};

	recognizeStream = speech_to_text.createRecognizeStream(params);//創建stream辨識
    mic.stdout.pipe(recognizeStream);//將mic音訊pipe至recognizetream
	recognizeStream.setEncoding('utf8'); 
	console.log("start record");
	recognizeStream.on('results',  function(data){//如果有結果則進入
	
	if(data.results[0] && data.results[0].final && data.results[0].alternatives){//如果是最後結果則進入
			
		console.log(JSON.stringify(data, null, 2));//印出結果
		
    }
 });

}


good!

讓我來好好為大家解說

在最上面的的mic就是我們要將音源導入的裝置

我們必須要spawn一個麥克風出來

這邊用到的是RPI 的 command line 後面是一些麥克風的參數

如果對於一些麥克風的採樣率.....想要改變的話就是從這裡做調整喔!

 

接下來就是要給這個stt的服務申請帳號以及密碼了

上次應該教大家辦完帳號了

這次呢直接到Bluemix平台中的型錄

找尋這個

然後創建之後去憑證那邊得到自己的帳號密碼

填上去就可以囉~

content_type: 'audio/wav',

代表上傳上去的檔案類型

我們defult是使用wav如果大家有想要的使用的類型

  • audio/flac
  • audio/l16
  • audio/wav

這三個任君挑選!!

model: 'zh-CN_BroadbandModel',

這個則是選擇語言的類型

如果沒有這行的話對defult成英文

語言的類別還有很多下列

  • en-US_BroadbandModel
  • en-US_NarrowbandModel
  • es-ES_BroadbandModel
  • es-ES_NarrowbandModel
  • ja-JP_BroadbandModel
  • ja-JP_NarrowbandModel

 

當初小編我也是去網路上找才找到中文的參數QQ

想要其他語言大家可能要去找找看XDD

 

continuous: true,這個的意思是有沒有要連續的結果

如果是false的話

結果會自動在你每一次中斷講話的時候將結果回傳

我們這邊使用true

他會將結果串接起來送回來給我們

inactivity_timeout: -1

這個是代表你的麥克風閒置時間超過某一個時間的話要不要停止辨識

我們這邊用-1代表不會結束

 

recognizeStream = speech_to_text.createRecognizeStream(params);

這裡就是將這個辨識的物件創造出來

 mic.stdout.pipe(recognizeStream);//將mic音訊pipe至recognizetream

接下來我們只要去on results就可以了!!

if(data.results[0] && data.results[0].final && data.results[0].alternatives){

這個的意思是

因為我們使用串流輸入

所以他在接收到我們麥克風所傳進的資訊時

他會不斷的使用上下文來辨識所有可能性

代表說前面辨識出來的文字可能會因為後面的結果而改變

所以它是一個不斷在變換的結果

而這個if所要拿到的結果就是最後一次

每個結果都已經確認下來的結果~

接著只要把值印出來就好囉~

 

而這邊我們就可以使用我們上一篇所交到iot服務

把我們的結果送上node red做更多的應用囉!

 

 

 

 

 

arrow
arrow

    C牛(norman kung) 發表在 痞客邦 留言(0) 人氣()