如何辨識語音

語音轉換文字 REST API 參考 | 適用於短音訊的語音轉換文字 REST API 參考 | GitHub 上的其他範例

在這份操作指南中,你將學習如何在 Foundry 工具中使用 Azure 語音進行即時語音轉文字轉換。 即時語音辨識非常適合需要即時轉錄的應用,例如語音輸入、客服中心協助,以及現場會議的字幕。

想了解如何為範例應用程式設置環境,請參閱 快速入門:辨識並將語音轉文字

將語音轉換為文字

在命令提示字元執行以下指令。 在指令中插入以下數值:

  • 你語音資源的 API 金鑰
  • 您的語音服務區域
  • 輸入音訊檔案的路徑
curl --location --request POST 'https://YourResourceName.cognitiveservices.azure.com/stt/speech/recognition/conversation/cognitiveservices/v1?language=en-US' \
--header 'Ocp-Apim-Subscription-Key: INSERT_SUBSCRIPTION_KEY_HERE' \
--header 'Content-Type: audio/wav' \
--data-binary @'INSERT_AUDIO_FILE_PATH_HERE'

你應該會收到如下範例的回覆:

{
    "RecognitionStatus": "Success",
    "DisplayText": "My voice is my passport, verify me.",
    "Offset": 6600000,
    "Duration": 32100000
}

欲了解更多資訊,請參閱 語音轉文字 REST API 參考資料

參考文件Package (PyPi) GitHub

在這份操作指南中,你將學習如何在 Foundry 工具中使用 Azure 語音進行即時語音轉文字轉換。 即時語音辨識非常適合需要即時轉錄的應用,例如語音輸入、客服中心協助,以及現場會議的字幕。

想了解如何為範例應用程式設置環境,請參閱 快速入門:辨識並將語音轉文字

建立語音配置實例

要使用 Speech SDK 呼叫語音服務,你需要建立一個 SpeechConfig 實例。 此類別包含關於語音資源的資訊,例如語音金鑰及相關區域、端點、主機或授權標記。

  1. Azure 入口網站建立 Foundry 的語音資源。 取得語音資源金鑰和區域。
  2. 請使用以下程式碼建立實 SpeechConfig 例。 用你的語音資源鍵和區域替換 YourSpeechKeyYourSpeechRegion
speech_config = speechsdk.SpeechConfig(subscription="YourSpeechKey", region="YourSpeechRegion")

你還可以用其他幾種方式初始化 SpeechConfig

  • 使用一個端點,並將語音服務端點傳遞進去。 語音金鑰或授權令牌則為可選。
  • 使用主機,並輸入主機位址。 語音金鑰或授權令牌則為可選。
  • 使用帶有對應區域/地點的授權令牌。

無論你是在進行語音辨識、語音合成、翻譯或意圖辨識,你總是會建立一個配置。

辨識麥克風中的語音

要使用你的裝置麥克風來辨識語音,請建立一個不包含 SpeechRecognizerAudioConfig 實例,然後傳遞 speech_config

import azure.cognitiveservices.speech as speechsdk

def from_mic():
    speech_config = speechsdk.SpeechConfig(subscription="YourSpeechKey", region="YourSpeechRegion")
    speech_recognizer = speechsdk.SpeechRecognizer(speech_config=speech_config)

    print("Speak into your microphone.")
    speech_recognition_result = speech_recognizer.recognize_once_async().get()
    print(speech_recognition_result.text)

from_mic()

如果你想使用 特定的 音訊輸入裝置,你需要在 中指定裝置 ID AudioConfig,然後傳給 SpeechRecognizer 建構子的 audio_config 參數。 想了解如何取得裝置 ID,請參閱 使用 Speech SDK 選擇音訊輸入裝置

從檔案中辨識語音

如果你想從音訊檔案中辨識語音,而不是用麥克風,請建立一個 AudioConfig 實例並使用 filename 參數:

import azure.cognitiveservices.speech as speechsdk

def from_file():
    speech_config = speechsdk.SpeechConfig(subscription="YourSpeechKey", region="YourSpeechRegion")
    audio_config = speechsdk.AudioConfig(filename="your_file_name.wav")
    speech_recognizer = speechsdk.SpeechRecognizer(speech_config=speech_config, audio_config=audio_config)

    speech_recognition_result = speech_recognizer.recognize_once_async().get()
    print(speech_recognition_result.text)

from_file()

處理錯誤

前面的例子只取得該 speech_recognition_result.text 屬性中已識別的文字。 要處理錯誤和其他回應,你需要寫程式碼來處理結果。 以下程式碼評估該 speech_recognition_result.reason 屬性:

  • 列印識別結果: speechsdk.ResultReason.RecognizedSpeech
  • 若無識別匹配,系統會通知使用者: speechsdk.ResultReason.NoMatch
  • 若遇到錯誤,會列印錯誤訊息: speechsdk.ResultReason.Canceled
if speech_recognition_result.reason == speechsdk.ResultReason.RecognizedSpeech:
    print("Recognized: {}".format(speech_recognition_result.text))
elif speech_recognition_result.reason == speechsdk.ResultReason.NoMatch:
    print("No speech could be recognized: {}".format(speech_recognition_result.no_match_details))
elif speech_recognition_result.reason == speechsdk.ResultReason.Canceled:
    cancellation_details = speech_recognition_result.cancellation_details
    print("Speech Recognition canceled: {}".format(cancellation_details.reason))
    if cancellation_details.reason == speechsdk.CancellationReason.Error:
        print("Error details: {}".format(cancellation_details.error_details))
        print("Did you set the speech resource key and region values?")

使用連續識別

前述範例使用單次識別,該識別能識別單一語句。 單一語句的結束會透過接聽結尾的靜音來判斷,或直到處理最多 15 秒音訊為止。

相較之下,當你想控制何時停止識別時,會使用持續識別。 它需要你連線 EventSignal 才能獲得辨識結果。 要停止辨識,您必須呼叫 stop_continuous_recognition()stop_continuous_recognition_async()。 這裡有一個連續辨識音訊輸入檔案的範例。

首先定義輸入並初始化:SpeechRecognizer

audio_config = speechsdk.audio.AudioConfig(filename=weatherfilename)
speech_recognizer = speechsdk.SpeechRecognizer(speech_config=speech_config, audio_config=audio_config)

接著,建立一個變數來管理語音辨識的狀態。 將變數設為 False ,因為在辨識開始時,你可以放心地假設它尚未完成:

done = False

現在,建立回呼函數以在收到 evt 時停止持續識別。 請記住以下幾點:

def stop_cb(evt):
    print('CLOSING on {}'.format(evt))
    speech_recognizer.stop_continuous_recognition()
    global done
    done = True

以下程式碼範例展示了如何將回呼連接到從 SpeechRecognizer 發送的事件。 活動如下:

  • recognizing:包含中間識別結果的事件信號。
  • recognized:指示包含最終識別結果的事件,表示成功的識別嘗試。
  • session_started:表示辨識工作階段 (作業) 開始之事件的信號。
  • session_stopped:表示辨識工作階段 (作業) 結束之事件的信號。
  • canceled:包含已取消辨識結果之事件的信號。 這些結果表示因直接的取消要求而取消的辨識嘗試。 或者,它們表示傳輸或協定故障。
speech_recognizer.recognizing.connect(lambda evt: print('RECOGNIZING: {}'.format(evt)))
speech_recognizer.recognized.connect(lambda evt: print('RECOGNIZED: {}'.format(evt)))
speech_recognizer.session_started.connect(lambda evt: print('SESSION STARTED: {}'.format(evt)))
speech_recognizer.session_stopped.connect(lambda evt: print('SESSION STOPPED {}'.format(evt)))
speech_recognizer.canceled.connect(lambda evt: print('CANCELED {}'.format(evt)))

speech_recognizer.session_stopped.connect(stop_cb)
speech_recognizer.canceled.connect(stop_cb)

一切設定完成後,你可以撥打 start_continuous_recognition()

speech_recognizer.start_continuous_recognition()
while not done:
    time.sleep(.5)

更改原始語言

語音辨識的一項常見任務是指定輸入(或來源)語言。 以下範例展示了如何將輸入語言改為德語。 在你的程式碼中,找到你的 SpeechConfig 實例,並在它下方直接加上這行:

speech_config.speech_recognition_language="de-DE"

speech_recognition_language 是一個參數,將字串作為參數。 有關支援的地點列表,請參見 語音服務的語言與語音支援

語言識別

當你需要在音訊來源中辨識語言並轉文字時,可以使用語音識別來辨識語言。

完整程式碼範例請參見 語言識別

使用自訂端點

透過 自訂語音,你可以上傳自己的資料、測試和訓練自訂模型、比較模型間的準確度,並將模型部署到自訂端點。 以下範例說明如何設定自訂端點。

speech_config = speechsdk.SpeechConfig(subscription="YourSpeechResoureKey", region="YourServiceRegion")
speech_config.endpoint_id = "YourEndpointId"
speech_recognizer = speechsdk.SpeechRecognizer(speech_config=speech_config)

執行並使用容器

語音容器提供基於 websocket 的查詢端點 API,透過語音 SDK 與語音 CLI 存取。 預設情況下,語音 SDK 與語音 CLI 使用公開語音服務。 要使用容器,你需要更改初始化方法。 使用容器主機網址,而不是金鑰和區域。

欲了解更多容器資訊,請參閱安裝 並使用 Docker 執行語音容器的 Host URLS。

語意分割

語意分割是一種語音辨識分割策略,旨在減輕靜默分割所帶來的問題:

  • 分段不足:當使用者長時間無停頓地說話時,會看到一長串無間斷的文字(「文字牆」),這嚴重降低了可讀性。
  • 過度分段:當使用者短暫暫停時,靜音偵測機制可能會錯誤分段。

語意分割不僅依賴靜默逾時,而是在偵測到句尾標點符號(如「.」或「?」)時,會對最終結果進行分段並回傳。 這提升了使用者體驗,提供更高品質且語意完整的片段,並避免冗長的中間結果。

若要使用語意分段,您需要在用來建立 SpeechConfigSpeechRecognizer 執行個體上設定以下屬性:

speech_config.set_property(speechsdk.PropertyId.Speech_SegmentationStrategy, "Semantic") 

語意分割的一些限制如下:

  • 你需要使用 Speech SDK 1.41 或更新版本才能使用語意分割。
  • 語意分割僅用於 連續識別。 這包括語音輸入和字幕等情境。 它不應該用於單一識別模式或互動情境。
  • 語意分割並非適用於所有語言和地區。
  • 語意分割尚未支援信心分數和NBest清單。 因此,如果你使用信心分數或 NBest 清單,我們不建議使用語意分割。

串流後最佳化

串流後的精煉能讓你在不影響首個標記延遲的情況下,獲得更精確的即時 轉錄 最終結果。 它會與即時串流並行執行第二次識別,因此中間結果和部分結果都能維持低延遲。 只有最終結果會被更準確、使用更廣泛音頻脈絡的版本取代。

單語串流後最佳化已正式推出。 多語言的串流後優化功能正在公開預覽中。

能力 單語串流後精修 多語言串流後精煉
Availability 普遍可用 公開預覽
語言範圍 每個識別會話設定一個區域 同一會話支援多種語言,包括語言切換
語言配置 設定識別地點 使用開放範圍自動語言偵測,無需候選語言清單
片語清單 支援 公開預覽期間不支援
分段標記 支援 支援

若要啟用串流後的優化,請在 SpeechServiceResponse_PostProcessingOption 實例上設定 SpeechConfig 屬性:

speechConfig->SetProperty(PropertyId::SpeechServiceResponse_PostProcessingOption, "PostRefinement");
speechConfig.SetProperty(PropertyId.SpeechServiceResponse_PostProcessingOption, "PostRefinement");
speechConfig.setProperty(PropertyId.SpeechServiceResponse_PostProcessingOption, "PostRefinement");
speech_config.set_property(
    speechsdk.PropertyId.SpeechServiceResponse_PostProcessingOption,
    "PostRefinement"
)

多語言串流後精修(預覽)

串流後的精細化支援多語言辨識,因此單一音訊串流可以跨越多種語言,包括在對話中切換語言。 單一多語言模型會直接辨識語言,因此你不需要設定語言識別模式或提供候選語言清單。 若要啟用多語言路徑,請將 SpeechServiceResponse_PostProcessingOption 設為 PostRefinement,並在建立 AutoDetectSourceLanguageConfig 時傳入已設定為自動語言偵測的 SpeechRecognizer

多語言後串流精煉需使用 Speech SDK 1.50 或更新版本,且僅透過 Speech SDK 提供。

在公開預覽期間,短語列表無法支援多語言的串流後細膩調整。

speechConfig->SetProperty(PropertyId::SpeechServiceResponse_PostProcessingOption, "PostRefinement");

auto autoDetectSourceLanguageConfig = AutoDetectSourceLanguageConfig::FromOpenRange();

auto recognizer = SpeechRecognizer::FromConfig(speechConfig, autoDetectSourceLanguageConfig, audioConfig);
speechConfig.SetProperty(PropertyId.SpeechServiceResponse_PostProcessingOption, "PostRefinement");

var autoDetectSourceLanguageConfig = AutoDetectSourceLanguageConfig.FromOpenRange();

var recognizer = new SpeechRecognizer(speechConfig, autoDetectSourceLanguageConfig, audioConfig);
speechConfig.setProperty(PropertyId.SpeechServiceResponse_PostProcessingOption, "PostRefinement");

AutoDetectSourceLanguageConfig autoDetectSourceLanguageConfig =
    AutoDetectSourceLanguageConfig.fromOpenRange();

SpeechRecognizer recognizer =
    new SpeechRecognizer(speechConfig, autoDetectSourceLanguageConfig, audioConfig);
speech_config.set_property(
    speechsdk.PropertyId.SpeechServiceResponse_PostProcessingOption,
    "PostRefinement"
)

auto_detect_source_language_config = speechsdk.languageconfig.AutoDetectSourceLanguageConfig()

recognizer = speechsdk.SpeechRecognizer(
    speech_config=speech_config,
    auto_detect_source_language_config=auto_detect_source_language_config,
    audio_config=audio_config)

在公開預覽期間,多語言後續優化可支援25種語言:阿拉伯語、中文、捷克語、丹麥語、荷蘭語、英語、芬蘭語、法語、德語、希臘語、希伯來語、印地語、匈牙利語、印尼語、義大利語、日語、韓語、挪威博克馬爾語、波蘭語、葡萄牙語、俄語、西班牙語、瑞典語、泰語及土耳其語。 因為服務會自動偵測口語,所以你不需要設定地點。 使用不受支援的語言所錄製的音訊可能會產生意想不到的結果。 關於支援單語及多語後串流精煉的特定地點,請參見 語音轉文字語言支援

後串流精簡的一些重要考量:

  • 串流後優化最適用於較長的語音內容,例如對話、會議與聽寫。 對於非常短的詞句,精煉後的結果可能與標準結果相同。
  • 串流後精煉與 TrueText 是同一 SpeechServiceResponse_PostProcessingOption 屬性的不同值。 一次只能設定一個值。
  • 單語和多語後串流精煉在 Azure 區域可用性上有所不同。

欲了解更多後製選項,請參閱如何使用後製。

重要

在多語言的後期精煉中,有些地點可能沒有顯著的品質提升,結果也可能與標準識別時所見不同。

參考文件Package (NuGet) GitHub

在這份操作指南中,你將學習如何在 Foundry 工具中使用 Azure 語音進行即時語音轉文字轉換。 即時語音辨識非常適合需要即時轉錄的應用,例如語音輸入、客服中心協助,以及現場會議的字幕。

想了解如何為範例應用程式設置環境,請參閱 快速入門:辨識並將語音轉文字

建立語音配置實例

要使用 Speech SDK 呼叫語音服務,你需要建立一個 SpeechConfig 實例。 此類別包含關於語音資源的資訊,如金鑰及相關區域、端點、主機或授權令牌。

  1. Azure 入口網站建立 Foundry 的語音資源。 獲取語音資源金鑰和端點。
  2. 請使用以下程式碼建立實 SpeechConfig 例。 將 YourSpeechKeyYourSpeechEndpoint 替換成你的語音資源金鑰和端點。
using System;
using System.IO;
using System.Threading.Tasks;
using Microsoft.CognitiveServices.Speech;
using Microsoft.CognitiveServices.Speech.Audio;

class Program 
{
    async static Task Main(string[] args)
    {
        var speechConfig = SpeechConfig.FromEndpoint(new Uri("YourSpeechEndpoint"), "YourSpeechKey");
    }
}

你還可以用其他幾種方式初始化 SpeechConfig

  • 使用一個端點,並將語音服務端點傳遞進去。 金鑰或授權憑證是可選的。
  • 使用主機,並輸入主機位址。 金鑰或授權憑證是可選的。
  • 使用帶有對應區域/地點的授權令牌。

無論你是在進行語音辨識、語音合成、翻譯或意圖辨識,你總是會建立一個配置。

辨識麥克風中的語音

要用你的裝置麥克風辨識語音,請使用該AudioConfig方法建立一個FromDefaultMicrophoneInput()實例。 接著透過傳遞 SpeechRecognizerspeechConfig來初始化物件audioConfig

using System;
using System.IO;
using System.Threading.Tasks;
using Microsoft.CognitiveServices.Speech;
using Microsoft.CognitiveServices.Speech.Audio;

class Program 
{
    async static Task FromMic(SpeechConfig speechConfig)
    {
        using var audioConfig = AudioConfig.FromDefaultMicrophoneInput();
        using var speechRecognizer = new SpeechRecognizer(speechConfig, audioConfig);

        Console.WriteLine("Speak into your microphone.");
        var speechRecognitionResult = await speechRecognizer.RecognizeOnceAsync();
        Console.WriteLine($"RECOGNIZED: Text={speechRecognitionResult.Text}");
    }

    async static Task Main(string[] args)
    {
        var speechConfig = SpeechConfig.FromEndpoint(new Uri("YourSpeechEndpoint"), "YourSpeechKey");
        await FromMic(speechConfig);
    }
}

如果你想使用 特定的 音訊輸入裝置,你需要在 AudioConfig 指定裝置 ID。 想了解如何取得裝置 ID,請參閱 使用 Speech SDK 選擇音訊輸入裝置

從檔案中辨識語音

如果你想從音訊檔案中辨識語音,而不是麥克風,你仍然需要建立一個 AudioConfig 實例。 不過,您不會呼叫 FromDefaultMicrophoneInput()。 你呼叫 FromWavFileInput() 並傳遞檔案路徑:

using System;
using System.IO;
using System.Threading.Tasks;
using Microsoft.CognitiveServices.Speech;
using Microsoft.CognitiveServices.Speech.Audio;

class Program 
{
    async static Task FromFile(SpeechConfig speechConfig)
    {
        using var audioConfig = AudioConfig.FromWavFileInput("PathToFile.wav");
        using var speechRecognizer = new SpeechRecognizer(speechConfig, audioConfig);

        var speechRecognitionResult = await speechRecognizer.RecognizeOnceAsync();
        Console.WriteLine($"RECOGNIZED: Text={speechRecognitionResult.Text}");
    }

    async static Task Main(string[] args)
    {
        var speechConfig = SpeechConfig.FromEndpoint(new Uri("YourSpeechEndpoint"), "YourSpeechKey");
        await FromFile(speechConfig);
    }
}

從記憶體串流中辨識語音

在許多使用情境中,你的音訊資料很可能來自 Azure Blob 儲存體,或者已經以 byte[] 實例或類似的原始資料結構存在記憶體中。 以下範例使用 PushAudioInputStream 語音辨識,語音本質上是抽象的記憶流。 範例程式碼執行以下動作:

  • 透過使用PushAudioInputStream 函式將Write() 原始音訊資料寫入,該函式接受 byte[] 實例。
  • 基於示範目的,使用 讀取 FileReader 檔案。 如果您在 byte[] 執行個體中已有音訊資料,可以直接跳到將內容寫入輸入資料流。
  • 預設格式為 16 位元、16 kHz 單聲道脈衝編碼調變(PCM)資料。 若要自訂格式,你可以使用靜態函式AudioStreamFormat 將一個CreatePushStream()物件傳遞給AudioStreamFormat.GetWaveFormatPCM(sampleRate, (byte)bitRate, (byte)channels)
using System;
using System.IO;
using System.Threading.Tasks;
using Microsoft.CognitiveServices.Speech;
using Microsoft.CognitiveServices.Speech.Audio;

class Program 
{
    async static Task FromStream(SpeechConfig speechConfig)
    {
        var reader = new BinaryReader(File.OpenRead("PathToFile.wav"));
        using var audioConfigStream = AudioInputStream.CreatePushStream();
        using var audioConfig = AudioConfig.FromStreamInput(audioConfigStream);
        using var speechRecognizer = new SpeechRecognizer(speechConfig, audioConfig);

        byte[] readBytes;
        do
        {
            readBytes = reader.ReadBytes(1024);
            audioConfigStream.Write(readBytes, readBytes.Length);
        } while (readBytes.Length > 0);

        var speechRecognitionResult = await speechRecognizer.RecognizeOnceAsync();
        Console.WriteLine($"RECOGNIZED: Text={speechRecognitionResult.Text}");
    }

    async static Task Main(string[] args)
    {
        var speechConfig = SpeechConfig.FromEndpoint(new Uri("YourSpeechEndpoint"), "YourSpeechKey");
        await FromStream(speechConfig);
    }
}

使用推送串流作為輸入時,假定音訊資料是原始 PCM 格式,因此可以跳過任何標頭。 如果標頭沒有被跳過,API 在某些情況下仍然能運作。 為獲得最佳結果,請考慮實作讀取掉標頭的邏輯,讓 byte[]從音訊資料的開頭開始

處理錯誤

前面的例子只取得該 speechRecognitionResult.Text 屬性中已識別的文字。 要處理錯誤和其他回應,你需要寫程式碼來處理結果。 以下程式碼評估該 speechRecognitionResult.Reason 屬性:

  • 列印識別結果: ResultReason.RecognizedSpeech
  • 若無識別匹配,系統會通知使用者: ResultReason.NoMatch
  • 若遇到錯誤,會列印錯誤訊息: ResultReason.Canceled
switch (speechRecognitionResult.Reason)
{
    case ResultReason.RecognizedSpeech:
        Console.WriteLine($"RECOGNIZED: Text={speechRecognitionResult.Text}");
        break;
    case ResultReason.NoMatch:
        Console.WriteLine($"NOMATCH: Speech could not be recognized.");
        break;
    case ResultReason.Canceled:
        var cancellation = CancellationDetails.FromResult(speechRecognitionResult);
        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 set the speech resource key and endpoint values?");
        }
        break;
}

使用連續識別

前述範例使用單次識別,該識別能識別單一語句。 單一語句的結束會透過接聽結尾的靜音來判斷,或直到處理最多 15 秒音訊為止。

相較之下,當你想控制何時停止識別時,會使用持續識別。 需要你訂閱 RecognizingRecognizedCanceled 活動,才能獲得識別結果。 要停止辨識,你必須撥打 StopContinuousRecognitionAsync。 這裡有一個連續辨識音訊輸入檔案的範例。

首先定義輸入並初始化:SpeechRecognizer

using var audioConfig = AudioConfig.FromWavFileInput("YourAudioFile.wav");
using var speechRecognizer = new SpeechRecognizer(speechConfig, audioConfig);

接著建立 TaskCompletionSource<int> 一個實例來管理語音辨識狀態:

var stopRecognition = new TaskCompletionSource<int>();

然後,訂閱由 SpeechRecognizer 發送的事件:

  • Recognizing:包含中間識別結果的事件信號。
  • Recognized:指示包含最終識別結果的事件,表示成功的識別嘗試。
  • SessionStopped:表示辨識工作階段 (作業) 結束之事件的信號。
  • Canceled:包含已取消辨識結果之事件的信號。 這些結果表示因直接的取消要求而取消的辨識嘗試。 或者,它們表示傳輸或協定故障。
speechRecognizer.Recognizing += (s, e) =>
{
    Console.WriteLine($"RECOGNIZING: Text={e.Result.Text}");
};

speechRecognizer.Recognized += (s, e) =>
{
    if (e.Result.Reason == ResultReason.RecognizedSpeech)
    {
        Console.WriteLine($"RECOGNIZED: Text={e.Result.Text}");
    }
    else if (e.Result.Reason == ResultReason.NoMatch)
    {
        Console.WriteLine($"NOMATCH: Speech could not be recognized.");
    }
};

speechRecognizer.Canceled += (s, e) =>
{
    Console.WriteLine($"CANCELED: 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 set the speech resource key and endpoint values?");
    }

    stopRecognition.TrySetResult(0);
};

speechRecognizer.SessionStopped += (s, e) =>
{
    Console.WriteLine("\n    Session stopped event.");
    stopRecognition.TrySetResult(0);
};

一切設置妥當後,呼叫 StartContinuousRecognitionAsync 以開始進行識別操作。

await speechRecognizer.StartContinuousRecognitionAsync();

// Waits for completion. Use Task.WaitAny to keep the task rooted.
Task.WaitAny(new[] { stopRecognition.Task });

// Make the following call at some point to stop recognition:
// await speechRecognizer.StopContinuousRecognitionAsync();

更改原始語言

語音辨識的一項常見任務是指定輸入(或來源)語言。 以下範例說明如何將輸入語言改為義大利語。 在你的程式碼中,找到你的 SpeechConfig 實例,並在它下方直接加上這行:

speechConfig.SpeechRecognitionLanguage = "it-IT";

SpeechRecognitionLanguage 屬性預期有語言-區域格式字串。 有關支援的地點列表,請參見 語音服務的語言與語音支援

語言識別

當你需要在音訊來源中辨識語言並轉文字時,可以利用語音識別技術來辨識語言,然後將其轉為文字。

完整程式碼範例請參見 語言識別

使用自訂端點

透過 自訂語音,你可以上傳自己的資料、測試和訓練自訂模型、比較模型間的準確度,並將模型部署到自訂端點。 以下範例說明如何設定自訂端點。

var speechConfig = SpeechConfig.FromEndpoint(new Uri("YourSpeechEndpoint"), "YourSpeechKey");
speechConfig.EndpointId = "YourEndpointId";
var speechRecognizer = new SpeechRecognizer(speechConfig);

執行並使用容器

語音容器提供基於 websocket 的查詢端點 API,透過語音 SDK 與語音 CLI 存取。 預設情況下,語音 SDK 與語音 CLI 使用公開語音服務。 要使用容器,你需要更改初始化方法。 使用容器主機網址,而不是金鑰和區域。

欲了解更多容器資訊,請參閱安裝 並使用 Docker 執行語音容器的 Host URLS。

改變沉默的處理方式

如果使用者說話速度比平常快或慢,輸入音訊中非語音靜音的預設行為可能不會達到你預期的效果。 靜音處理常見問題包括:

  • 快速說話將許多句子串連成單一識別結果,而非將句子拆分成個別結果。
  • 語速緩慢的語音會將一句話分成多個結果。
  • 單次辨識在等待語音開始時太快結束。

您可以藉由在用來建立 SpeechConfig 執行個體上設定兩個SpeechRecognizer之一,來解決這些問題:

  • 分段靜音逾時會調整目前正在說出的片語中,允許多少非語音音訊,才會將該片語視為「完成」。
    • 較高 的數值通常會讓結果更長,並允許說話者在片語中停留更長的停頓時間,但結果的出現時間會更長。 當設定過高時,它們也能將多個片語合併成單一結果。
    • 較低 的數值通常會使結果更短,並確保片語間的休息更頻繁且迅速,但若設定過低,也可能導致單一片語分裂成多個結果。
    • 這個逾時可以設定為100到5000之間的整數值,單位是毫秒,500通常是預設值。
  • 初始靜音逾時會調整片語之前允許多少非語音音訊,才會讓辨識嘗試以「無相符項目」結果結束。
    • 較高 的數值能讓說話者有更多時間反應並開始說話,但當沒有說話時,反應也可能變慢。
    • 較低的 數值會提示「不匹配」,以加快使用者體驗與更可控的音訊處理,但設定過低可能會讓喇叭過快切斷。
    • 由於持續識別會產生許多結果,這個數值決定了「無匹配」結果出現的頻率,但不會影響識別結果的內容。
    • 此逾時可設定為任意非負整數值(以毫秒計),或設為 0 以完全停用。 5000 是單次辨識的典型預設值,而 15000 則是連續辨識的典型預設值。

由於修改這些逾時會有取捨,您只有在遇到與靜音處理相關的問題時,才應該變更設定。 預設值最適合處理大多數語音音訊,只有罕見的情境才會遇到問題。

範例: 使用者若說出像「ABC-123-4567」這類序號,可能會在字元組間停留足夠久,讓序號被拆解成多個結果。 在這種情況下,試試以更高的數值,例如 2000 毫秒來設定分段靜默逾時:

speechConfig.SetProperty(PropertyId.Speech_SegmentationSilenceTimeoutMs, "2000");

範例: 錄音講者的講話速度可能快到連續幾句會被組合起來,完整的辨識結果每分鐘只有一到兩次。 在這種情況下,將分段靜音逾時設定為較低的值,例如 300 毫秒:

speechConfig.SetProperty(PropertyId.Speech_SegmentationSilenceTimeoutMs, "300");

範例:要求說話者尋找並朗讀序號的單次辨識,在找到號碼之前太快結束。 在這種情況下,試試一個較長的初始靜音逾時,比如 10,000 毫秒:

speechConfig.SetProperty(PropertyId.SpeechServiceConnection_InitialSilenceTimeoutMs, "10000");

語意分割

語意分割是一種語音辨識分割策略,旨在減輕 靜默分割所帶來的問題:

  • 分段不足:當使用者長時間無停頓地說話時,會看到一長串無間斷的文字(「文字牆」),這嚴重降低了可讀性。
  • 過度分段:當使用者短暫暫停時,靜音偵測機制可能會錯誤分段。

語意分割不僅依賴靜默逾時,而是在偵測到句尾標點符號(如「.」或「?」)時,會對最終結果進行分段並回傳。 這提升了使用者體驗,提供更高品質且語意完整的片段,並避免冗長的中間結果。

若要使用語意分段,您需要在用來建立 SpeechConfigSpeechRecognizer 執行個體上設定以下屬性:

speechConfig.SetProperty(PropertyId.Speech_SegmentationStrategy, "Semantic");

語意分割的一些限制如下:

  • 你需要使用 Speech SDK 1.41 或更新版本才能使用語意分割。
  • 語意分割僅用於 連續識別。 這包括語音輸入和字幕等情境。 它不應該用於單一識別模式或互動情境。
  • 語意分割並非適用於所有語言和地區。
  • 語意分割尚未支援信心分數和NBest清單。 因此,如果你使用信心分數或 NBest 清單,我們不建議使用語意分割。

串流後最佳化

串流後的精煉能讓你在不影響首個標記延遲的情況下,獲得更精確的即時 轉錄 最終結果。 它會與即時串流並行執行第二次識別,因此中間結果和部分結果都能維持低延遲。 只有最終結果會被更準確、使用更廣泛音頻脈絡的版本取代。

單語串流後最佳化已正式推出。 多語言的串流後優化功能正在公開預覽中。

能力 單語串流後精修 多語言串流後精煉
Availability 普遍可用 公開預覽
語言範圍 每個識別會話設定一個區域 同一會話支援多種語言,包括語言切換
語言配置 設定識別地點 使用開放範圍自動語言偵測,無需候選語言清單
片語清單 支援 公開預覽期間不支援
分段標記 支援 支援

若要啟用串流後的優化,請在 SpeechServiceResponse_PostProcessingOption 實例上設定 SpeechConfig 屬性:

speechConfig->SetProperty(PropertyId::SpeechServiceResponse_PostProcessingOption, "PostRefinement");
speechConfig.SetProperty(PropertyId.SpeechServiceResponse_PostProcessingOption, "PostRefinement");
speechConfig.setProperty(PropertyId.SpeechServiceResponse_PostProcessingOption, "PostRefinement");
speech_config.set_property(
    speechsdk.PropertyId.SpeechServiceResponse_PostProcessingOption,
    "PostRefinement"
)

多語言串流後精修(預覽)

串流後的精細化支援多語言辨識,因此單一音訊串流可以跨越多種語言,包括在對話中切換語言。 單一多語言模型會直接辨識語言,因此你不需要設定語言識別模式或提供候選語言清單。 若要啟用多語言路徑,請將 SpeechServiceResponse_PostProcessingOption 設為 PostRefinement,並在建立 AutoDetectSourceLanguageConfig 時傳入已設定為自動語言偵測的 SpeechRecognizer

多語言後串流精煉需使用 Speech SDK 1.50 或更新版本,且僅透過 Speech SDK 提供。

在公開預覽期間,短語列表無法支援多語言的串流後細膩調整。

speechConfig->SetProperty(PropertyId::SpeechServiceResponse_PostProcessingOption, "PostRefinement");

auto autoDetectSourceLanguageConfig = AutoDetectSourceLanguageConfig::FromOpenRange();

auto recognizer = SpeechRecognizer::FromConfig(speechConfig, autoDetectSourceLanguageConfig, audioConfig);
speechConfig.SetProperty(PropertyId.SpeechServiceResponse_PostProcessingOption, "PostRefinement");

var autoDetectSourceLanguageConfig = AutoDetectSourceLanguageConfig.FromOpenRange();

var recognizer = new SpeechRecognizer(speechConfig, autoDetectSourceLanguageConfig, audioConfig);
speechConfig.setProperty(PropertyId.SpeechServiceResponse_PostProcessingOption, "PostRefinement");

AutoDetectSourceLanguageConfig autoDetectSourceLanguageConfig =
    AutoDetectSourceLanguageConfig.fromOpenRange();

SpeechRecognizer recognizer =
    new SpeechRecognizer(speechConfig, autoDetectSourceLanguageConfig, audioConfig);
speech_config.set_property(
    speechsdk.PropertyId.SpeechServiceResponse_PostProcessingOption,
    "PostRefinement"
)

auto_detect_source_language_config = speechsdk.languageconfig.AutoDetectSourceLanguageConfig()

recognizer = speechsdk.SpeechRecognizer(
    speech_config=speech_config,
    auto_detect_source_language_config=auto_detect_source_language_config,
    audio_config=audio_config)

在公開預覽期間,多語言後續優化可支援25種語言:阿拉伯語、中文、捷克語、丹麥語、荷蘭語、英語、芬蘭語、法語、德語、希臘語、希伯來語、印地語、匈牙利語、印尼語、義大利語、日語、韓語、挪威博克馬爾語、波蘭語、葡萄牙語、俄語、西班牙語、瑞典語、泰語及土耳其語。 因為服務會自動偵測口語,所以你不需要設定地點。 使用不受支援的語言所錄製的音訊可能會產生意想不到的結果。 關於支援單語及多語後串流精煉的特定地點,請參見 語音轉文字語言支援

後串流精簡的一些重要考量:

  • 串流後優化最適用於較長的語音內容,例如對話、會議與聽寫。 對於非常短的詞句,精煉後的結果可能與標準結果相同。
  • 串流後精煉與 TrueText 是同一 SpeechServiceResponse_PostProcessingOption 屬性的不同值。 一次只能設定一個值。
  • 單語和多語後串流精煉在 Azure 區域可用性上有所不同。

欲了解更多後製選項,請參閱如何使用後製。

重要

在多語言的後期精煉中,有些地點可能沒有顯著的品質提升,結果也可能與標準識別時所見不同。

參考文件 | 套件(npm) | 在 GitHub 上的其他範例 | 程式庫原始碼

在這份操作指南中,你將學習如何在 Foundry 工具中使用 Azure 語音進行即時語音轉文字轉換。 即時語音辨識非常適合需要即時轉錄的應用,例如語音輸入、客服中心協助,以及現場會議的字幕。

想了解如何為範例應用程式設置環境,請參閱 快速入門:辨識並將語音轉文字

建立語音配置實例

要使用 Speech SDK 呼叫語音服務,你需要建立一個 SpeechConfig 實例。 此類別包含關於語音資源的資訊,如金鑰及相關區域、端點、主機或授權令牌。

  1. Azure 入口網站建立 Foundry 的語音資源。 獲取語音資源金鑰和端點。
  2. 請使用以下程式碼建立實 SpeechConfig 例。 用你的語音資源端點和鍵替換 YourSpeechEndpointYourSpeechKey
const speechConfig = sdk.SpeechConfig.fromEndpoint(new URL("YourSpeechEndpoint"), "YourSpeechKey");

你還可以用其他幾種方式初始化 SpeechConfig

  • 使用一個端點,並將語音服務端點傳遞進去。 金鑰或授權憑證是可選的。
  • 使用主機,並輸入主機位址。 金鑰或授權憑證是可選的。
  • 使用帶有對應區域/地點的授權令牌。

無論你是在進行語音辨識、語音合成、翻譯或意圖辨識,你總是會建立一個配置。

辨識麥克風中的語音

Node.js不支援辨識麥克風語音。 它僅支援瀏覽器 JavaScript 環境。 欲了解更多資訊,請參閱 React 範例 以及 GitHub 上的 從麥克風語音轉文字的實作。 React 範例展示了驗證憑證交換與管理的設計模式。 它也顯示從麥克風或檔案擷取音訊,用於語音轉文字的過程。

如果你想使用 特定的 音訊輸入裝置,你需要在 AudioConfig 指定裝置 ID。 想了解如何取得裝置 ID,請參閱 使用 Speech SDK 選擇音訊輸入裝置

從檔案中辨識語音

要從音訊檔案中辨識語音,請使用AudioConfig 方法建立fromWavFileInput() 實例,該方法會接受Buffer 物件。 接著透過傳遞 SpeechRecognizeraudioConfig 初始化 speechConfig

const fs = require('fs');
const sdk = require("microsoft-cognitiveservices-speech-sdk");
const speechConfig = sdk.SpeechConfig.fromEndpoint("YourSpeechEndpoint", "YourSpeechKey");

function fromFile() {
    let audioConfig = sdk.AudioConfig.fromWavFileInput(fs.readFileSync("YourAudioFile.wav"));
    let speechRecognizer = new sdk.SpeechRecognizer(speechConfig, audioConfig);

    speechRecognizer.recognizeOnceAsync(result => {
        console.log(`RECOGNIZED: Text=${result.text}`);
        speechRecognizer.close();
    });
}
fromFile();

從記憶體串流中辨識語音

在許多使用情況下,你的音訊資料很可能來自 Azure Blob 儲存體。 或者它已經存在於記憶體中,作為 ArrayBuffer 一種或類似的原始資料結構。 以下代碼:

  • 透過使用 createPushStream()來建立推送流。
  • 基於示範目的,使用 讀取 fs.createReadStream 檔案。 如果您在 ArrayBuffer 中已有音訊資料,可以直接跳到將內容寫入輸入資料流。
  • 使用推送串流來建立音訊配置。
const fs = require('fs');
const sdk = require("microsoft-cognitiveservices-speech-sdk");
const speechConfig = sdk.SpeechConfig.fromEndpoint("YourSpeechEndpoint", "YourSpeechKey");

function fromStream() {
    let pushStream = sdk.AudioInputStream.createPushStream();

    fs.createReadStream("YourAudioFile.wav").on('data', function(arrayBuffer) {
        pushStream.write(arrayBuffer.slice());
    }).on('end', function() {
        pushStream.close();
    });
 
    let audioConfig = sdk.AudioConfig.fromStreamInput(pushStream);
    let speechRecognizer = new sdk.SpeechRecognizer(speechConfig, audioConfig);
    speechRecognizer.recognizeOnceAsync(result => {
        console.log(`RECOGNIZED: Text=${result.text}`);
        speechRecognizer.close();
    });
}
fromStream();

使用推送流作為輸入假設音訊資料是原始脈衝編碼調變(PCM)資料,且會跳過任何標頭。 如果標頭沒有被跳過,API 在某些情況下仍然能運作。 為獲得最佳結果,請考慮實作讀取掉標頭的邏輯,讓 fs從音訊資料的開頭開始

處理錯誤

前面的例子只取得該 result.text 屬性中已識別的文字。 要處理錯誤和其他回應,你需要寫程式碼來處理結果。 以下程式碼評估該 result.reason 屬性:

  • 列印識別結果: ResultReason.RecognizedSpeech
  • 若無識別匹配,系統會通知使用者: ResultReason.NoMatch
  • 若遇到錯誤,會列印錯誤訊息: ResultReason.Canceled
switch (result.reason) {
    case sdk.ResultReason.RecognizedSpeech:
        console.log(`RECOGNIZED: Text=${result.text}`);
        break;
    case sdk.ResultReason.NoMatch:
        console.log("NOMATCH: Speech could not be recognized.");
        break;
    case sdk.ResultReason.Canceled:
        const cancellation = sdk.CancellationDetails.fromResult(result);
        console.log(`CANCELED: Reason=${cancellation.reason}`);

        if (cancellation.reason == sdk.CancellationReason.Error) {
            console.log(`CANCELED: ErrorCode=${cancellation.ErrorCode}`);
            console.log(`CANCELED: ErrorDetails=${cancellation.errorDetails}`);
            console.log("CANCELED: Did you set the speech resource key and endpoint values?");
        }
        break;
    }

使用連續識別

前述範例使用單次識別,該識別能識別單一語句。 單一語句的結束會透過接聽結尾的靜音來判斷,或直到處理最多 15 秒音訊為止。

相較之下,當你想控制何時停止辨識時,可以使用持續識別。 需要你訂閱 RecognizingRecognizedCanceled 活動,才能獲得識別結果。 要停止辨識,您必須呼叫 [stopContinuousRecognitionAsync] (/javascript/api/microsoft-cognitiveservices-speech-sdk/speechrecognizer#microsoft-cognitiveservices-speech-sdk-speechrecognizer-stopcontinuousrecognitionasync)。 這裡有一個連續辨識音訊輸入檔案的範例。

首先定義輸入並初始化:SpeechRecognizer

const speechRecognizer = new sdk.SpeechRecognizer(speechConfig, audioConfig);

接著,訂閱由 SpeechRecognizer 傳送的活動:

  • recognizing:包含中間識別結果的事件信號。
  • recognized:指示包含最終識別結果的事件,表示成功的識別嘗試。
  • sessionStopped:表示辨識工作階段 (作業) 結束之事件的信號。
  • canceled:包含已取消辨識結果之事件的信號。 這些結果表示因直接的取消要求而取消的辨識嘗試。 或者,它們表示傳輸或協定故障。
speechRecognizer.recognizing = (s, e) => {
    console.log(`RECOGNIZING: Text=${e.result.text}`);
};

speechRecognizer.recognized = (s, e) => {
    if (e.result.reason == sdk.ResultReason.RecognizedSpeech) {
        console.log(`RECOGNIZED: Text=${e.result.text}`);
    }
    else if (e.result.reason == sdk.ResultReason.NoMatch) {
        console.log("NOMATCH: Speech could not be recognized.");
    }
};

speechRecognizer.canceled = (s, e) => {
    console.log(`CANCELED: Reason=${e.reason}`);

    if (e.reason == sdk.CancellationReason.Error) {
        console.log(`"CANCELED: ErrorCode=${e.errorCode}`);
        console.log(`"CANCELED: ErrorDetails=${e.errorDetails}`);
        console.log("CANCELED: Did you set the speech resource key and endpoint values?");
    }

    speechRecognizer.stopContinuousRecognitionAsync();
};

speechRecognizer.sessionStopped = (s, e) => {
    console.log("\n    Session stopped event.");
    speechRecognizer.stopContinuousRecognitionAsync();
};

一切設定完成後,請呼叫 [startContinuousRecognitionAsync] (/javascript/api/microsoft-cognitiveservices-speech-sdk/speechrecognizer#microsoft-cognitiveservices-speech-sdk-speechrecognizer-startkeywordrecognitionasync) 開始辨識:

speechRecognizer.startContinuousRecognitionAsync();

// Make the following call at some point to stop recognition:
// speechRecognizer.stopContinuousRecognitionAsync();

更改原始語言

語音辨識的一項常見任務是指定輸入(或來源)語言。 以下範例說明如何將輸入語言改為義大利語。 在你的程式碼中,找到你的 SpeechConfig 實例,並在它下方直接加上這行:

speechConfig.speechRecognitionLanguage = "it-IT";

speechRecognitionLanguage 屬性預期有語言-區域格式字串。 有關支援的地點列表,請參見 語音服務的語言與語音支援

語言識別

當你需要在音訊來源中辨識語言並轉文字時,可以利用語音識別技術來辨識語言,然後將其轉為文字。

完整程式碼範例請參見 語言識別

使用自訂端點

透過 自訂語音,你可以上傳自己的資料、測試和訓練自訂模型、比較模型間的準確度,並將模型部署到自訂端點。 以下範例說明如何設定自訂端點。

var speechConfig = SpeechSDK.SpeechConfig.fromSubscription("YourSpeechResoureKey", "YourServiceRegion");
speechConfig.endpointId = "YourEndpointId";
var speechRecognizer = new SpeechSDK.SpeechRecognizer(speechConfig);

執行並使用容器

語音容器提供基於 websocket 的查詢端點 API,透過語音 SDK 與語音 CLI 存取。 預設情況下,語音 SDK 與語音 CLI 使用公開語音服務。 要使用容器,你需要更改初始化方法。 使用容器主機網址,而不是金鑰和區域。

欲了解更多容器資訊,請參閱安裝 並使用 Docker 執行語音容器的 Host URLS。

參考文件GitHub

在這份操作指南中,你將學習如何在 Foundry 工具中使用 Azure 語音進行即時語音轉文字轉換。 即時語音辨識非常適合需要即時轉錄的應用,例如語音輸入、客服中心協助,以及現場會議的字幕。

想了解如何為範例應用程式設置環境,請參閱 快速入門:辨識並將語音轉文字

建立語音配置實例

要使用 Speech SDK 呼叫 Speech 服務,你需要建立 一個 SpeechConfig 實例。 此類別包含關於語音資源的資訊,如金鑰及相關區域、端點、主機或授權令牌。

  1. Azure 入口網站建立 Foundry 的語音資源。 取得語音資源金鑰和區域。
  2. 使用你的語音鍵和區域建立一個 SpeechConfig 實例。
import com.microsoft.cognitiveservices.speech.*;
import com.microsoft.cognitiveservices.speech.audio.AudioConfig;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Future;

public class Program {
    public static void main(String[] args) throws InterruptedException, ExecutionException, URISyntaxException {
        SpeechConfig speechConfig = SpeechConfig.fromEndpoint(new URI("<paste-your-speech-endpoint>"), "<paste-your-speech-key>");
    }
}

你還可以用其他幾種方式初始化 SpeechConfig

  • 使用一個端點,並將語音服務端點傳遞進去。 金鑰或授權憑證是可選的。
  • 使用主機,並輸入主機位址。 金鑰或授權憑證是可選的。
  • 使用帶有對應區域/地點的授權令牌。

無論你是在進行語音辨識、語音合成、翻譯或意圖辨識,你總會建立一個設定。

辨識麥克風中的語音

要用你的裝置麥克風辨識語音,請使用該AudioConfig方法建立一個fromDefaultMicrophoneInput()實例。 接著透過傳遞 SpeechRecognizeraudioConfig來初始化物件config

import com.microsoft.cognitiveservices.speech.*;
import com.microsoft.cognitiveservices.speech.audio.AudioConfig;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Future;

public class Program {
    public static void main(String[] args) throws InterruptedException, ExecutionException, URISyntaxException {
        SpeechConfig speechConfig = SpeechConfig.fromEndpoint(new URI("<paste-your-speech-endpoint>"), "<paste-your-speech-key>");
        fromMic(speechConfig);
    }

    public static void fromMic(SpeechConfig speechConfig) throws InterruptedException, ExecutionException {
        AudioConfig audioConfig = AudioConfig.fromDefaultMicrophoneInput();
        SpeechRecognizer speechRecognizer = new SpeechRecognizer(speechConfig, audioConfig);

        System.out.println("Speak into your microphone.");
        Future<SpeechRecognitionResult> task = speechRecognizer.recognizeOnceAsync();
        SpeechRecognitionResult speechRecognitionResult = task.get();
        System.out.println("RECOGNIZED: Text=" + speechRecognitionResult.getText());
    }
}

如果你想使用 特定的 音訊輸入裝置,你需要在 AudioConfig 指定裝置 ID。 想了解如何取得裝置 ID,請參閱 使用 Speech SDK 選擇音訊輸入裝置

從檔案中辨識語音

如果你想從音訊檔案中辨識語音,而不是用麥克風,你仍然需要建立一個 AudioConfig 實例。 不過,您不會呼叫 FromDefaultMicrophoneInput()。 你呼叫 fromWavFileInput() 並傳遞檔案路徑:

import com.microsoft.cognitiveservices.speech.*;
import com.microsoft.cognitiveservices.speech.audio.AudioConfig;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Future;

public class Program {
    public static void main(String[] args) throws InterruptedException, ExecutionException, URISyntaxException {
        SpeechConfig speechConfig = SpeechConfig.fromEndpoint(new URI("<paste-your-speech-endpoint>"), "<paste-your-speech-key>");
        fromFile(speechConfig);
    }

    public static void fromFile(SpeechConfig speechConfig) throws InterruptedException, ExecutionException {
        AudioConfig audioConfig = AudioConfig.fromWavFileInput("YourAudioFile.wav");
        SpeechRecognizer speechRecognizer = new SpeechRecognizer(speechConfig, audioConfig);
        
        Future<SpeechRecognitionResult> task = speechRecognizer.recognizeOnceAsync();
        SpeechRecognitionResult speechRecognitionResult = task.get();
        System.out.println("RECOGNIZED: Text=" + speechRecognitionResult.getText());
    }
}

處理錯誤

前面的例子僅透過使用 speechRecognitionResult.getText() 取得辨識出的文字。 要處理錯誤和其他回應,你需要寫程式碼來處理結果。 以下範例將評估 speechRecognitionResult.getReason() 和:

  • 列印識別結果: ResultReason.RecognizedSpeech
  • 若無識別匹配,系統會通知使用者: ResultReason.NoMatch
  • 若遇到錯誤,會列印錯誤訊息: ResultReason.Canceled
switch (speechRecognitionResult.getReason()) {
    case ResultReason.RecognizedSpeech:
        System.out.println("We recognized: " + speechRecognitionResult.getText());
        exitCode = 0;
        break;
    case ResultReason.NoMatch:
        System.out.println("NOMATCH: Speech could not be recognized.");
        break;
    case ResultReason.Canceled: {
            CancellationDetails cancellation = CancellationDetails.fromResult(speechRecognitionResult);
            System.out.println("CANCELED: Reason=" + cancellation.getReason());

            if (cancellation.getReason() == CancellationReason.Error) {
                System.out.println("CANCELED: ErrorCode=" + cancellation.getErrorCode());
                System.out.println("CANCELED: ErrorDetails=" + cancellation.getErrorDetails());
                System.out.println("CANCELED: Did you set the speech resource key and region values?");
            }
        }
        break;
}

使用連續識別

前述範例使用單次識別,該識別能識別單一語句。 單一語句的結束會透過接聽結尾的靜音來判斷,或直到處理最多 15 秒音訊為止。

相較之下,當你想控制何時停止識別時,會使用持續識別。 需要你訂閱 recognizingrecognizedcanceled 活動,才能獲得識別結果。 要停止辨識,你必須撥打 stopContinuousRecognitionAsync。 這裡有一個可以對音訊輸入檔案進行連續辨識的範例。

首先定義輸入並初始化:SpeechRecognizer

AudioConfig audioConfig = AudioConfig.fromWavFileInput("YourAudioFile.wav");
SpeechRecognizer speechRecognizer = new SpeechRecognizer(config, audioConfig);

接著,建立一個變數來管理語音辨識的狀態。 在類別作用域內定義一個 Semaphore 實例:

private static Semaphore stopTranslationWithFileSemaphore;

然後,訂閱由 SpeechRecognizer 發送的事件:

  • recognizing:包含中間識別結果的事件信號。
  • recognized:指示包含最終識別結果的事件,表示成功的識別嘗試。
  • sessionStopped:表示辨識工作階段 (作業) 結束之事件的信號。
  • canceled:包含已取消辨識結果之事件的信號。 這些結果表示因直接的取消要求而取消的辨識嘗試。 或者,它們表示傳輸或協定故障。
// First initialize the semaphore.
stopTranslationWithFileSemaphore = new Semaphore(0);

speechRecognizer.recognizing.addEventListener((s, e) -> {
    System.out.println("RECOGNIZING: Text=" + e.getResult().getText());
});

speechRecognizer.recognized.addEventListener((s, e) -> {
    if (e.getResult().getReason() == ResultReason.RecognizedSpeech) {
        System.out.println("RECOGNIZED: Text=" + e.getResult().getText());
    }
    else if (e.getResult().getReason() == ResultReason.NoMatch) {
        System.out.println("NOMATCH: Speech could not be recognized.");
    }
});

speechRecognizer.canceled.addEventListener((s, e) -> {
    System.out.println("CANCELED: Reason=" + e.getReason());

    if (e.getReason() == CancellationReason.Error) {
        System.out.println("CANCELED: ErrorCode=" + e.getErrorCode());
        System.out.println("CANCELED: ErrorDetails=" + e.getErrorDetails());
        System.out.println("CANCELED: Did you set the speech resource key and region values?");
    }

    stopTranslationWithFileSemaphore.release();
});

speechRecognizer.sessionStopped.addEventListener((s, e) -> {
    System.out.println("\n    Session stopped event.");
    stopTranslationWithFileSemaphore.release();
});

一切設置妥當後,呼叫 startContinuousRecognitionAsync 以開始進行識別操作。

// Starts continuous recognition. Uses StopContinuousRecognitionAsync() to stop recognition.
speechRecognizer.startContinuousRecognitionAsync().get();

// Waits for completion.
stopTranslationWithFileSemaphore.acquire();

// Stops recognition.
speechRecognizer.stopContinuousRecognitionAsync().get();

更改原始語言

語音辨識的一項常見任務是指定輸入(或來源)語言。 以下範例展示了如何將輸入語言改為法語。 在你的程式碼中,找到你的 SpeechConfig 實例,並在它正下方加上這行:

config.setSpeechRecognitionLanguage("fr-FR");

setSpeechRecognitionLanguage 是一個參數,將字串作為參數。 請參閱 支援的語音轉文字區域列表

語言識別

當你需要在音訊來源中辨識語言並轉文字時,可以利用語音識別技術來辨識語言,然後將其轉為文字。

完整程式碼範例請參見 語言識別

使用自訂端點

透過 自訂語音,你可以上傳自己的資料、測試和訓練自訂模型、比較模型間的準確度,並將模型部署到自訂端點。 以下範例展示了如何設定自訂端點:

SpeechConfig speechConfig = SpeechConfig.FromSubscription("YourSpeechKey", "YourServiceRegion");
speechConfig.setEndpointId("YourEndpointId");
SpeechRecognizer speechRecognizer = new SpeechRecognizer(speechConfig);

執行並使用容器

語音容器提供基於 websocket 的查詢端點 API,透過語音 SDK 與語音 CLI 存取。 預設情況下,語音 SDK 與語音 CLI 使用公開語音服務。 要使用容器,你需要更改初始化方法。 使用容器主機網址,而不是金鑰和區域。

欲了解更多容器資訊,請參閱安裝 並使用 Docker 執行語音容器的 Host URLS。

語意分割

語意分割是一種語音辨識分割策略,旨在減輕靜默分割所帶來的問題:

  • 分段不足:當使用者長時間無停頓地說話時,會看到一長串無間斷的文字(「文字牆」),這嚴重降低了可讀性。
  • 過度分段:當使用者短暫暫停時,靜音偵測機制可能會錯誤分段。

語意分割不僅依賴靜默逾時,而是在偵測到句尾標點符號(如「.」或「?」)時,會對最終結果進行分段並回傳。 這提升了使用者體驗,提供更高品質且語意完整的片段,並避免冗長的中間結果。

若要使用語意分段,您需要在用來建立 SpeechConfigSpeechRecognizer 執行個體上設定以下屬性:

speechConfig.SetProperty(PropertyId.Speech_SegmentationStrategy, "Semantic");

語意分割的一些限制如下:

  • 你需要使用 Speech SDK 1.41 或更新版本才能使用語意分割。
  • 語意分割僅用於 連續識別。 這包括語音輸入和字幕等情境。 它不應該用於單一識別模式或互動情境。
  • 語意分割並非適用於所有語言和地區。
  • 語意分割尚未支援信心分數和NBest清單。 因此,如果你使用信心分數或 NBest 清單,我們不建議使用語意分割。

串流後最佳化

串流後的精煉能讓你在不影響首個標記延遲的情況下,獲得更精確的即時 轉錄 最終結果。 它會與即時串流並行執行第二次識別,因此中間結果和部分結果都能維持低延遲。 只有最終結果會被更準確、使用更廣泛音頻脈絡的版本取代。

單語串流後最佳化已正式推出。 多語言的串流後優化功能正在公開預覽中。

能力 單語串流後精修 多語言串流後精煉
Availability 普遍可用 公開預覽
語言範圍 每個識別會話設定一個區域 同一會話支援多種語言,包括語言切換
語言配置 設定識別地點 使用開放範圍自動語言偵測,無需候選語言清單
片語清單 支援 公開預覽期間不支援
分段標記 支援 支援

若要啟用串流後的優化,請在 SpeechServiceResponse_PostProcessingOption 實例上設定 SpeechConfig 屬性:

speechConfig->SetProperty(PropertyId::SpeechServiceResponse_PostProcessingOption, "PostRefinement");
speechConfig.SetProperty(PropertyId.SpeechServiceResponse_PostProcessingOption, "PostRefinement");
speechConfig.setProperty(PropertyId.SpeechServiceResponse_PostProcessingOption, "PostRefinement");
speech_config.set_property(
    speechsdk.PropertyId.SpeechServiceResponse_PostProcessingOption,
    "PostRefinement"
)

多語言串流後精修(預覽)

串流後的精細化支援多語言辨識,因此單一音訊串流可以跨越多種語言,包括在對話中切換語言。 單一多語言模型會直接辨識語言,因此你不需要設定語言識別模式或提供候選語言清單。 若要啟用多語言路徑,請將 SpeechServiceResponse_PostProcessingOption 設為 PostRefinement,並在建立 AutoDetectSourceLanguageConfig 時傳入已設定為自動語言偵測的 SpeechRecognizer

多語言後串流精煉需使用 Speech SDK 1.50 或更新版本,且僅透過 Speech SDK 提供。

在公開預覽期間,短語列表無法支援多語言的串流後細膩調整。

speechConfig->SetProperty(PropertyId::SpeechServiceResponse_PostProcessingOption, "PostRefinement");

auto autoDetectSourceLanguageConfig = AutoDetectSourceLanguageConfig::FromOpenRange();

auto recognizer = SpeechRecognizer::FromConfig(speechConfig, autoDetectSourceLanguageConfig, audioConfig);
speechConfig.SetProperty(PropertyId.SpeechServiceResponse_PostProcessingOption, "PostRefinement");

var autoDetectSourceLanguageConfig = AutoDetectSourceLanguageConfig.FromOpenRange();

var recognizer = new SpeechRecognizer(speechConfig, autoDetectSourceLanguageConfig, audioConfig);
speechConfig.setProperty(PropertyId.SpeechServiceResponse_PostProcessingOption, "PostRefinement");

AutoDetectSourceLanguageConfig autoDetectSourceLanguageConfig =
    AutoDetectSourceLanguageConfig.fromOpenRange();

SpeechRecognizer recognizer =
    new SpeechRecognizer(speechConfig, autoDetectSourceLanguageConfig, audioConfig);
speech_config.set_property(
    speechsdk.PropertyId.SpeechServiceResponse_PostProcessingOption,
    "PostRefinement"
)

auto_detect_source_language_config = speechsdk.languageconfig.AutoDetectSourceLanguageConfig()

recognizer = speechsdk.SpeechRecognizer(
    speech_config=speech_config,
    auto_detect_source_language_config=auto_detect_source_language_config,
    audio_config=audio_config)

在公開預覽期間,多語言後續優化可支援25種語言:阿拉伯語、中文、捷克語、丹麥語、荷蘭語、英語、芬蘭語、法語、德語、希臘語、希伯來語、印地語、匈牙利語、印尼語、義大利語、日語、韓語、挪威博克馬爾語、波蘭語、葡萄牙語、俄語、西班牙語、瑞典語、泰語及土耳其語。 因為服務會自動偵測口語,所以你不需要設定地點。 使用不受支援的語言所錄製的音訊可能會產生意想不到的結果。 關於支援單語及多語後串流精煉的特定地點,請參見 語音轉文字語言支援

後串流精簡的一些重要考量:

  • 串流後優化最適用於較長的語音內容,例如對話、會議與聽寫。 對於非常短的詞句,精煉後的結果可能與標準結果相同。
  • 串流後精煉與 TrueText 是同一 SpeechServiceResponse_PostProcessingOption 屬性的不同值。 一次只能設定一個值。
  • 單語和多語後串流精煉在 Azure 區域可用性上有所不同。

欲了解更多後製選項,請參閱如何使用後製。

重要

在多語言的後期精煉中,有些地點可能沒有顯著的品質提升,結果也可能與標準識別時所見不同。

參考文件Package (NuGet) GitHub

在這份操作指南中,你將學習如何在 Foundry 工具中使用 Azure 語音進行即時語音轉文字轉換。 即時語音辨識非常適合需要即時轉錄的應用,例如語音輸入、客服中心協助,以及現場會議的字幕。

想了解如何為範例應用程式設置環境,請參閱 快速入門:辨識並將語音轉文字

建立語音配置實例

要使用 Speech SDK 呼叫語音服務,你需要建立一個 SpeechConfig 實例。 此類別包含關於語音資源的資訊,如金鑰及相關區域、端點、主機或授權令牌。

  1. Azure 入口網站建立 Foundry 的語音資源。 獲取語音資源金鑰和端點。
  2. 請使用以下程式碼建立實 SpeechConfig 例。 將 YourSpeechKeyYourSpeechEndpoint 替換成你的語音資源金鑰和端點。
using namespace std;
using namespace Microsoft::CognitiveServices::Speech;

auto speechConfig = SpeechConfig::FromEndpoint("YourServiceEndpoint", "YourSpeechResourceKey");

你還可以用其他幾種方式初始化 SpeechConfig

  • 使用一個端點,並將語音服務端點傳遞進去。 金鑰或授權憑證是可選的。
  • 使用主機,並輸入主機位址。 金鑰或授權憑證是可選的。
  • 使用帶有對應區域/地點的授權令牌。

無論你是在進行語音辨識、語音合成或翻譯,你總是會建立一個設定。

辨識麥克風中的語音

要使用裝置麥克風辨識語音,請使用 AudioConfig 成員函數來建立 FromDefaultMicrophoneInput() 實例。 接著透過傳遞 SpeechRecognizeraudioConfig來初始化物件config

using namespace Microsoft::CognitiveServices::Speech::Audio;

auto audioConfig = AudioConfig::FromDefaultMicrophoneInput();
auto speechRecognizer = SpeechRecognizer::FromConfig(config, audioConfig);

cout << "Speak into your microphone." << std::endl;
auto result = speechRecognizer->RecognizeOnceAsync().get();
cout << "RECOGNIZED: Text=" << result->Text << std::endl;

如果你想使用 特定的 音訊輸入裝置,你需要在 AudioConfig 指定裝置 ID。 想了解如何取得裝置 ID,請參閱 使用 Speech SDK 選擇音訊輸入裝置

從檔案中辨識語音

如果你想從音訊檔案中辨識語音,而不是用麥克風,你仍然需要建立一個 AudioConfig 實例。 不過,您不會呼叫 FromDefaultMicrophoneInput()。 你呼叫 FromWavFileInput() 並傳遞檔案路徑:

using namespace Microsoft::CognitiveServices::Speech::Audio;

auto audioConfig = AudioConfig::FromWavFileInput("YourAudioFile.wav");
auto speechRecognizer = SpeechRecognizer::FromConfig(config, audioConfig);

auto result = speechRecognizer->RecognizeOnceAsync().get();
cout << "RECOGNIZED: Text=" << result->Text << std::endl;

透過使用 Recognizer 類別來辨識語音

C++ 語音 SDK 的 Recognizer 類別 提供了幾種可用於語音辨識的方法。

單發識別

單次辨識會以非同步方式辨識單一語句。 單一語句的結束會透過接聽結尾的靜音來判斷,或直到處理最多 15 秒音訊為止。 以下是透過 RecognizeOnceAsync 進行非同步單次辨識的範例:

auto result = speechRecognizer->RecognizeOnceAsync().get();

你需要寫一些程式碼來處理這個結果。 此範例會評估 result->Reason 並且:

  • 列印識別結果: ResultReason::RecognizedSpeech
  • 若無識別匹配,系統會通知使用者: ResultReason::NoMatch
  • 若遇到錯誤,會列印錯誤訊息: ResultReason::Canceled
switch (result->Reason)
{
    case ResultReason::RecognizedSpeech:
        cout << "We recognized: " << result->Text << std::endl;
        break;
    case ResultReason::NoMatch:
        cout << "NOMATCH: Speech could not be recognized." << std::endl;
        break;
    case ResultReason::Canceled:
        {
            auto cancellation = CancellationDetails::FromResult(result);
            cout << "CANCELED: Reason=" << (int)cancellation->Reason << std::endl;
    
            if (cancellation->Reason == CancellationReason::Error) {
                cout << "CANCELED: ErrorCode= " << (int)cancellation->ErrorCode << std::endl;
                cout << "CANCELED: ErrorDetails=" << cancellation->ErrorDetails << std::endl;
                cout << "CANCELED: Did you set the speech resource key and endpoint values?" << std::endl;
            }
        }
        break;
    default:
        break;
}

持續識別

連續辨識比單發辨識更複雜一些。 需要你訂閱 RecognizingRecognizedCanceled 活動,才能獲得識別結果。 要停止辨識,您必須呼叫 StopContinuousRecognitionAsync。 這裡有一個連續辨識音訊輸入檔案的範例。

首先定義輸入並初始化:SpeechRecognizer

auto audioConfig = AudioConfig::FromWavFileInput("YourAudioFile.wav");
auto speechRecognizer = SpeechRecognizer::FromConfig(config, audioConfig);

接著,建立一個變數來管理語音辨識的狀態。 宣告 promise<void> ,因為在識別開始時,你可以放心地假設它還沒完成:

promise<void> recognitionEnd;

然後,訂閱由 SpeechRecognizer 發送的事件:

  • Recognizing:包含中間識別結果的事件信號。
  • Recognized:指示包含最終識別結果的事件,表示成功的識別嘗試。
  • SessionStopped:表示辨識工作階段 (作業) 結束之事件的信號。
  • Canceled:包含已取消辨識結果之事件的信號。 這些結果表示因直接的取消要求而取消的辨識嘗試。 或者,它們表示傳輸或協定故障。
speechRecognizer->Recognizing.Connect([](const SpeechRecognitionEventArgs& e)
    {
        cout << "Recognizing:" << e.Result->Text << std::endl;
    });

speechRecognizer->Recognized.Connect([](const SpeechRecognitionEventArgs& e)
    {
        if (e.Result->Reason == ResultReason::RecognizedSpeech)
        {
            cout << "RECOGNIZED: Text=" << e.Result->Text 
                 << " (text could not be translated)" << std::endl;
        }
        else if (e.Result->Reason == ResultReason::NoMatch)
        {
            cout << "NOMATCH: Speech could not be recognized." << std::endl;
        }
    });

speechRecognizer->Canceled.Connect([&recognitionEnd](const SpeechRecognitionCanceledEventArgs& e)
    {
        cout << "CANCELED: Reason=" << (int)e.Reason << std::endl;
        if (e.Reason == CancellationReason::Error)
        {
            cout << "CANCELED: ErrorCode=" << (int)e.ErrorCode << "\n"
                 << "CANCELED: ErrorDetails=" << e.ErrorDetails << "\n"
                 << "CANCELED: Did you set the speech resource key and endpoint values?" << std::endl;

            recognitionEnd.set_value(); // Notify to stop recognition.
        }
    });

speechRecognizer->SessionStopped.Connect([&recognitionEnd](const SessionEventArgs& e)
    {
        cout << "Session stopped.";
        recognitionEnd.set_value(); // Notify to stop recognition.
    });

一切設置妥當後,呼叫 StartContinuousRecognitionAsync 以開始進行識別操作。

// Starts continuous recognition. Uses StopContinuousRecognitionAsync() to stop recognition.
speechRecognizer->StartContinuousRecognitionAsync().get();

// Waits for recognition end.
recognitionEnd.get_future().get();

// Stops recognition.
speechRecognizer->StopContinuousRecognitionAsync().get();

更改原始語言

語音辨識的一項常見任務是指定輸入(或來源)語言。 以下範例展示了如何將輸入語言改為德語。 在你的程式碼中,找到你的 SpeechConfig 實例,並在它下方直接加上這行:

speechConfig->SetSpeechRecognitionLanguage("de-DE");

SetSpeechRecognitionLanguage 是一個參數,將字串作為參數。 有關支援的地點列表,請參見 語音服務的語言與語音支援

語言識別

當你需要在音訊來源中辨識語言並轉文字時,可以利用語音識別技術來辨識語言,然後將其轉為文字。

完整程式碼範例請參見 語言識別

使用自訂端點

透過 自訂語音,你可以上傳自己的資料、測試和訓練自訂模型、比較模型間的準確度,並將模型部署到自訂端點。 以下範例說明如何設定自訂端點。

auto speechConfig = SpeechConfig::FromEndpoint("YourServiceEndpoint", "YourSpeechResourceKey");
speechConfig->SetEndpointId("YourEndpointId");
auto speechRecognizer = SpeechRecognizer::FromConfig(speechConfig);

執行並使用容器

語音容器提供基於 websocket 的查詢端點 API,透過語音 SDK 與語音 CLI 存取。 預設情況下,語音 SDK 與語音 CLI 使用公開語音服務。 要使用容器,你需要更改初始化方法。 使用容器主機 URL 代替金鑰和端點。

欲了解更多容器資訊,請參閱安裝 並使用 Docker 執行語音容器的 Host URLS。

語意分割

語意分割是一種語音辨識分割策略,旨在減輕靜默分割所帶來的問題:

  • 分段不足:當使用者長時間無停頓地說話時,會看到一長串無間斷的文字(「文字牆」),這嚴重降低了可讀性。
  • 過度分段:當使用者短暫暫停時,靜音偵測機制可能會錯誤分段。

語意分割不僅依賴靜默逾時,而是在偵測到句尾標點符號(如「.」或「?」)時,會對最終結果進行分段並回傳。 這提升了使用者體驗,提供更高品質且語意完整的片段,並避免冗長的中間結果。

若要使用語意分段,您需要在用來建立 SpeechConfigSpeechRecognizer 執行個體上設定以下屬性:

speechConfig->SetProperty(PropertyId::Speech_SegmentationStrategy, "Semantic");

語意分割的一些限制如下:

  • 你需要使用 Speech SDK 1.41 或更新版本才能使用語意分割。
  • 語意分割僅用於 連續識別。 這包括語音輸入和字幕等情境。 它不應該用於單一識別模式或互動情境。
  • 語意分割並非適用於所有語言和地區。
  • 語意分割尚未支援信心分數和NBest清單。 因此,如果你使用信心分數或 NBest 清單,我們不建議使用語意分割。

串流後最佳化

串流後的精煉能讓你在不影響首個標記延遲的情況下,獲得更精確的即時 轉錄 最終結果。 它會與即時串流並行執行第二次識別,因此中間結果和部分結果都能維持低延遲。 只有最終結果會被更準確、使用更廣泛音頻脈絡的版本取代。

單語串流後最佳化已正式推出。 多語言的串流後優化功能正在公開預覽中。

能力 單語串流後精修 多語言串流後精煉
Availability 普遍可用 公開預覽
語言範圍 每個識別會話設定一個區域 同一會話支援多種語言,包括語言切換
語言配置 設定識別地點 使用開放範圍自動語言偵測,無需候選語言清單
片語清單 支援 公開預覽期間不支援
分段標記 支援 支援

若要啟用串流後的優化,請在 SpeechServiceResponse_PostProcessingOption 實例上設定 SpeechConfig 屬性:

speechConfig->SetProperty(PropertyId::SpeechServiceResponse_PostProcessingOption, "PostRefinement");
speechConfig.SetProperty(PropertyId.SpeechServiceResponse_PostProcessingOption, "PostRefinement");
speechConfig.setProperty(PropertyId.SpeechServiceResponse_PostProcessingOption, "PostRefinement");
speech_config.set_property(
    speechsdk.PropertyId.SpeechServiceResponse_PostProcessingOption,
    "PostRefinement"
)

多語言串流後精修(預覽)

串流後的精細化支援多語言辨識,因此單一音訊串流可以跨越多種語言,包括在對話中切換語言。 單一多語言模型會直接辨識語言,因此你不需要設定語言識別模式或提供候選語言清單。 若要啟用多語言路徑,請將 SpeechServiceResponse_PostProcessingOption 設為 PostRefinement,並在建立 AutoDetectSourceLanguageConfig 時傳入已設定為自動語言偵測的 SpeechRecognizer

多語言後串流精煉需使用 Speech SDK 1.50 或更新版本,且僅透過 Speech SDK 提供。

在公開預覽期間,短語列表無法支援多語言的串流後細膩調整。

speechConfig->SetProperty(PropertyId::SpeechServiceResponse_PostProcessingOption, "PostRefinement");

auto autoDetectSourceLanguageConfig = AutoDetectSourceLanguageConfig::FromOpenRange();

auto recognizer = SpeechRecognizer::FromConfig(speechConfig, autoDetectSourceLanguageConfig, audioConfig);
speechConfig.SetProperty(PropertyId.SpeechServiceResponse_PostProcessingOption, "PostRefinement");

var autoDetectSourceLanguageConfig = AutoDetectSourceLanguageConfig.FromOpenRange();

var recognizer = new SpeechRecognizer(speechConfig, autoDetectSourceLanguageConfig, audioConfig);
speechConfig.setProperty(PropertyId.SpeechServiceResponse_PostProcessingOption, "PostRefinement");

AutoDetectSourceLanguageConfig autoDetectSourceLanguageConfig =
    AutoDetectSourceLanguageConfig.fromOpenRange();

SpeechRecognizer recognizer =
    new SpeechRecognizer(speechConfig, autoDetectSourceLanguageConfig, audioConfig);
speech_config.set_property(
    speechsdk.PropertyId.SpeechServiceResponse_PostProcessingOption,
    "PostRefinement"
)

auto_detect_source_language_config = speechsdk.languageconfig.AutoDetectSourceLanguageConfig()

recognizer = speechsdk.SpeechRecognizer(
    speech_config=speech_config,
    auto_detect_source_language_config=auto_detect_source_language_config,
    audio_config=audio_config)

在公開預覽期間,多語言後續優化可支援25種語言:阿拉伯語、中文、捷克語、丹麥語、荷蘭語、英語、芬蘭語、法語、德語、希臘語、希伯來語、印地語、匈牙利語、印尼語、義大利語、日語、韓語、挪威博克馬爾語、波蘭語、葡萄牙語、俄語、西班牙語、瑞典語、泰語及土耳其語。 因為服務會自動偵測口語,所以你不需要設定地點。 使用不受支援的語言所錄製的音訊可能會產生意想不到的結果。 關於支援單語及多語後串流精煉的特定地點,請參見 語音轉文字語言支援

後串流精簡的一些重要考量:

  • 串流後優化最適用於較長的語音內容,例如對話、會議與聽寫。 對於非常短的詞句,精煉後的結果可能與標準結果相同。
  • 串流後精煉與 TrueText 是同一 SpeechServiceResponse_PostProcessingOption 屬性的不同值。 一次只能設定一個值。
  • 單語和多語後串流精煉在 Azure 區域可用性上有所不同。

欲了解更多後製選項,請參閱如何使用後製。

重要

在多語言的後期精煉中,有些地點可能沒有顯著的品質提升,結果也可能與標準識別時所見不同。

參考文件套件(Go)GitHub 上的額外樣本

在這份操作指南中,你將學習如何在 Foundry 工具中使用 Azure 語音進行即時語音轉文字轉換。 即時語音辨識非常適合需要即時轉錄的應用,例如語音輸入、客服中心協助,以及現場會議的字幕。

想了解如何為範例應用程式設置環境,請參閱 快速入門:辨識並將語音轉文字

藉由麥克風將語音辨識為文字

  1. Azure 入口網站建立 Foundry 的語音資源。 取得語音資源金鑰和區域。
  2. 請使用以下程式碼範例,從預設裝置麥克風執行語音辨識。 用你的語音資源鍵和區域替換 YourSpeechKeyYourSpeechRegion 。 執行腳本會啟動預設麥克風的識別會話,並輸出文字:
package main

import (
	"bufio"
	"fmt"
	"os"

	"github.com/Microsoft/cognitive-services-speech-sdk-go/audio"
	"github.com/Microsoft/cognitive-services-speech-sdk-go/speech"
)

func sessionStartedHandler(event speech.SessionEventArgs) {
	defer event.Close()
	fmt.Println("Session Started (ID=", event.SessionID, ")")
}

func sessionStoppedHandler(event speech.SessionEventArgs) {
	defer event.Close()
	fmt.Println("Session Stopped (ID=", event.SessionID, ")")
}

func recognizingHandler(event speech.SpeechRecognitionEventArgs) {
	defer event.Close()
	fmt.Println("Recognizing:", event.Result.Text)
}

func recognizedHandler(event speech.SpeechRecognitionEventArgs) {
	defer event.Close()
	fmt.Println("Recognized:", event.Result.Text)
}

func cancelledHandler(event speech.SpeechRecognitionCanceledEventArgs) {
	defer event.Close()
	fmt.Println("Received a cancellation: ", event.ErrorDetails)
	fmt.Println("Did you set the speech resource key and region values?")
}

func main() {
    subscription :=  "YourSpeechKey"
    region := "YourSpeechRegion"

	audioConfig, err := audio.NewAudioConfigFromDefaultMicrophoneInput()
	if err != nil {
		fmt.Println("Got an error: ", err)
		return
	}
	defer audioConfig.Close()
	config, err := speech.NewSpeechConfigFromSubscription(subscription, region)
	if err != nil {
		fmt.Println("Got an error: ", err)
		return
	}
	defer config.Close()
	speechRecognizer, err := speech.NewSpeechRecognizerFromConfig(config, audioConfig)
	if err != nil {
		fmt.Println("Got an error: ", err)
		return
	}
	defer speechRecognizer.Close()
	speechRecognizer.SessionStarted(sessionStartedHandler)
	speechRecognizer.SessionStopped(sessionStoppedHandler)
	speechRecognizer.Recognizing(recognizingHandler)
	speechRecognizer.Recognized(recognizedHandler)
	speechRecognizer.Canceled(cancelledHandler)
	speechRecognizer.StartContinuousRecognitionAsync()
	defer speechRecognizer.StopContinuousRecognitionAsync()
	bufio.NewReader(os.Stdin).ReadBytes('\n')
}

執行以下指令建立一個 go.mod 檔案,連結到 GitHub 上託管的元件:

go mod init quickstart
go get github.com/Microsoft/cognitive-services-speech-sdk-go

現在開始編譯並執行程式碼:

go build
go run quickstart

詳細資訊請參閱參考資料,SpeechConfig class 以及 SpeechRecognizer class

從音訊檔案中辨識語音轉文字

請使用以下範例從音訊檔案執行語音辨識。 用你的語音資源鍵和區域替換 YourSpeechKeyYourSpeechRegion 。 此外,將變數 file 替換為 .wav 檔案的路徑。 當你執行腳本時,它會從檔案中辨識語音並輸出文字結果:

package main

import (
	"fmt"
	"time"

	"github.com/Microsoft/cognitive-services-speech-sdk-go/audio"
	"github.com/Microsoft/cognitive-services-speech-sdk-go/speech"
)

func main() {
    subscription :=  "YourSpeechKey"
    region := "YourSpeechRegion"
    file := "path/to/file.wav"

	audioConfig, err := audio.NewAudioConfigFromWavFileInput(file)
	if err != nil {
		fmt.Println("Got an error: ", err)
		return
	}
	defer audioConfig.Close()
	config, err := speech.NewSpeechConfigFromSubscription(subscription, region)
	if err != nil {
		fmt.Println("Got an error: ", err)
		return
	}
	defer config.Close()
	speechRecognizer, err := speech.NewSpeechRecognizerFromConfig(config, audioConfig)
	if err != nil {
		fmt.Println("Got an error: ", err)
		return
	}
	defer speechRecognizer.Close()
	speechRecognizer.SessionStarted(func(event speech.SessionEventArgs) {
		defer event.Close()
		fmt.Println("Session Started (ID=", event.SessionID, ")")
	})
	speechRecognizer.SessionStopped(func(event speech.SessionEventArgs) {
		defer event.Close()
		fmt.Println("Session Stopped (ID=", event.SessionID, ")")
	})

	task := speechRecognizer.RecognizeOnceAsync()
	var outcome speech.SpeechRecognitionOutcome
	select {
	case outcome = <-task:
	case <-time.After(5 * time.Second):
		fmt.Println("Timed out")
		return
	}
	defer outcome.Close()
	if outcome.Error != nil {
		fmt.Println("Got an error: ", outcome.Error)
	}
	fmt.Println("Got a recognition!")
	fmt.Println(outcome.Result.Text)
}

執行以下指令建立一個 go.mod 檔案,連結到 GitHub 上託管的元件:

go mod init quickstart
go get github.com/Microsoft/cognitive-services-speech-sdk-go

現在開始編譯並執行程式碼:

go build
go run quickstart

詳細資訊請參閱參考資料,SpeechConfig class 以及 SpeechRecognizer class

執行並使用容器

語音容器提供基於 websocket 的查詢端點 API,透過語音 SDK 與語音 CLI 存取。 預設情況下,語音 SDK 與語音 CLI 使用公開語音服務。 要使用容器,你需要更改初始化方法。 使用容器主機網址,而不是金鑰和區域。

欲了解更多容器資訊,請參閱安裝 並使用 Docker 執行語音容器的 Host URLS。

參考文件 | 下載套件 | 在GitHub上的額外範例

在這份操作指南中,你將學習如何在 Foundry 工具中使用 Azure 語音進行即時語音轉文字轉換。 即時語音辨識非常適合需要即時轉錄的應用,例如語音輸入、客服中心協助,以及現場會議的字幕。

想了解如何為範例應用程式設置環境,請參閱 快速入門:辨識並將語音轉文字

安裝語音 SDK 與範例

Azure-Samples/cognitive-services-speech-sdk 儲存庫包含 iOS 與 Mac Objective-C 撰寫的範例。 請選擇連結查看每個樣品的安裝說明:

欲了解更多資訊,請參閱 Objective-C 的 Speech SDK 參考

使用自訂端點

透過 自訂語音,你可以上傳自己的資料、測試和訓練自訂模型、比較模型間的準確度,並將模型部署到自訂端點。 以下範例展示了如何設定自訂端點:

SPXSpeechConfiguration *speechConfig = [[SPXSpeechConfiguration alloc] initWithSubscription:"YourSpeechResoureKey" region:"YourServiceRegion"];
speechConfig.endpointId = "YourEndpointId";
SPXSpeechRecognizer* speechRecognizer = [[SPXSpeechRecognizer alloc] init:speechConfig];

執行並使用容器

語音容器提供基於 websocket 的查詢端點 API,透過語音 SDK 與語音 CLI 存取。 預設情況下,語音 SDK 與語音 CLI 使用公開語音服務。 要使用容器,你需要更改初始化方法。 使用容器主機網址,而不是金鑰和區域。

欲了解更多容器資訊,請參閱安裝 並使用 Docker 執行語音容器的 Host URLS。

在這份操作指南中,你將學習如何在 Foundry 工具中使用 Azure 語音進行即時語音轉文字轉換。 即時語音辨識非常適合需要即時轉錄的應用,例如語音輸入、客服中心協助,以及現場會議的字幕。

想了解如何為範例應用程式設置環境,請參閱 快速入門:辨識並將語音轉文字

辨識麥克風中的語音

插上電源並開啟你的電腦麥克風。 關閉所有可能同時使用麥克風的應用程式。 有些電腦內建麥克風,而有些則需要設定藍牙裝置。

現在你準備好執行語音 CLI 來辨識麥克風的語音了。 從命令列切換到包含 Speech CLI 二進位檔的目錄。 接著執行以下指令:

spx recognize --microphone

語音 CLI 預設為英文。 你可以 從語音轉文字表中選擇不同的語言。 例如,添加 --source de-DE 辨識德語語音。

對著麥克風說話,你就能即時看到你話語被轉錄成文字的過程。 語音 CLI 會在一段時間靜音後停止,或是當你選擇 Ctrl+C 時。

從檔案中辨識語音

語音 CLI 能辨識多種檔案格式與自然語言的語音。 在這個例子中,你可以使用任何包含英語語音的 .wav 檔案(16 kHz 或 8 kHz、16 位元和單聲道 PCM)。 或者如果你想快速試用,可以下載檔案 whatstheweatherlike.wav,然後複製到和 Speech CLI 二進位檔相同的資料夾。

請使用以下指令執行語音 CLI,以辨識音訊檔案中的語音:

spx recognize --file whatstheweatherlike.wav

語音 CLI 預設為英文。 你可以 從語音轉文字表中選擇不同的語言。 例如,添加 --source de-DE 辨識德語語音。

語音 CLI 會在螢幕上顯示語音的文字轉錄。

執行並使用容器

語音容器提供基於 websocket 的查詢端點 API,透過語音 SDK 與語音 CLI 存取。 預設情況下,語音 SDK 與語音 CLI 使用公開語音服務。 要使用容器,你需要更改初始化方法。 使用容器主機網址,而不是金鑰和區域。

欲了解更多容器資訊,請參閱安裝 並使用 Docker 執行語音容器的 Host URLS。

參考文件 | 下載套件 | 在GitHub上的額外範例

在這份操作指南中,你將學習如何在 Foundry 工具中使用 Azure 語音進行即時語音轉文字轉換。 即時語音辨識非常適合需要即時轉錄的應用,例如語音輸入、客服中心協助,以及現場會議的字幕。

想了解如何為範例應用程式設置環境,請參閱 快速入門:辨識並將語音轉文字

安裝語音 SDK 與範例

Azure-Samples/cognitive-services-speech-sdk 儲存庫包含以 Swift 撰寫的 iOS 與 Mac 範例。 請選擇連結查看每個樣品的安裝說明:

  • 在 macOS
  • 在 iOS 上的 Swift

欲了解更多資訊,請參閱 Objective-C 的 Speech SDK 參考

使用自訂端點

透過 自訂語音,你可以上傳自己的資料、測試和訓練自訂模型、比較模型間的準確度,並將模型部署到自訂端點。 以下範例展示了如何設定自訂端點:

let speechConfig = SPXSpeechConfiguration(subscription: "YourSpeechResoureKey", region: "YourServiceRegion");
speechConfig.endpointId = "YourEndpointId";
let speechRecognizer = SPXSpeechRecognizer(speechConfiguration: speechConfig);

執行並使用容器

語音容器提供基於 websocket 的查詢端點 API,透過語音 SDK 與語音 CLI 存取。 預設情況下,語音 SDK 與語音 CLI 使用公開語音服務。 要使用容器,你需要更改初始化方法。 使用容器主機網址,而不是金鑰和區域。

欲了解更多容器資訊,請參閱安裝 並使用 Docker 執行語音容器的 Host URLS。