[Cognitive] 使用Cognitive Service APIs的服務,進行語音辨識成文字的功能

Microsoft Azure日前推出了Cognitive Service APIs的服務,其中包括了Bing Speech API,這一個API可以將輸入的語音內容(wav檔),辨識成文字內容
本篇文章會說明如何使用Bing Speech API來進行辨識的功能

要使用Bing Speech API,必須先到Azure上建立一個Cognitive Service APIs的服務

點選建立Cognitive Service APIs的服務後,請在API type的地方,選擇[Bing Speech API]

建立完成後,請到這一個Bing Speech API的功能中,取得金鑰資訊,這個金鑰內容之後會用到

接著,請到下面GitHub的網址,下載有關Speech的程式碼
https://github.com/Microsoft/ProjectOxford-ClientSDK/tree/master/Speech

GitHub下載的程式碼中,包含了四種不同的平台,分別是Web、Windows、Android以及iOS的部份
而Windows的平台,官方提供的程式碼是採用WPF的方式作編寫

雖然官方程式是用WPF的方式寫,但是相同的Speech套件也可以用在Web Application以及Desktop Windows Application之中,但是可攜式的UWP套件或是跨平台套件無法使用

我們先把Windows平台的程式碼開啟後,重新編譯並執行它
開啟程式後,請先在右上方輸入剛剛記錄下來的金鑰值

語音辨識的方式,一共有兩種,分別是短語句與長語句兩種方式可以進行辨識,當按下下方的"Start Recognition",就可以開始對著麥克風說要辨識的話

在這裡有幾點需要特別說明的,在程式碼之中,需要設定辨識的語系,預設是en-US,若是想辨識中文的話,只要更改為zh-TW就可以了

在程式碼中,程式的執行方式是建立一個"DataRecognitionClient"物件,並加上一個OnResponseReceived的事件,作為辨識完成後的訊息回傳接收的事件,所以簡單來講,程式碼的內容大概就是如下面所示

DataRecognitionClient dataClient;

public Init()
{
    dataClient = SpeechRecognitionServiceFactory.CreateDataClient(SpeechRecognitionMode.ShortPhrase, "en-US", "[Key值]", "[Key值]");
    dataClient.OnResponseReceived += OnMicShortPhraseResponseReceivedHandler;
}

private void StartRecogntion()
{
    using (FileStream CommandStream = File.Open("[選擇要進行語音辨識的wav檔]", FileMode.Open, FileAccess.Read))
    {
        int bytesRead = 0;
        byte[] buffer = new byte[1024];

        try
        {
            do
            {
                bytesRead = CommandStream.Read(buffer, 0, buffer.Length);
                this.dataClient.SendAudio(buffer, bytesRead);
            }
            while (bytesRead > 0);
        }
        finally
        {
            this.dataClient.EndAudio();
        }
    }
}

/// <summary>
/// Called when a final response is received;
/// </summary>
/// <param name="sender">The sender.</param>
/// <param name="e">The <see cref="SpeechResponseEventArgs"/> instance containing the event data.</param>
private void OnMicShortPhraseResponseReceivedHandler(object sender, SpeechResponseEventArgs e)
{
    if (e.PhraseResponse.Results.Length == 0)
    {
        this.WriteLine("找不到辨識的結果");
    }
    else
    {
        this.WriteLine("********* 找到的辨識結果如下 *********");
        for (int i = 0; i < e.PhraseResponse.Results.Length; i++)
        {
            this.WriteLine(
                "[{0}] Confidence={1}, Text=\"{2}\"",
                i,
                e.PhraseResponse.Results[i].Confidence,
                e.PhraseResponse.Results[i].DisplayText);
        }
    }
}

只要這幾段程式碼就可以進行語音辨識了

別忘了專案要參考Speech的Nuget套件,x86與x64都建議加入至專案中
目前Bing Speech API只支援WAV檔,其他檔案如mp3、mp4,3gp等,還無法支援
所以讀取非wav格式的檔案,在dataClient.SendAudio時,會發生無法讀入的狀況,這點請注意
wav格式的檔案,Rate值必須為8000或是16000,不然辨識上會有問題

參考資料
Bing Speech Recognition API Overview
Speech Recognition