官網
https://azure.microsoft.com/zh-cn/services/cognitive-services/speech-services/

先使用七天免費的認知服務

然后會獲得兩個密鑰,在開發時會用到密鑰,這兩個密鑰用哪個都可以
然后進入正式開發
首先引入包
install-package Microsoft.CognitiveServices.Speech
引入之后,打開配置管理器

活動解決方案平台 新建

64位系統的選x64,32位系統的選x86,然后確定

確定下項目的平台都是x64(x86),因為微軟的語音識別無法在any cpu上運行,不更改平台運行就會報錯

接下來就可以開始寫代碼了
首先創建識別器對象
//創建配置對象 參數1是服務訂閱的密匙,參數2是訂閱關聯的區域(免費試用版區域都是westus) var config = SpeechConfig.FromSubscription("密匙", "區域"); //識別的語言設為中文 config.SpeechRecognitionLanguage = "zh-CN"; // 創建識別器對象. using (var recognizer = new SpeechRecognizer(config)) { }
單次識別,只識別一段話並返回結果
//開始錄入,並返回結果 var result = await recognizer.RecognizeOnceAsync();
返回的結果,具有幾種狀態
if (result.Reason == ResultReason.RecognizedSpeech)//語音識別成功 { Console.WriteLine($"接到的語音為: {result.Text}"); } else if (result.Reason == ResultReason.NoMatch)//未識別到語音 { Console.WriteLine($"沒有識別到語音"); } else if (result.Reason == ResultReason.Canceled)//取消識別 { var cancellation = CancellationDetails.FromResult(result); Console.WriteLine($"CANCELED: Reason={cancellation.Reason}"); if (cancellation.Reason == CancellationReason.Error)//識別出錯 { Console.WriteLine($"CANCELED: ErrorCode={cancellation.ErrorCode}"); Console.WriteLine($"CANCELED: ErrorDetails={cancellation.ErrorDetails}"); Console.WriteLine($"CANCELED: Did you update the subscription info?"); } }
這就是簡單的單次識別,下面是完整代碼
/// <summary> /// 普通識別語音 /// </summary> /// <returns></returns> public static async Task RecognizeSpeechAsync() { //創建配置對象 參數1是服務訂閱的密匙,參數2是訂閱關聯的區域(免費試用版區域都是westus) var config = SpeechConfig.FromSubscription("密匙", "區域"); //識別的語言設為中文 config.SpeechRecognitionLanguage = "zh-CN"; // 創建識別器對象. using (var recognizer = new SpeechRecognizer(config)) { Console.WriteLine("請說一句話..."); //開始錄入,並返回結果 var result = await recognizer.RecognizeOnceAsync(); if (result.Reason == ResultReason.RecognizedSpeech)//語音識別成功 { Console.WriteLine($"接到的語音為: {result.Text}"); } else if (result.Reason == ResultReason.NoMatch)//未識別到語音 { Console.WriteLine($"沒有識別到語音"); } else if (result.Reason == ResultReason.Canceled)//取消識別 { var cancellation = CancellationDetails.FromResult(result); Console.WriteLine($"CANCELED: Reason={cancellation.Reason}"); if (cancellation.Reason == CancellationReason.Error)//識別出錯 { Console.WriteLine($"CANCELED: ErrorCode={cancellation.ErrorCode}"); Console.WriteLine($"CANCELED: ErrorDetails={cancellation.ErrorDetails}"); Console.WriteLine($"CANCELED: Did you update the subscription info?"); } } } }
接下來是識別語音文件
需要創建一個音頻文件的配置對象,然后把對象傳給識別器對象
//讀取要識別的語音文件 using (var audioInput = AudioConfig.FromWavFileInput(fullpath)) { //創建識別器對象 using (var recognizer = new SpeechRecognizer(config, audioInput)) { } }
識別文件是需要持續識別的,所以不能用上面的單次識別方法了
持續識別
// 開始連續識別 await recognizer.StartContinuousRecognitionAsync().ConfigureAwait(false); // 結束持續識別 await recognizer.StopContinuousRecognitionAsync().ConfigureAwait(false);
持續識別是有幾個事件的
識別開始和結束時執行
//開始時執行 recognizer.SessionStarted += (s, e) => { Console.WriteLine("\n 開始識別."); }; //結束時執行 recognizer.SessionStopped += (s, e) => { Console.WriteLine("\n 識別結束."); };
識別中,識別完成,識別取消時執行
// 識別中 (每識別一個詞都會執行一次) recognizer.Recognizing += (s, e) => { Console.WriteLine($"識別中:{e.Result.Text}"); }; // 識別完成后 (整段語音識別完成后會執行一次) recognizer.Recognized += (s, e) => { if (e.Result.Reason == ResultReason.RecognizedSpeech) //識別成功 { Console.WriteLine($"識別完成: {e.Result.Text}"); } else if (e.Result.Reason == ResultReason.NoMatch)//未識別到語音 { Console.WriteLine($"沒有識別到語音"); } }; //識別取消時執行 recognizer.Canceled += (s, e) => { Console.WriteLine($"取消識別: Reason={e.Reason}"); if (e.Reason == CancellationReason.Error) { Console.WriteLine($"CANCELED: ErrorCode={e.ErrorCode}"); Console.WriteLine($"CANCELED: ErrorDetails={e.ErrorDetails}"); Console.WriteLine($"CANCELED: Did you update the subscription info?"); } };
下面是完整代碼
/// <summary> /// 識別文件中的語音 /// </summary> /// <returns></returns> public static async Task RecognizeFileAsync() { try { //創建配置對象 參數1是服務訂閱的密匙,參數2是訂閱關聯的區域(免費試用版區域都是westus) var config = SpeechConfig.FromSubscription("密匙", "區域"); //創建一個異步任務數組 var stopRecognition = new TaskCompletionSource<int>(); //相對路徑轉絕對路徑 string fullpath = Path.GetFullPath(@"./whatstheweatherlike.wav"); //讀取要識別的語音文件 using (var audioInput = AudioConfig.FromWavFileInput(fullpath)) { //創建識別器對象 using (var recognizer = new SpeechRecognizer(config, audioInput)) { // 識別中 (每識別一個詞都會執行一次) recognizer.Recognizing += (s, e) => { Console.WriteLine($"識別中:{e.Result.Text}"); }; // 識別完成后 (整段語音識別完成后會執行一次) recognizer.Recognized += (s, e) => { if (e.Result.Reason == ResultReason.RecognizedSpeech) //識別成功 { Console.WriteLine($"識別完成: {e.Result.Text}"); } else if (e.Result.Reason == ResultReason.NoMatch)//未識別到語音 { Console.WriteLine($"沒有識別到語音"); } }; //識別取消時執行 recognizer.Canceled += (s, e) => { Console.WriteLine($"取消識別: Reason={e.Reason}"); if (e.Reason == CancellationReason.Error) { Console.WriteLine($"CANCELED: ErrorCode={e.ErrorCode}"); Console.WriteLine($"CANCELED: ErrorDetails={e.ErrorDetails}"); Console.WriteLine($"CANCELED: Did you update the subscription info?"); } }; //開始時執行 recognizer.SessionStarted += (s, e) => { Console.WriteLine("\n 開始識別."); }; //結束時執行 recognizer.SessionStopped += (s, e) => { Console.WriteLine("\n 識別結束."); stopRecognition.TrySetResult(0); //結束時添加一個異步任務 }; // 開始連續識別 await recognizer.StartContinuousRecognitionAsync().ConfigureAwait(false); //保證至少一個任務完成(等待到結束時間執行后再結束) Task.WaitAny(new[] { stopRecognition.Task }); // 結束持續識別 await recognizer.StopContinuousRecognitionAsync().ConfigureAwait(false); } } } catch (Exception ex) { throw ex; } }
當然持續語音識別不只是用來識別文件的,也可以正常的用來識別麥克風,只要不傳識別器對象的第二個參數就行了
順便記錄一個計時器
//計時器對象 Stopwatch stopwatch = new Stopwatch(); //開始計時 stopwatch.Start(); //結束計時 stopwatch.Stop(); //返回毫秒數 stopwatch.ElapsedMilliseconds
這些都是語音識別的簡單應用,還有更加復雜的使用方式,比如和和LUIS配合使用,完成語音識別意圖
這些就自己去看官方文檔吧
https://docs.microsoft.com/zh-cn/azure/cognitive-services/speech-service/
