微軟認知語音服務 語音識別


官網

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/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM