Alan Tsai 的學習筆記


學而不思則罔,思而不學則殆,不思不學則“網貸” 為現任微軟最有價值專家 (MVP)、微軟認證講師 (MCT) 、Blogger、Youtuber:記錄軟體開發的點點滴滴 著重於微軟技術、C#、ASP .NET、Azure、DevOps、Docker、AI、Chatbot、Data Science

[chatbot + AI = 下一代操作模式][34]賦予Chatbot用語音下指令以及翻譯的功能

[chatbot + AI = 下一代操作模式][34]賦予Chatbot用語音下指令以及翻譯的功能.jpg
圖片來源:https://pixabay.com/en/books-spine-colors-pastel-1099067/ 

在上一篇([33]C#使用Translator Speech API服務達到語音轉文字加翻譯)瞭解了如何用C# Console使用Translator Speech Api的服務達到語音轉文字加翻譯。那麽要整合到Chatbot就更加沒有問題了。

這一篇將介紹如何把Translator Speech Api整合到Chatbot裡面,語音能夠轉文字就能夠達到用來叫Chatbot做事,并且提供一些多國語言的使用情景,例如不會說中文的客戶,可以透過chatbot達到及時語音翻譯。

這篇的程式碼github頁面是alantsai-samples/mhat-hotelbot:blog/chapter-34

Translator Speech Api整合到Chatbot

要整合到Chatbot和其他幾個有點類似,大概會經歷過幾個步奏:

  1. 建立Translator Speech Api的Service
  2. 建立Dialog處理語音邏輯
  3. 整合到RootLuisDialog
  4. 測試

建立Translator Speech Api的Service

這個Service代表著物件導向版本的TranslatorSpeechApi,方便呼叫服務。

整個邏輯和上一篇的Console裡面看到的邏輯差不多,這邊比較特別只是建立這個物件的時候需要注入服務的Key。

另外一個是建立出一個Model叫做:ResponseModel,用來接Translator Speech Api的結果。

詳細的程式碼就不發在部落格上面了,詳細請看 :mhat-hotelbot/src/MHAT.HotelBot/Services/TranslatorSpeechService.cs

建立Dialog處理語音邏輯

接下來要建立一個Dialog叫做SpeechTranslationDialog,這個Dialog的主要目的是把Bot Builder SDK得到的内容做處理,然後呼叫TranslatorSpeechService做語音轉文字和翻譯的處理。

這邊要注意一下,一般來説模擬器可以直接發語音做測試,但是可能是我電腦問題,兩個版本的模擬器都無法使用語音,因此我用了一個自定的格式,這個内容格式是:media@{語音檔案路徑}

因此,這邊的Dialog會用這個格式做處理,整個的邏輯如下:

[Serializable]
public class SpeechTranslationDialog : IDialog<List<ResponseModel>>
{
	public async Task StartAsync(IDialogContext context)
	{
		await context.PostAsync("請輸入:media@RecordMediaPath");

		context.Wait(MessageReceivedAsync);
	}

	private async Task MessageReceivedAsync
	   (IDialogContext context, 
		IAwaitable<IMessageActivity> inResult)
	{
		var activity =  context.Activity as IMessageActivity;

		var textSplit = activity.Text.Split('@');

		var mediaUrl = textSplit.Last();

		var tranlsatorService =
			new TranslatorSpeechService
				(ConfigurationManager
					.AppSettings["TranslatorSpeechApiKey"]);

		var result = await tranlsatorService
			.TranslateSpeech(mediaUrl);

		context.Done(result);
	}
}

整合到RootLuisDialog

接下來就是要把整個組合在一起了。

首先在luis.ai的網站加入一個intent叫做SpeechRecognizer,裡面有個utterance叫做語音,記得要train以及publish模型:

chrome_2018-08-16_22-46-30.png
luis模型訓練

接下來就是調整RootLuisDialog呼叫語音的dialog:

[LuisIntent("SpeechRecognizer")]
public Task SpeechRecognizer
	(IDialogContext context, LuisResult result)
{
	context.Call(new SpeechTranslationDialog(),
		SpeechRecognizerAfterAsync);

	return Task.CompletedTask;
}

private async Task SpeechRecognizerAfterAsync
	(IDialogContext context, IAwaitable<List<ResponseModel>> result)
{
	var finalResult = await result;

	await context.PostAsync($"識別:{finalResult.First().recognition}");
	await context.PostAsync($"翻譯:{finalResult.First().translation}");

	context.Wait(MessageReceived);
}

測試結果

接下來就是做測試的時候了,透過模擬器測試整個功能:

botframework-emulator_2018-08-16_22-24-19.png
測試功能

上圖使用的範例語音檔案就是上一篇的範例程式碼裡面用到的speak.wav檔案。

可以看到識別出文字并且翻譯和上一篇的console程式結果一致。

下一步調整

到這邊爲止也就是今天的全部内容,不過其實這邊的程式碼還有很多進步的空間,或者説有更多可以整合的地方,這邊列出來給大家未來使用上面做參考:

  1. 既然語音可以識別出文字了,那是否可以用語音的方式下指令,然後先透過語音轉文字,再用文字到luis判斷出intent然後在執行指令
  2. Translator Speech Api有限制語音格式,因此,應該要檢查好格式,必要時轉檔的邏輯整合進去

結語

這篇介紹了如何把Translator Speech Api整合進入了chatbot裡面。透過這個範例,可以瞭解如何實際整合運用,并且在最後面給出了一些未來要上production需要考慮到的地方。

到了這篇,這個系列就快要進入了尾聲,這系列把常見的自然輸入方式都介紹了一輪:

文字
透過LUIS來找到intent
圖像
用了圖像識別以及OCR的服務讓拍照的方式查找飲料費用以及發票識別。
語音
可以把語音轉成文字,達到語音下達指令的方式。以及語音直接從一個語言翻譯到另外一個語言提供更多元的功能。

Cognitive Service還有很多其他的服務,有些服務甚至是多個服務組合或者某個服務加强在產生出來的。在接下來的篇章將對其中幾個做介紹。

在下一篇([35]使用QnA Maker打造問答知識類型資料集服務)將介紹其中一個,QnA Maker,方便做知識庫類型的服務。


如果文章對您有幫助,就請我喝杯飲料吧
街口支付QR Code
街口支付QR Code
台灣 Pay QR Code
台灣 Pay QR Code
Line Pay 一卡通 QR Code
Line Pay 一卡通 QR Code
街口支付QR Code
支付寶QR Code
街口支付QR Code
微信支付QR Code
comments powered by Disqus