问题排查

如果您在使用 Speech-to-Text 时遇到问题,请查阅以下实用的问题排查步骤。

无法通过针对 Speech-to-Text 的身份验证

您可能会收到一条错误消息,指出您的“应用默认凭据”不可用,或者您可能想了解如何获取 API 密钥以在调用 Speech-to-Text 时使用。

Speech-to-Text 使用应用默认凭据 (ADC) 进行身份验证。

ADC 凭据必须在您调用 Speech-to-Text API 的上下文中可用。例如,如果您在终端中设置 ADC,但在 IDE 的调试程序中运行代码,则代码的执行上下文可能无法访问凭据。在这种情况下,您对 Speech-to-Text 发出的请求可能会失败。

如需了解如何向 ADC 提供凭据,请参阅设置应用默认凭据

Speech-to-Text 返回一个空响应

Speech-to-Text 可能返回空响应的原因有很多。问题的根源可能是 RecognitionConfig 或音频本身。

RecognitionConfig 问题排查

RecognitionConfig 对象(或 StreamingRecognitionConfig)是 Speech-to-Text 识别请求的一部分。为了正确执行转录,必须设置两个主要类别的字段:

  • 音频配置。
  • 模型和语言。

空响应(例如,您收到空的 {} JSON 响应)的最常见原因之一是提供有关音频元数据的信息错误。如果音频配置字段未正确设置,转录很可能失败,识别模型将返回空的结果。

音频配置包含所提供音频的元数据。您可以使用 ffprobe 命令(它是 FFMPEG 的一部分)来获取音频文件的元数据。

以下示例演示了如何使用 ffprobe 来获取 https://storage.googleapis.com/cloud-samples-tests/speech/commercial_mono.wav 的元数据。

$ ffprobe commercial_mono.wav
[...]
Input #0, wav, from 'commercial_mono.wav':
  Duration: 00:00:35.75, bitrate: 128 kb/s
  Stream #0:0: Audio: pcm_s16le ([1][0][0][0] / 0x0001), 8000 Hz, 1 channels, s16, 128 kb/s

通过使用上述命令,我们可以看到该文件包含:

  • sample_rate_hertz:8000
  • 渠道:1
  • 编码 LINEAR16 (s16)

您可以在 RecognitionConfig 中使用此信息。

空响应的其他与音频相关的原因可能与音频编码有关。以下是一些其他工具和可以尝试的操作:

  1. 播放文件并听一听输出。音频是否清晰,语音是否易于理解?

    要播放文件,您可以使用 SoX (Sound eXchange) play 命令。下面显示了基于不同音频编码的几个示例。

    FLAC 文件含有文件头,用于指示采样率、编码类型和声道数量。此类文件可通过以下命令进行播放:

    play audio.flac

    LINEAR16 文件不含文件头。要播放此类文件,您必须指定采样率、编码类型和声道数量。LINEAR16 编码必须是 16 位带符号整数,小端字节序。

    play --channels=1 --bits=16 --rate=16000 --encoding=signed-integer \
    --endian=little audio.raw

    MULAW 文件也不含文件头,通常使用较低的采样率。

    play --channels=1 --rate=8000 --encoding=u-law audio.raw
  2. 检查数据的音频编码是否与您在 RecognitionConfig 中发送的参数相匹配。例如,如果您的请求指定了 "encoding":"FLAC""sampleRateHertz":16000,则 SoXplay 命令列出的音频数据参数应与这些参数相匹配,如下所示:

    play audio.flac

    列出的参数应为:

    Encoding: FLAC
    Channels: 1 @ 16-bit
    Sampleratehertz: 16000Hz
    

    如果 SoX 列表显示的 Sampleratehertz 并非 16000Hz,请更改 InitialRecognizeRequest 中的 "sampleRateHertz" 以便匹配。如果 Encoding 不是 FLACChannels 不是 1 @ 16-bit,则不能直接使用此文件,需要将其转换为兼容的编码(请参阅下一步)。

  3. 如果音频文件不是 FLAC 编码,请尝试使用 SoX 将其转换为 FLAC,然后重复上述步骤播放该文件并验证编码、sampleRateHertz 和声道数。以下是将各种音频文件格式转换为 FLAC 编码的一些示例。

    sox audio.wav --channels=1 --bits=16 audio.flac
    sox audio.ogg --channels=1 --bits=16 audio.flac
    sox audio.au --channels=1 --bits=16 audio.flac
    sox audio.aiff --channels=1 --bits=16 audio.flac
    

    要将原始文件转换为 FLAC,您需要知道该文件的音频编码。例如,要将 16000Hz 的立体声 16 位带符号小端字节序转换为 FLAC,可使用以下代码:

    sox --channels=2 --bits=16 --rate=16000 --encoding=signed-integer \
    --endian=little audio.raw --channels=1 --bits=16 audio.flac
    
  4. 使用提供的示例音频文件运行快速入门示例或某个示例应用。如果该示例可成功运行,则将示例音频文件替换为您自己的音频文件。

模型和语言配置

选择正确的模型是获得高质量转录结果的关键。Speech-to-Text 提供了多种模型,这些模型已针对不同的使用场景进行了调整,必须选择最适合您的音频的模型。例如,某些模型(如 latest_shortcommand_and_search)是短形式模型,这意味着更适合简短的音频和提示。这些模型可能会在检测到静默期后立即返回结果。另一方面,长模型(例如 latest_short, phone_call, video and default)更适合较长的音频,并且将静默解读音频结尾的敏感度略低。

如果识别结束得太突然或未快速返回,您可能需要进行检查并用其他模型进行试验,以确定是否可以获得更好的转录质量。您可以使用语音界面试验多个模型。

语音识别的意外结果

如果 Speech-to-Text 返回的结果不符合您的预期,请执行以下操作: