相关文章推荐
想旅行的野马  ·  Android ...·  1 年前    · 
仗义的火车  ·  Debugging a Stack ...·  1 年前    · 

本操作指南介绍如何识别并转录人类语音(通常称为语音转文本)。

创建语音配置

若要使用语音 SDK 调用语音服务,需要创建 SpeechConfig 实例。 此类包含有关订阅的信息,例如密钥和关联的位置/区域、终结点、主机或授权令牌。

使用密钥和位置/区域创建 SpeechConfig 实例。 在 Azure 门户 中创建语音资源。 有关详细信息,请参阅 创建新的 Azure 认知服务资源

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.FromSubscription("YourSpeechKey", "YourSpeechRegion");

可以通过其他几种方式初始化 SpeechConfig

  • 使用终结点:传入语音服务终结点。 密钥或授权令牌是可选的。
  • 使用主机:传入主机地址。 密钥或授权令牌是可选的。
  • 使用授权令牌:传入授权令牌和关联的区域/位置。
  • 无论你是要执行语音识别、语音合成、翻译,还是意向识别,都需要创建一个配置。

    识别来自麦克风的语音

    若要使用设备麦克风识别语音,请使用 FromDefaultMicrophoneInput() 创建 AudioConfig 实例。 然后通过传递 audioConfigspeechConfig 初始化 SpeechRecognizer

    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 result = await speechRecognizer.RecognizeOnceAsync();
            Console.WriteLine($"RECOGNIZED: Text={result.Text}");
        async static Task Main(string[] args)
            var speechConfig = SpeechConfig.FromSubscription("YourSpeechKey", "YourSpeechRegion");
            await FromMic(speechConfig);
    

    如果你想使用特定的音频输入设备,则需要在 AudioConfig 中指定设备 ID。 了解如何获取音频输入设备的设备 ID

    从文件中识别语音

    如果要从音频文件(而不是麦克风)识别语音,仍需要创建 AudioConfig 实例。 但需要调用 FromWavFileInput()(而不是调用 FromDefaultMicrophoneInput())并传递文件路径:

    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 result = await speechRecognizer.RecognizeOnceAsync();
            Console.WriteLine($"RECOGNIZED: Text={result.Text}");
        async static Task Main(string[] args)
            var speechConfig = SpeechConfig.FromSubscription("YourSpeechKey", "YourSpeechRegion");
            await FromFile(speechConfig);
    

    识别来自内存中流的语音

    对于许多用例,你的音频数据可能来自 blob 存储,或者已经作为 byte[] 实例或类似的原始数据结构存在于内存中。 以下示例使用 PushAudioInputStream 来识别语音,语音本质上是抽象的内存流。 该示例代码执行下列操作:

  • 使用接受 byte[] 实例的 Write() 函数将原始音频数据 (PCM) 写入 PushAudioInputStream
  • 为了演示目的,请使用 FileReader 读取 .wav 文件。 如果 byte[] 实例中已有音频数据,则可以直接跳过此步骤,将内容写入输入流。
  • 默认格式是 16 位 16-KHz 单声道 PCM。 若要自定义格式,可以使用静态函数 AudioStreamFormat.GetWaveFormatPCM(sampleRate, (byte)bitRate, (byte)channels)AudioStreamFormat 对象传递给 CreatePushStream()
  • 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;
                readBytes = reader.ReadBytes(1024);
                audioConfigStream.Write(readBytes, readBytes.Length);
            } while (readBytes.Length > 0);
            var result = await speechRecognizer.RecognizeOnceAsync();
            Console.WriteLine($"RECOGNIZED: Text={result.Text}");
        async static Task Main(string[] args)
            var speechConfig = SpeechConfig.FromSubscription("YourSpeechKey", "YourSpeechRegion");
            await FromStream(speechConfig);
    

    使用推送流作为输入时,假定音频数据是原始 PCM 并跳过任何标头。 如果未跳过标头,API 在某些情况下仍可正常运行。 但为获得最佳结果,请考虑实现读取标头的逻辑,使 byte[]开始。

    前面的示例只是从 result.text 获取已识别的文本。 若要处理错误和其他响应,需要编写一些代码来处理结果。 以下代码评估 result.Reason 属性并:

  • 输出识别结果:ResultReason.RecognizedSpeech
  • 如果没有识别匹配项,则通知用户:ResultReason.NoMatch
  • 如果遇到错误,则输出错误消息:ResultReason.Canceled
  • switch (result.Reason)
        case ResultReason.RecognizedSpeech:
            Console.WriteLine($"RECOGNIZED: Text={result.Text}");
            break;
        case ResultReason.NoMatch:
            Console.WriteLine($"NOMATCH: Speech could not be recognized.");
            break;
        case 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 set the speech resource key and region 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 region 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.FromSubscription("YourSubscriptionKey", "YourServiceRegion");
    speechConfig.EndpointId = "YourEndpointId";
    var speechRecognizer = new SpeechRecognizer(speechConfig);
    

    更改静音的处理方式

    如果预计用户说话比平时更快或更慢,则输入音频中非语音静音的默认行为可能不会产生预期的结果。 静音处理的常见问题包括:

  • 快速语音将许多句子接在一起,会形成单个识别结果,而不是将句子分解成单独的结果
  • 慢速语音将单个句子的各部分划分成多个结果
  • 等待语音开始时,单次识别结束过快
  • 可以通过在用于创建 SpeechRecognizerSpeechConfig 上设置以下任一超时属性来解决这些问题:

  • 分段静音超时调整在当前朗读的短语被视为“完成”之前,该短语中允许的非语音音频量。
    • 较高的值通常会使结果更长,允许说话者在一个短语中有更长的停顿,但会使结果需要更长的时间才能到达,如果设置得过高,也可能使多个单独的短语组合成单个结果
    • 较低的值通常会使结果更短,并确保短语之间更及时和更频繁地中断,但如果设置得过低,也可能导致单个短语被分成多个结果
    • 此超时可以设置为 100 到 5000 之间的整数值(以毫秒为单位),典型默认值为 500
    • 初始静音超时调整在识别尝试以“不匹配”结果结束之前,在一个短语之前允许的非语音音频量。
    • 较高的值会给说话者更多的时间做出反应并开始说话,但当什么都不说时,响应速度也会变慢
    • 较低的值可确保提示“不匹配”,以获得更快的用户体验和更可控的音频处理,但如果设置得过低,可能会过快中断说话者
    • 因为连续识别会产生很多结果,因此此值决定了“不匹配”结果到达的频率,但不会影响识别结果的内容
    • 此超时可以设置为任何非负整数值(以毫秒为单位),或设置为 0 以完全禁用它;5000 是单次识别的典型默认值,而 15000 是连续识别的典型默认值
    • 由于在修改这些超时时需要权衡取舍,因此建议仅在观察到与静音处理相关的问题时更改设置。 默认值以最佳方式处理大多数语音音频,只有不常见的场景才会遇到问题。

      示例:用户说出诸如“ABC-123-4567”之类的序列号时,会在字符组之间停顿足够长的时间,以便将序列号分成多个结果。 在这种情况下,将分段静音超时设置为更高的值(例如 2000 毫秒)可能会有所帮助:

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

      示例:录制的演讲者的演讲速度足够快,可以将连续的几个句子组合在一起,而较大的识别结果每分钟只到达一到两次。 在这种情况下,将分段静音超时设置为较低的值(例如 300 毫秒)可能会有所帮助:

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

      示例:单次识别要求说话者查找和阅读序列号,但在查找序列号时结束得太快。 在这种情况下,较长的初始静音超时(例如 10000 毫秒)可能会有所帮助:

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

      参考文档包 (NuGet)GitHub 上的其他示例

      本操作指南介绍如何识别并转录人类语音(通常称为语音转文本)。

      创建语音配置

      若要使用语音 SDK 调用语音服务,需要创建 SpeechConfig 实例。 此类包含有关订阅的信息,例如密钥和关联的位置/区域、终结点、主机或授权令牌。

      使用密钥和区域创建 SpeechConfig 实例。 在 Azure 门户中创建语音资源。 有关详细信息,请参阅创建新的 Azure 认知服务资源

      using namespace std;
      using namespace Microsoft::CognitiveServices::Speech;
      auto speechConfig = SpeechConfig::FromSubscription("YourSpeechKey", "YourSpeechRegion");
      

      可以通过其他几种方式初始化 SpeechConfig

    • 使用终结点:传入语音服务终结点。 密钥或授权令牌是可选的。
    • 使用主机:传入主机地址。 密钥或授权令牌是可选的。
    • 使用授权令牌:传入授权令牌和关联的区域。
    • 无论你是要执行语音识别、语音合成、翻译,还是意向识别,都需要创建一个配置。

      识别来自麦克风的语音

      若要使用设备麦克风识别语音,请使用 FromDefaultMicrophoneInput() 创建 AudioConfig 实例。 然后通过传递 audioConfigconfig 初始化 SpeechRecognizer

      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

      从文件中识别语音

      如果要从音频文件(而不是使用麦克风)识别语音,仍需要创建 AudioConfig 实例。 但需要调用 FromWavFileInput()(而不是调用 FromDefaultMicrophoneInput())并传递文件路径:

      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 region 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 region 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.
      

      设置所有项后,调用 StopContinuousRecognitionAsync 开始识别:

      // 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::FromSubscription("YourSubscriptionKey", "YourServiceRegion");
      speechConfig->SetEndpointId("YourEndpointId");
      auto speechRecognizer = SpeechRecognizer::FromConfig(speechConfig);
      

      参考文档包 (Go)GitHub 上的其他示例

      本操作指南介绍如何识别并转录人类语音(通常称为语音转文本)。

      从麦克风识别语音转文本

      使用下面的代码示例从默认的设备麦克风运行语音识别。 将变量 subscriptionregion 分别替换为你的语音密钥和位置/区域。 在 Azure 门户中创建语音资源。 有关详细信息,请参阅创建新的 Azure 认知服务资源。 运行脚本将在默认麦克风上启动识别会话并输出文本。

      package main
      import (
      	"bufio"
      	"fmt"
      	"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 类的参考内容SpeechRecognizer 类的参考内容

      从音频文件识别语音转文本

      使用以下示例从音频文件运行语音识别。 将变量 subscriptionregion 分别替换为你的语音密钥和位置/区域。 在 Azure 门户中创建语音资源。 有关详细信息,请参阅创建新的 Azure 认知服务资源。 此外,将变量 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 类的参考内容SpeechRecognizer 类的参考内容

      参考文档 | GitHub 上的其他示例

      本操作指南介绍如何识别并转录人类语音(通常称为语音转文本)。

      创建语音配置

      若要使用语音 SDK 调用语音服务,需要创建 SpeechConfig 实例。 此类包含有关订阅的信息,例如密钥和关联的位置/区域、终结点、主机或授权令牌。

      使用密钥和位置/区域创建 SpeechConfig 实例。 在 Azure 门户中创建语音资源。 有关详细信息,请参阅创建新的 Azure 认知服务资源

      import com.microsoft.cognitiveservices.speech.*;
      import com.microsoft.cognitiveservices.speech.audio.AudioConfig;
      import java.util.concurrent.ExecutionException;
      import java.util.concurrent.Future;
      public class Program {
          public static void main(String[] args) throws InterruptedException, ExecutionException {
              SpeechConfig speechConfig = SpeechConfig.fromSubscription("<paste-your-subscription-key>", "<paste-your-region>");
      

      可以通过其他几种方式初始化 SpeechConfig

    • 使用终结点:传入语音服务终结点。 密钥或授权令牌是可选的。
    • 使用主机:传入主机地址。 密钥或授权令牌是可选的。
    • 使用授权令牌:传入授权令牌和关联的区域。
    • 无论你是要执行语音识别、语音合成、翻译,还是意向识别,都需要创建一个配置。

      识别来自麦克风的语音

      若要使用设备麦克风识别语音,请使用 fromDefaultMicrophoneInput() 创建 AudioConfig 实例。 然后通过传递 audioConfigconfig 初始化 SpeechRecognizer

      import com.microsoft.cognitiveservices.speech.*;
      import com.microsoft.cognitiveservices.speech.audio.AudioConfig;
      import java.util.concurrent.ExecutionException;
      import java.util.concurrent.Future;
      public class Program {
          public static void main(String[] args) throws InterruptedException, ExecutionException {
              SpeechConfig speechConfig = SpeechConfig.fromSubscription("<paste-your-subscription-key>", "<paste-your-region>");
              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 result = task.get();
              System.out.println("RECOGNIZED: Text=" + result.getText());
      

      如果你想使用特定的音频输入设备,则需要在 AudioConfig 中指定设备 ID。 了解如何获取音频输入设备的设备 ID

      从文件中识别语音

      如果要从音频文件(而不是使用麦克风)识别语音,仍需要创建 AudioConfig 实例。 但需要调用 fromWavFileInput()(而不是调用 fromDefaultMicrophoneInput())并传递文件路径:

      import com.microsoft.cognitiveservices.speech.*;
      import com.microsoft.cognitiveservices.speech.audio.AudioConfig;
      import java.util.concurrent.ExecutionException;
      import java.util.concurrent.Future;
      public class Program {
          public static void main(String[] args) throws InterruptedException, ExecutionException {
              SpeechConfig speechConfig = SpeechConfig.fromSubscription("<paste-your-subscription-key>", "<paste-your-region>");
              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 result = task.get();
              System.out.println("RECOGNIZED: Text=" + result.getText());
      

      前面的示例仅使用 result.getText() 获取已识别的文本。 若要处理错误和其他响应,需要编写一些代码来处理结果。 以下示例计算 result.getReason() 和:

    • 输出识别结果:ResultReason.RecognizedSpeech
    • 如果没有识别匹配项,则通知用户:ResultReason.NoMatch
    • 如果遇到错误,则输出错误消息:ResultReason.Canceled
    • switch (result.getReason()) {
          case ResultReason.RecognizedSpeech:
              System.out.println("We recognized: " + result.getText());
              exitCode = 0;
              break;
          case ResultReason.NoMatch:
              System.out.println("NOMATCH: Speech could not be recognized.");
              break;
          case ResultReason.Canceled: {
                  CancellationDetails cancellation = CancellationDetails.fromResult(result);
                  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("YourSubscriptionKey", "YourServiceRegion");
      speechConfig.setEndpointId("YourEndpointId");
      SpeechRecognizer speechRecognizer = new SpeechRecognizer(speechConfig);
      

      参考文档包 (npm)GitHub 上的其他示例库源代码

      本操作指南介绍如何识别并转录人类语音(通常称为语音转文本)。

      创建语音配置

      若要使用语音 SDK 调用语音服务,需要创建 SpeechConfig 实例。 此类包含有关订阅的信息,例如密钥和关联的位置/区域、终结点、主机或授权令牌。

      使用密钥和位置/区域创建 SpeechConfig 实例。 在 Azure 门户中创建语音资源。 有关详细信息,请参阅创建新的 Azure 认知服务资源

      const speechConfig = sdk.SpeechConfig.fromSubscription("YourSpeechKey", "YourSpeechRegion");
      

      可以通过其他几种方式初始化 SpeechConfig

    • 使用终结点:传入语音服务终结点。 密钥或授权令牌是可选的。
    • 使用主机:传入主机地址。 密钥或授权令牌是可选的。
    • 使用授权令牌:传入授权令牌和关联的位置/区域。
    • 无论你是要执行语音识别、语音合成、翻译,还是意向识别,都需要创建一个配置。

      识别来自麦克风的语音

      Node.js 中不支持识别来自麦克风的语音。 仅在基于浏览器的 JavaScript 环境中支持该功能。 有关详细信息,请参阅 GitHub 上的 React 示例从麦克风实现语音转文本。 React 示例演示身份验证令牌交换和管理的设计模式。 该示例还演示如何从麦克风或文件捕获音频以进行语音转文本转换。

      如果你想使用特定的音频输入设备,则需要在 AudioConfig 中指定设备 ID。 了解如何获取音频输入设备的设备 ID

      从文件中识别语音

      要从音频文件识别语音,请使用 fromWavFileInput() 创建一个接受 Buffer 对象的 AudioConfig 实例。 然后通过传递 audioConfigspeechConfig 初始化 SpeechRecognizer

      const fs = require('fs');
      const sdk = require("microsoft-cognitiveservices-speech-sdk");
      const speechConfig = sdk.SpeechConfig.fromSubscription("YourSpeechKey", "YourSpeechRegion");
      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();
      

      识别来自内存中流的语音

      对于许多用例,你的音频数据可能来自 Blob 存储。 或者已经作为 ArrayBuffer 或类似的原始数据结构存在于内存中。 下面的代码:

    • 使用 createPushStream() 创建推送流。
    • 出于演示目的,使用 fs.createReadStream 读取 .wav 文件。 如果 ArrayBuffer 中已有音频数据,则可以直接跳过此步骤,将内容写入输入流。
    • 使用推送流创建音频配置。
    • const fs = require('fs');
      const sdk = require("microsoft-cognitiveservices-speech-sdk");
      const speechConfig = sdk.SpeechConfig.fromSubscription("YourSpeechKey", "YourSpeechRegion");
      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 region values?");
              break;
      

      使用连续识别

      前面的示例使用单步识别,可识别单个言语。 单个言语的结束是通过在结束时倾听静音或处理最长 15 秒音频时确定的。

      与此相反,当你想控制何时停止识别时,可使用连续识别。 它要求你订阅 RecognizingRecognizedCanceled 事件以获取识别结果。 若要停止识别,必须调用 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 region values?");
          speechRecognizer.stopContinuousRecognitionAsync();
      speechRecognizer.sessionStopped = (s, e) => {
          console.log("\n    Session stopped event.");
          speechRecognizer.stopContinuousRecognitionAsync();
      

      设置所有项后,调用 startContinuousRecognitionAsync 开始识别:

      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("YourSubscriptionKey", "YourServiceRegion");
      speechConfig.endpointId = "YourEndpointId";
      var speechRecognizer = new SpeechSDK.SpeechRecognizer(speechConfig);
      

      参考文档包(下载)GitHub 上的其他示例

      本操作指南介绍如何识别并转录人类语音(通常称为语音转文本)。

      安装语音 SDK 和示例

      Azure-Samples/cognitive-services-speech-sdk 库包含适用于 iOS 和 Mac 且以 Objective-C 编写的示例。 选择链接可查看每个示例的安装说明:

    • 在 macOS 上使用 Objective-C 识别来自麦克风的语音
    • 在 iOS 上使用 Objective-C 识别语音
    • 有关 iOS 上 Objective-C 的其他示例
    • 有关详细信息,请参阅适用于 Objective-C 的语音 SDK 参考

      使用自定义终结点

      使用自定义语音识别,可以上传自己的数据、测试和训练自定义模型、比较模型之间的准确度,以及将模型部署到自定义终结点。 以下示例演示了如何设置自定义终结点。

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

      参考文档包(下载)GitHub 上的其他示例

      本操作指南介绍如何识别并转录人类语音(通常称为语音转文本)。

      安装语音 SDK 和示例

      Azure-Samples/cognitive-services-speech-sdk 库包含适用于 iOS 和 Mac 且以 Swift 编写的示例。 选择链接可查看每个示例的安装说明:

    • 在 macOS 上使用 Swift 识别语音
    • 在 iOS 上使用 Swift 识别语音
    • 有关详细信息,请参阅适用于 Swift 的语音 SDK 参考

      使用自定义终结点

      使用自定义语音识别,可以上传自己的数据、测试和训练自定义模型、比较模型之间的准确度,以及将模型部署到自定义终结点。 以下示例演示了如何设置自定义终结点。

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

      参考文档包 (PyPi)GitHub 上的其他示例

      本操作指南介绍如何识别并转录人类语音(通常称为语音转文本)。

      创建语音配置

      若要使用语音 SDK 调用语音服务,需要创建 SpeechConfig 实例。 此类包含有关你的订阅的信息,例如你的语音密钥和关联的位置/区域、终结点、主机或授权令牌。

      使用语音密钥和位置/区域创建 SpeechConfig 实例。 在 Azure 门户中创建语音资源。 有关详细信息,请参阅创建新的 Azure 认知服务资源

      speech_config = speechsdk.SpeechConfig(subscription="YourSpeechKey", region="YourSpeechRegion")
      

      可以通过其他几种方式初始化 SpeechConfig

    • 使用终结点:传入语音服务终结点。 语音密钥或授权令牌是可选项。
    • 使用主机:传入主机地址。 语音密钥或授权令牌是可选项。
    • 使用授权令牌:传入授权令牌和关联的区域。
    • 无论你是要执行语音识别、语音合成、翻译,还是意向识别,都需要创建一个配置。

      识别来自麦克风的语音

      若要使用设备麦克风识别语音,请创建 SpeechRecognizer 实例(无需传递 AudioConfig),然后传递 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.")
          result = speech_recognizer.recognize_once_async().get()
          print(result.text)
      from_mic()
      

      如果你想使用特定的音频输入设备,则需要在 AudioConfig 中指定设备 ID,并将其传递给 SpeechRecognizer 构造函数的 audio_config 参数。 了解如何获取音频输入设备的设备 ID

      从文件中识别语音

      如果要从音频文件(而不是使用麦克风)识别语音,请创建 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)
          result = speech_recognizer.recognize_once_async().get()
          print(result.text)
      from_file()
      

      前面的示例只是从 result.text 获取已识别的文本。 若要处理错误和其他响应,需要编写一些代码来处理结果。 以下代码评估 result.reason 属性并:

    • 输出识别结果:speechsdk.ResultReason.RecognizedSpeech
    • 如果没有识别匹配项,则通知用户:speechsdk.ResultReason.NoMatch
    • 如果遇到错误,则输出错误消息:speechsdk.ResultReason.Canceled
    • if result.reason == speechsdk.ResultReason.RecognizedSpeech:
          print("Recognized: {}".format(result.text))
      elif result.reason == speechsdk.ResultReason.NoMatch:
          print("No speech could be recognized: {}".format(result.no_match_details))
      elif result.reason == speechsdk.ResultReason.Canceled:
          cancellation_details = 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()。 下面是有关如何对音频输入文件执行连续识别的示例。

      首先定义输入并初始化 SpeechRecognizer

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

      接下来,创建一个变量来管理语音识别的状态。 将变量设置为 False,因为在开始识别时,你可以放心地假设该操作尚未完成。

      done = False
      

      现在,创建一个回调,以在收到 evt 时停止连续识别。 请记住以下几点:

    • 收到 evt 时,系统将输出 evt 消息。
    • 收到 evt 后,系统将调用 stop_continuous_recognition() 来停止识别。
    • 识别状态将更改为 True
    • def stop_cb(evt):
          print('CLOSING on {}'.format(evt))
          speech_recognizer.stop_continuous_recognition()
          nonlocal 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="YourSubscriptionKey", region="YourServiceRegion")
      speech_config.endpoint_id = "YourEndpointId"
      speech_recognizer = speechsdk.SpeechRecognizer(speech_config=speech_config)
      

      语音转文本 REST API 参考 | 适用于短音频的语音转文本 REST API 参考 | 有关 GitHub 的其他示例

      本操作指南介绍如何识别并转录人类语音(通常称为语音转文本)。

      将语音转换为文本

      请在命令提示符处运行以下命令。 将以下值插入到命令中:

    • 你的语音服务订阅密钥。
    • 你的语音服务区域。
    • 输入音频文件的路径。 可以使用语音转文本来生成音频文件。
    • curl --location --request POST 'https://INSERT_REGION_HERE.stt.speech.microsoft.com/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'
      

      应会收到带有 JSON 正文的响应,如下所示:

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

      有关详细信息,请参阅语音转文本 REST API 参考

      本操作指南介绍如何识别并转录人类语音(通常称为语音转文本)。

      从麦克风将语音转换为文本

      插入并打开电脑麦克风。 关闭任何可能也使用麦克风的应用。 某些计算机具有内置麦克风,其他计算机则需要配置蓝牙设备。

      现在,可以运行语音 CLI 来识别来自麦克风的语音。 在命令行中,更改为包含语音 CLI 二进制文件的目录。 然后,运行以下命令:

      spx recognize --microphone
      

      语音 CLI 默认为英语。 你可以从“语音转文本”表中选择不同语言。 例如,添加 --source de-DE 以识别德语语音。

      对麦克风说话,随后可以看到字词实时转录为文本。 如果停止说话一段时间,或者选择 Ctrl+C,语音 CLI 将停止。

      从音频文件将语音转换为文本

      语音 CLI 可以识别多种文件格式和自然语言的语音。 在此示例中,可以使用任何包含英语语音的 WAV 文件(16 KHz 或 8 KHz,16 位,单声道 PCM)。 如果需要快速示例,请下载 whatstheweatherlike.wav 文件,并将其复制到语音 CLI 二进制文件所在的目录中。

      使用以下命令运行语音 CLI,以识别音频文件中找到的语音:

      spx recognize --file whatstheweatherlike.wav
      

      语音 CLI 默认为英语。 你可以从“语音转文本”表中选择不同语言。 例如,添加 --source de-DE 以识别德语语音。

      语音 CLI 将在屏幕上显示语音的文本转录。

    • 尝试语音转文本快速入门
    • 使用自定义语音识别提高识别准确度
    • 使用批量听录
  •