/// <summary> /// 辨識輸入文字為語音 /// </summary> /// <param name="textToSpeakBM">輸入文字為語音用</param> /// <returns></returns> public async Task TextToSpeak(RecognizeBM recognizeBM) { // 設定語音服務設定 var config = this.GetSpeechConfig(recognizeBM); // 建立語音合成器類別 using (var synthesizer = new SpeechSynthesizer(config)) { Console.WriteLine("處理中..."); // 判斷輸入是否為空白 if (string.IsNullOrEmpty(recognizeBM.Text.Trim())) { recognizeBM.Text = "無法辨識輸入,請重新輸入\n"; } // 將文字合成為語音 using (var result = await synthesizer.SpeakTextAsync(recognizeBM.Text)) { // 判斷回傳執行結果狀態 this.CheckReason(result); Console.WriteLine($"系統辨識為: {recognizeBM.Text}\n"); } } }
/// <summary> /// 設定語音服務設定 /// </summary> /// <param name="recognizeBM"></param> /// <returns></returns> private SpeechConfig GetSpeechConfig(RecognizeBM recognizeBM) { // 設定 訂用帳戶金鑰 與 訂用帳戶服務的所在區域 // 免費試用的服務所在區域都是 westus var speechConfig = SpeechConfig.FromSubscription(recognizeBM.Subkey, recognizeBM.Region); // 要辨識的語言 speechConfig.SpeechRecognitionLanguage = recognizeBM.Language; // 設定語音名稱 speechConfig = this.SetVoiceName(recognizeBM.Language, speechConfig); return(speechConfig); }
/// <summary> /// 辨識輸入語音為文字 /// </summary> /// <param name="recognizeBM">語音辨識基本設定用</param> /// <returns>辨識後的文字</returns> public async Task <string> SpeakToText(RecognizeBM recognizeBM) { // 設定語音服務設定 var config = this.GetSpeechConfig(recognizeBM); // 建立語音辨識器類別 using (var recognizer = new SpeechRecognizer(config)) { // RecognizeOnceAsync 此方法 僅適用於單個語音識別,如命令或查詢,輸入時間小於 15 秒 // 如果需要長時間運行的多話語識別,請改用 StartContinuousRecognitionAsync(), // 輸入時間大於 15 秒 var result = await recognizer.RecognizeOnceAsync(); // 判斷回傳執行結果狀態 this.CheckReason(result); return(recognizeText); } }
/// <summary> /// 執行文字轉語音 /// </summary> /// <param name="recognizeBM">語音辨識設定</param> /// <param name="keyWord">切換 手動/語音模式 關鍵字</param> /// <param name="modeStatus">模式狀態</param> /// <returns></returns> private async static Task <bool> StartTextToSpeak( RecognizeBM recognizeBM, string keyWord, bool modeStatus) { // 輸入關閉或結束,結束應用程式 if (recognizeBM.Text.Contains("關閉") || recognizeBM.Text.Contains("結束")) { Console.WriteLine("應用程式結束,請輸入任意鍵繼續..."); Console.ReadLine(); Environment.Exit(0); } // 執行文字轉語音 await speechService.TextToSpeak(recognizeBM); if (recognizeBM.Text.Contains(keyWord) || recognizeBM.Text == "切換") { return(!modeStatus); } return(modeStatus); }
static async Task Main(string[] args) { Console.ForegroundColor = ConsoleColor.Green; Console.WriteLine("模式切換方式如下:"); Console.WriteLine("語音輸入模式下,說出 手動輸入 或 切換,即切換為手動輸入模式"); Console.WriteLine("手動輸入模式下,輸入 語音輸入 或 切換,即切換為語音輸入模式"); Console.WriteLine("任一模式下,輸入 關閉 或 結束,即結束應用程式"); Console.ForegroundColor = ConsoleColor.White; // 實體化 語音辨識 服務 speechService = new SpeechService(); // 實體化 語音辨識基本設定用 BM var recognizeBM = new RecognizeBM(); // 要辨識的語言 recognizeBM.Language = "zh-TW"; Console.WriteLine("輸入帳戶金鑰:"); // 取得金鑰 recognizeBM.Subkey = Console.ReadLine(); // 取得服務端點位置,免費試用帳戶都為 westus recognizeBM.Region = "westus"; // 預設程式啟動提示訊息 recognizeBM.Text = "語音服務啟動"; try { // 執行文字轉語音 await speechService.TextToSpeak(recognizeBM); // 用來切換模式的 flag var isTextMode = false; while (true) { if (isTextMode) { Console.WriteLine("手動輸入:"); // 取得輸入文字 recognizeBM.Text = Console.ReadLine(); // 執行文字轉語音 isTextMode = await StartTextToSpeak(recognizeBM, "語音輸入", isTextMode); } else { Console.WriteLine("語音輸入:"); // 取得輸入文字 recognizeBM.Text = await speechService.SpeakToText(recognizeBM); // 執行文字轉語音 isTextMode = await StartTextToSpeak(recognizeBM, "手動輸入", isTextMode); } } } catch { Console.WriteLine("應用程式執行失敗,請重新執行"); Console.ReadLine(); } }