优化用于 Speech-to-Text 的音频文件


本教程介绍如何对您计划用于 Speech-to-Text 的音频文件进行预检,其中提供了有关音频文件格式的背景知识,说明了如何优化音频文件以用于 Speech-to-Text 以及如何诊断错误。本教程面向非技术岗位的媒体和娱乐专业人员以及后期制作专业人员。您无需具备 Google Cloud 的深入知识,只需要知道如何使用 gcloud 命令行工具来处理存储在本地和 Cloud Storage 存储桶中的文件。

目标

  • 安装 FFMPEG 工具。
  • 下载示例媒体文件。
  • 使用 FFMPEG 播放音频和视频文件。
  • 使用 FFMPEG 提取、转码和转换音频文件属性。
  • 对包含语音对话的各种示例文件运行 Speech-to-Text。

费用

本教程使用 Google Cloud 的以下收费组件:

您可使用价格计算器根据您的预计用量来估算费用。

准备工作

  1. Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  3. Make sure that billing is enabled for your Google Cloud project.

  4. Install the Google Cloud CLI.
  5. To initialize the gcloud CLI, run the following command:

    gcloud init
  6. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  7. Make sure that billing is enabled for your Google Cloud project.

  8. Install the Google Cloud CLI.
  9. To initialize the gcloud CLI, run the following command:

    gcloud init

在本教程中,您将使用 Cloud Shell 执行一些操作,例如将数据从 Cloud Storage 存储桶复制到 Cloud Shell 会话。Cloud Shell 是一个已安装 Google Cloud CLI 的 Shell 环境。您将使用 gcloud CLI 来执行本教程中的许多步骤。您还将在本地机器上安装软件和音频文件示例,并在终端中进行相同的练习,如后文在本地终端中运行教程示例部分所述。

概览

在本教程中,您将使用 FFMPEG,这是一款用于录制、转换和流式播放音频和视频的开源工具。本教程稍后会详细介绍此工具。

了解声音文件特性

本部分介绍媒体制作和后期制作工作流程中涉及的典型音频文件类型、采样率、位深以及录制媒介。

为了让 Speech-to-Text 实现最佳效果,您必须确保用于转录的文件是符合某些最低规格的单音轨(单声道)文件,如后文所述。如果文件不符合规格,您可能需要生成经过修改的文件。例如,您可能需要执行以下操作:

  • 从视频文件中提取音频数据。
  • 从多音轨音频文件中提取一个单音轨。
  • 将一种音频编解码器转码为另一种更适合 Speech-to-Text 的编解码器。

采样率(频率范围)

采样率决定了音频文件的频率范围。它是指构成音频文件的样本的每秒数量。通常,数字音频文件的最高可重现频率相当于采样率的一半。例如,可从 44.1 kHz 音频文件中重现的最高频率约为 22 kHz,这处于一般听众听觉频率响应范围的顶端或以上。

电话和电信行业的采样率往往在 8 kHz - 16 kHz 之间。本教程重点介绍媒体和娱乐行业常处理的格式,其采样率通常高于 16 kHz。如需详细了解电话和其他声音应用,请参阅使用增强模型转录电话音频

对于通过 Speech-to-Text 进行转录的音频文件,我们建议采样率至少为 16 kHz。音频文件的采样率通常为 16 kHz、32 kHz、44.1 kHz 和 48 kHz。由于清晰度受频率范围的影响很大,尤其是在频率较高时,因此采样率低于 16 kHz 会导致音频文件中高于 8 kHz 的信息很少或根本没有。这会使 Speech-to-Text 无法正确转录语音。语音清晰度需要 2 kHz 到 4 kHz 范围内的信息,尽管较高频率的谐波(倍数)对于保持语音清晰度也很重要。因此,将采样率保持在最低 16 kHz 是比较好的做法。

您可以转换采样率。然而,由于频率范围信息受到低采样率的限制,无法通过转换到较高的采样率来恢复,因此调高音频的采样率是没有好处的。这意味着将采样率从 8 kHz 转换到 44.1 kHz 会将可重现的频率范围限制在较低采样率的一半,即大约 4 kHz。在本教程中,您将听到以各种采样率和位深录制的音频文件,您可以自行辨别其中的差异。

位深(动态范围)

音频文件的位深决定了从最低分贝声音到最高分贝声音的范围,以及文件的信噪比。与频率响应相比,动态范围对转录质量的影响较小,但位深为 8 位或低于 8 位会导致音轨中的量化噪声过多,从而导致转录难以准确进行。(“量化误差”是指模拟输入信号与该信号对应的数字输出值之间的舍入误差。这些误差会导致声音失真,直接影响声音保真度。)使用 Speech-to-Text 分析文件时,建议使用 16 位或以上的位深。和采样频率一样,将位深从 8 位调高为 16 位没有任何好处,因为动态范围信息受限于原本的 8 位格式。

录制媒介

原始录制媒介也会影响音频文件的质量。 例如,最初在磁带上录制的音频内容可能会导致文件中混入背景杂音。在某些情况下,您可能需要预处理有噪声的音频,以便获得更好的 Speech-to-Text 转录效果。如何处理录制时产生的噪声和背景杂音不在本教程的介绍范围内。如需了解详情,请参阅 Speech-to-Text 文档中的最佳做法

FFMPEG 简介

在本教程中,您将使用 FFMPEG 处理音频文件。FFMPEG 工具提供了各种功能,其中包括:

  • 播放音频或视频文件。
  • 将音频文件转换为 Speech-to-Text 可识别的编解码器之一。
  • 将音频文件采样率和比特率转换为最佳配置,以便使用 Speech-to-Text 进行分析。
  • 从传输流文件或视频文件中提取单个音轨或音频流。
  • 将立体声文件拆分为两个单音轨文件。
  • 将 5.1 音频文件拆分为六个单音轨文件。
  • 应用均衡器和过滤器,提高音频清晰度。

您还可以使用 FFMPEG 的 ffprobe 功能来查看与媒体文件关联的元数据。如果您要诊断与机器学习分析的文件类型和格式相关的问题,此功能非常有用。

Speech-to-Text 可识别的编解码器

虽然 Speech-to-Text 能够识别多种音频文件格式,但它可能无法正确读取或分析某些编解码器。本教程介绍了如何检查您的内容是否为受支持的文件格式。

在本教程中,您将读取元数据信息,以便在使用 Speech-to-Text 之前发现并纠正潜在问题。如果您发现存在不兼容的情况,也可以使用这些工具将文件转换为受支持的格式。

Speech-to-Text 可识别以下编解码器:

  • FLAC:自由无损音频编解码器
  • LINEAR16:用于 WAV、AIFF、AU 和 RAW 容器的非压缩脉冲编码调制 (PCM) 格式
  • MULAW:专为美国和日本地区电信行业设计的 PCM 编解码器
  • AMR:专为语音设计的自适应多速率编解码器
  • AMR_WB:AMR 的宽带变体,带宽为 AMR 的两倍
  • OGG_OPUS:专为低延迟应用设计的有损编解码器
  • SPEEX_WITH_HEADER_BYTE:专为 IP 语音 (VOIP) 应用设计的编解码器

请务必注意,编解码器和文件格式不同。受支持的文件扩展名并不一定表示创建文件时使用的编解码器能够被 Speech-to-Text 读取。

本教程主要介绍 FLAC 和 LINEAR16 编解码器,因为它们常用于媒体工作流程环境中。这两者都是无损格式。

如果您将 WAV 文件(非压缩的线性 PCM 格式)用于 Speech-to-Text,则文件位深不得超过 16 位,且必须采用非浮点格式编码。.wav 文件扩展名不能保证此文件可被 Speech-to-Text 读取。本教程的优化音频文件以供分析部分提供了一个示例,介绍如何将文件从浮点位深转换为整数(有符号)位深,以便在 Speech-to-Text 中转写该文件。

初始化您的环境

在执行本教程的任务之前,您必须安装 FFMPEG、设置一些环境变量并下载音频文件以初始化环境。您将使用同时存储在 Cloud Shell 实例和 Cloud Storage 存储桶中的媒体文件。使用不同来源可让您体验 Speech-to-Text 的不同功能。

在本部分中,您将安装 FFMPEG 并设置环境变量,使其指向 Cloud Shell 实例存储空间和 Cloud Storage 存储桶中的示例数据存储位置。这两个位置的媒体文件相同,本教程中的一些示例会同时访问 Cloud Shell 和 Cloud Storage 存储桶中的文件。您可以在本地机器上安装 FFMPEG 并运行相同的练习,如后文中在本地终端中运行教程示例部分所述。

  1. In the Google Cloud console, activate Cloud Shell.

    Activate Cloud Shell

  2. 在 Cloud Shell 中,安装当前版本的 FFMPEG:

    sudo apt update
    sudo apt install ffmpeg
    
  3. 验证是否已成功安装 FFMPEG:

    ffmpeg -version
    

    如果显示版本号,则表示安装成功。

  4. 为项目文件创建目录:

    mkdir project_files
    
  5. 为将在后续步骤中生成的输出文件创建一个目录:

    mkdir output
    
  6. 下载示例音频文件:

    gcloud storage cp gs://cloud-samples-data/speech/project_files/*.* ~/project_files/
    
  7. 为 Cloud Storage 存储桶名称创建环境变量:

    export GCS_BUCKET_PATH=gs://cloud-samples-data/speech/project_files
    
  8. 为 Cloud Shell 实例目录路径创建指向下载的示例音频文件的环境变量:

    export PROJECT_FILES=~/project_files
    

检查媒体文件中的元数据

使用 Speech-to-Text 分析音频或视频文件时,您需要知道文件元数据的详细信息。这有助于您识别可能引起问题的不一致或不兼容的参数。

在本部分中,您将使用 FFMPEG 中的 ffprobe 命令检查多个媒体文件的元数据,以了解文件的规格。

  1. 在 Cloud Shell 中,查看 HumptyDumptySample4416.flac 文件的元数据:

    ffprobe $PROJECT_FILES/HumptyDumptySample4416.flac
    

    输出如下所示:

    Input #0, flac, from 'project_files/HumptyDumptySample4416.flac':
      Duration: 00:00:26.28, start: 0.000000, bitrate: 283 kb/s
        Stream #0:0: Audio: flac, 44100 Hz, mono, s16
    

    此输出指出了关于该文件的以下元数据:

    • 音频文件的时长为 26.28 秒。
    • 比特率为每秒 283 KB。
    • 编解码器格式为 FLAC。
    • 采样率为 44.1kHz。
    • 该文件为单通道单声道文件。
    • 位深为 16 位(有符号整数)。
  2. 查看 HumptyDumptySampleStereo.flac 文件的元数据:

    ffprobe $PROJECT_FILES/HumptyDumptySampleStereo.flac
    

    输出如下所示:

    Input #0, flac, from 'project_files/HumptyDumptySampleStereo.flac':
      Duration: 00:00:26.28, start: 0.000000, bitrate: 378 kb/s
        Stream #0:0: Audio: flac, 44100 Hz, stereo, s16
    

    这个文件与前一个文件的区别在于,这是一个具有更高比特率的立体声文件(378 KB/秒而非 283 KB/秒),因为它包含两个通道,而不是一个单声道音轨。所有其他值都是相同的。

    您应该检查要使用 Speech-to-Text 处理的音频文件中的通道数量;音频文件应仅包含一个音频通道。如需转写同一文件中的多个音频通道,我们建议您按后文中优化音频文件以供分析部分所述编写命令脚本。

  3. 查看 5.1 混音文件的元数据:

    ffprobe $PROJECT_FILES/Alice_51_sample_mix.aif
    

    输出如下所示:

    Duration: 00:00:58.27, bitrate: 4610 kb/s
        Stream #0:0: Audio: pcm_s16be, 48000 Hz, 5.1, s16, 4608 kb/s
    

    由于此文件的格式与单声道或立体声文件不同,因此您会看到其他信息。在此示例中,音频采用的是线性 PCM 格式,以 44.1 kHz 的采样率和 16 位比特率(有符号整数,小端字节序)录制。

    请注意 5.1 标识。此文件的数据速率为 4608 KB/秒,明显高于上述任一示例的速率,因为此音频文件包含 6 个音轨。

    在本教程的后半部分,您会看到尝试使用 Speech-to-Text 转录此文件时会引发什么样的错误。更重要的是,您将了解如何优化文件,以使其通过 Speech-to-Text 分析时不会出现错误。

优化音频文件以供分析

如前所述,当您使用 Speech-to-Text 时,音频文件需要是单通道单声道文件,以避免转录过程出错。下表展示了常见音频格式以及转换单声道文件以进行处理的过程。

当前音频格式 转换过程 输出音频格式
单声道 无需提取 FLAC 或 LINEAR16
立体声 拆分为 2 个单声道文件或缩混为单声道文件 FLAC 或 LINEAR16
多音轨 (5.1) 拆分为 6 个单声道文件 FLAC 或 LINEAR16
多重音频流音频/视频 拆分为单独的单声道文件 FLAC 或 LINEAR16

如需处理包含多个音轨的文件,请使用 FFMPEG 或其他音频编辑工具从立体声文件中提取单声道音轨。或者,您也可以按照 Speech-to-Text 文档中转写包含多个通道的音频部分的说明自动执行该过程。在本教程中,您将学习如何使用 FFMPEG 从立体声文件中提取单声道音轨。

如前一部分所述,您可以使用 ffprobe 命令确定文件中包含的音频通道数,然后根据需要使用 ffmpeg 命令提取或将文件转换为单声道格式。

预览无效格式的错误

如需查看不正确的格式对转写有何影响,您可以尝试对非单声道格式的文件运行 Speech-to-Text。

  1. 在 Cloud Shell 中,对 HumptyDumptySampleStereo.flac 文件运行 Speech-to-Text:

    gcloud ml speech recognize $PROJECT_FILES/HumptyDumptySampleStereo.flac \
        --language-code='en-US'
    

    输出如下所示:

    ERROR: (gcloud.ml.speech.recognize) INVALID_ARGUMENT: Invalid audio channel count
    

    尽管文件的编解码器格式、采样率和位深都正确,但立体声描述符显示该音频文件包含两个音轨。因此,运行 Speech-to-Text 会引起 Invalid audio channel count 错误。

  2. 对文件运行 ffprobe 命令:

    ffprobe $PROJECT_FILES/HumptyDumptySampleStereo.flac
    

    输出如下所示:

    Stream #0:0: Audio: flac, 44100 Hz, stereo, s16
    

    这表明 Speech-to-Text 错误是由于尝试处理立体声文件引起的

如需了解如何通过编写脚本管理立体声文件,请参阅 Speech-to-Text 文档中的转写包含多个通道的音频

将立体声文件拆分成多个 FLAC 单声道文件

避免多音轨错误的一个方法是从立体声音频文件中提取两个单声道音轨。生成的音轨采用 FLAC 格式,并写入输出目录。当您从立体声文件中提取两个单声道文件时,最好为提取的文件创建能够指明原始文件通道位置的名称。例如,在以下过程中,您可以使用后缀 FL 表示左声道,并使用后缀 FR 表示右声道。

如果要转录的音频样本同时存在于两个通道中,转录只能使用其中一个通道。但是,如果是在不同的通道上为不同的讲话人录音,我们建议您单独转录这些通道。Speech-to-Text 可以识别单个录音文件中的多个语音。 但是,为每个语音使用单独的通道会使转录的置信度更高。(在语音识别中,置信度值也称为字词错误率 (WER)。)如需详细了解如何处理同一录音文件中的多个语音,请参阅 Speech-to-Text 文档中的区分录音中不同的讲话人

  • 在 Cloud Shell 中,将 HumptyDumptySampleStereo.flac 立体声文件拆分为 2 个单声道文件:

    ffmpeg -i $PROJECT_FILES/HumptyDumptySampleStereo.flac -filter_complex "[0:a]channelsplit=channel_layout=stereo[left][right]" -map "[left]" output/HumptyDumptySample_FL.flac -map "[right]" output/HumptyDumptySample_FR.flac
    

    输出如下所示,显示了 HumptyDumptySample_FL.flac(左前通道)和 HumptyDumptySample_FR.flac(右前通道)两个单声道文件。

    Output #0, flac, to 'HumptyDumptySample_FL.flac':
      Input #0, flac, from 'project_files/HumptyDumptySampleStereo.flac':
      Duration: 00:00:26.28, start: 0.000000, bitrate: 378 kb/s
        Stream #0:0: Audio: flac, 44100 Hz, stereo, s16
    Stream mapping:
      Stream #0:0 (flac) -> channelsplit
      channelsplit:FL -> Stream #0:0 (flac)
      channelsplit:FR -> Stream #1:0 (flac)
    (...)
    Output #0, flac, to 'HumptyDumptySample_FL.flac':
    (...)
    Stream #0:0: Audio: flac, 44100 Hz, 1 channels (FL), s16, 128 kb/s
    (...)
    Output #1, flac, to 'HumptyDumptySample_FR.flac':
    (...)
    Stream #1:0: Audio: flac, 44100 Hz, 1 channels (FR), s16, 128 kb/s
    (...)
    size=918kB time=00:00:26.27 bitrate= 286.2kbits/s speed= 357x
    video:0kB audio:1820kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: unknown
    

    此文件现已针对 Speech-to-Text 进行了优化。

将 5.1 音频文件拆分为多个单声道文件

另一个优化音频文件的方法是将 5.1 音频文件拆分为单独的 FLAC 单声道文件。对于多通道混音文件(例如 5.1 混音)中的通道而言,文件名的含义通常不同于立体声或单声道文件。左通道文件通常命名为 FL 以表示左前,而右通道文件则命名为 FR 以表示右前。此外,对于 5.1 混音文件中的其余通道,FC 表示中置,LFE 表示低频效果,BL 表示左后(也称为左环绕),BR 表示右后(也称为右环绕)。这些名称并非标准命名,但它们是区分声音文件原始通道的传统做法。

通常,在用于电影和电视节目的多通道音频文件中,主要对话都位于中置通道上。这通常是您在使用 Speech-to-Text 时选择的文件,因为它通常包含混音中的大多数对话。

在后期制作环境中,对话、音乐和特效的主要元素会被分为若干个称为“声部”的组,混音中的所有对话都会与音乐和特效分开,直到最后完成混音。由于对话声部仅由对话组成,因此 Speech-to-Text 在转录这个声部时的输出结果会比从最终混音中提取中置通道的效果好。这是因为提取出的中置通道可能会混有非对话声,导致清晰度变差。

  1. 在 Cloud Shell 中,将 Alice_51_sample_mix.aif 文件拆分为 FLAC 文件,并为每个通道指定输出文件名:

    ffmpeg -i $PROJECT_FILES/Alice_51_sample_mix.aif -filter_complex "channelsplit=channel_layout=5.1[FL][FR][FC][LFE][BL][BR]" -map "[FL]" output/Alice_FL.flac -map "[FR]" output/Alice_FR.flac -map "[FC]" output/Alice_FC.flac -map "[LFE]" output/Alice_LFE.flac -map "[BL]" output/Alice_BL.flac -map "[BR]" output/Alice_BR.flac
    

    输出如下所示:

    Duration: 00:00:55.00, bitrate: 4235 kb/s
      Stream #0:0: Audio: pcm_s16le ([1][0][0][0] / 0x0001), 44100 Hz, 5.1, s16, 4233 kb/s
    Stream mapping:
      Stream #0:0 (pcm_s16le) -> channelsplit
      channelsplit:FL -> Stream #0:0 (flac)
      channelsplit:FR -> Stream #1:0 (flac)
      channelsplit:FC -> Stream #2:0 (flac)
      channelsplit:LFE -> Stream #3:0 (flac)
      channelsplit:BL -> Stream #4:0 (flac)
      channelsplit:BR -> Stream #5:0 (flac)
    Press [q] to stop, [?] for help
    Output #0, flac, to 'Alice_FL.flac':
    (...)
        Stream #0:0: Audio: flac, 44100 Hz, 1 channels (FL), s16, 128 kb/s
    (...)
    Output #1, flac, to 'output/Alice_FR.flac':
    (...)
        Stream #1:0: Audio: flac, 44100 Hz, 1 channels (FR), s16, 128 kb/s
    (...)
    Output #2, flac, to 'output/Alice_FC.flac':
    (...)
        Stream #2:0: Audio: flac, 44100 Hz, mono, s16, 128 kb/s
    (...)
    Output #3, flac, to 'output/Alice_LFE.flac':
    (...)
        Stream #3:0: Audio: flac, 44100 Hz, 1 channels (LFE), s16, 128 kb/s
    (...)
    Output #4, flac, to 'output/Alice_BL.flac':
    (...)
        Stream #4:0: Audio: flac, 44100 Hz, 1 channels (BL), s16, 128 kb/s
    (...)
    Output #5, flac, to 'output/Alice_BR.flac':
    (...)
        Stream #5:0: Audio: flac, 44100 Hz, 1 channels (BR), s16, 128 kb/s
    (...)
    
  2. 点击以下文件以收听。此文件位于 Cloud Storage 存储桶中,点击文件名即可在浏览器的新标签页中播放。

    Alice_mono_downmix.flac
    
  3. 收听刚刚创建的 FC(中置通道文件)。(对话会在几秒钟空白后开始。)

    Alice_FC.flac
    

    请注意此文件与前一个文件在清晰度方面的区别。此音轨仅包含混音中的对话部分。

测试音频文件质量

在使用 Speech-to-Text 转换媒体文件之前,最好先收听该文件,确定是否存在可能会妨碍机器学习工具提供准确结果的音质异常。在此部分中,您可以点击文件名,在浏览器中播放文件。 (我们建议您使用耳机或宽动态范围扬声器。)

收听视频文件中的音频

  1. 点击以下文件即可播放:

    HumptyDumptySample4416.flac
    

    此文件的频率为 44.1 kHz,位深为 16 位。请注意此文件的清晰度、保真度和易懂度。这是使用 Speech-to-Text 进行转录的范本。

  2. 播放以下 5.1 格式的示例视频文件,收听除中置通道以外的所有通道中的非对话环绕声:

    sample_51_mix_movie.mp4
    

    该文件专用于在 5.1 音频系统中播放;如果您仅使用耳机或双通道系统,则在播放时可能无法听到所有通道。(要收听所有 6 个通道,您需要在 5.1 系统上进行播放解码,或者创建双通道立体声缩混。)

    理想情况下,您应为 Speech-to-Text 提供仅含有对话的通道。示例文件包含五个不含对话的音频通道和一个含有对话的通道。在后文中的优化音频文件以供分析部分,您将学习如何提取在 5.1 文件中编码的 6 个单声道音频通道,以收听每个音轨。这样,您就可以将仅包含对话的通道(通常为中置通道)与不含对话的通道分开,以改进 Speech-to-Text 转录文件的能力。

测试同一文件的不同采样率版本

下表列出了您要收听的同一音频文件的多个版本,每个版本的位深和采样率都不同。

音频文件 采样率/位深
HumptyDumptySample4416.flac 44.1 kHz/16 位线性 PCM
HumptyDumptySample2216.flac 22 kHz/16 位线性 PCM
HumptyDumptySample1616.flac 16 kHz/16 位线性 PCM
HumptyDumptySample1116.flac 11 kHz/16 位线性 PCM
HumptyDumptySample0808.flac 8 kHz/8 位线性 PCM
HumptyDumptyUpSample4416.flac 44.1 kHz(上采样)/16 位线性 PCM
HumptyDumptySample4408.flac 44.1 kHz/8 位线性 PCM
HumptyDumptySample4408to16.flac 44.1 kHz/16 位线性 PCM(升频转换)
  1. 对于上表中的每个文件,点击文件名即可收听文件。(系统会在浏览器的新标签页中打开音频播放器。)请注意采样率降低时的音质差异。

    在较低的采样率下,16 位文件的保真度会降低,而在 8 位文件版本中,由于存在量化误差,信噪比会大幅降低。表格中的最后一个文件是已被上采样为 44.1 kHz/16 位的原始 8kHz 8 位文件。请注意,其音质与 8 kHz/8 位文件相同。

  2. 在 Cloud Shell 中,检查 HumptyDumptySampleStereo.flac 文件的元数据:

    ffprobe $PROJECT_FILES/HumptyDumptySampleStereo.flac
    

    输出如下所示:

    Input #0, flac, from 'project_files/HumptyDumptySampleStereo.flac':
        Duration: 00:00:26.28, start: 0.000000, bitrate: 378 kb/s
        Stream #0:0: Audio: flac, 44100 Hz, stereo, s16
    

    输出展示了以下内容:

    • 文件时长为 26 秒 28 帧。此信息对于高级使用场景很有用,例如使用 gcloud speech recognize-long-running 命令处理长度超过 1 分钟的文件。
    • 该文件的比特率为 378 KB/s。
    • 该文件中的音频流数量为 1。(这与通道数量不同。)
    • 该文件的采样率为 44.1kHz。
    • 音频通道数为 2(立体声)。
    • 该文件的位深为 16 位。

    传输流可以包含许多流,包括音频、视频和元数据。其中每个都具有不同的特征,例如每个流的音频通道数量、视频流的编解码器和视频流的每秒帧数。

    请注意,元数据显示这是一个立体声文件。这一点很重要,因为推荐用于 Speech-to-Text 分析的默认音频通道数为一个单声道。

使用 Speech-to-Text 转录文件

现在您已经提取了单声道文件,接下来您可以使用 Speech-to-Text 转录音轨。您可以使用 gcloud ml speech 命令来调用 Speech-to-Text API。

  • 转录干净的 Alice_FC.flac 对话文件:

    gcloud ml speech recognize ~/output/Alice_FC.flac \
        --language-code='en-US' --format=text
    

    等待几秒钟即可完成转录。输出如下所示:

    results[0].alternatives[0].confidence: 0.952115
    results[0].alternatives[0].transcript: the walrus and the carpenter were walking close at hand they whip like anything to see such quantities of sand if this were only cleared away they said it would be grand
    results[1].alternatives[0].confidence: 0.968585
    results[1].alternatives[0].transcript: " if 7 Maids with seven mops swept it for half a year do you suppose the walrus said that they could get it clear I doubt it said the Carpenter and shed a bitter tear"
    results[2].alternatives[0].confidence: 0.960146
    results[2].alternatives[0].transcript: " oysters come and walk with us the walrus did beseech a pleasant walk a pleasant talk along the Briny Beach we cannot do with more than four to give a hand to each the eldest oyster look at him but never a word he said the eldest oyster winked his eye and shook his heavy head"
    

转录“脏”轨

您可能会遇到对话中掺杂有其他声音元素的音频文件。这通常称为“脏”轨,与之相对的是不掺杂其他元素、仅包含对话的“干净”音轨。虽然 Speech-to-Text 可以识别杂乱环境中的语音,但结果可能不如干净音轨那样准确。在使用 Speech-to-Text 分析文件之前,您可能需要进行额外的音频过滤和处理以提高对话的清晰度。

在本部分中,您将转写在上一个示例中分析的 5.1 音频文件的单声道缩混。

  1. 在 Cloud Shell 中,转写 Alice_mono_downmix.flac 文件:

    gcloud ml speech recognize $PROJECT_FILES/Alice_mono_downmix.flac \
        --language-code='en-US' --format=text
    

    输出如下所示:

    results[0].alternatives[0].confidence: 0.891331
    results[0].alternatives[0].transcript: the walrus and the carpenter Milwaukee Corsicana they reflect anything to see such quantity if this were only
    results[1].alternatives[0].confidence: 0.846227
    results[1].alternatives[0].transcript: " it's Sunday 7th March 23rd happy few supposed former said that they could get it clear I doubt it to the doctor and she said it did it to just come and walk with us"
    results[2].alternatives[0].confidence: 0.917319
    results[2].alternatives[0].transcript: " along the Briny Beach it cannot do with more than four to give a hand to each the eldest oyster look at him but he said it was poised to Rich's eye and shook his head"
    

    此分析的结果不准确,因为有其他声音遮盖了对话。转录置信度低于 85%。 正如您在输出中看到的那样,文字与录音中的对话并不完全匹配。

转录不同采样率和位深的音频文件

在此部分中,您将转录以不同采样率和位深录制的同一音频文件,以详细了解采样率和位深对转录的影响。这样一来,您就可以了解 Speech-to-Text 的置信度以及它与整体音质的关系。

  1. 点击下表中的文件名,收听示例,并注意音质差异。每次点击文件名时,音频文件都会在浏览器的新标签页中播放。

    音频文件名 文件规格
    Speech_11k8b.flac 11025Hz 采样率,8 位位深
    Speech_16k8b.flac 16kHz 采样率,8 位位深
    Speech_16k16b.flac 16kHz 采样率,16 位位深
    Speech_441k8b.flac 44100Hz 采样率,8 位位深
    Speech_441k16b.flac 44100Hz 采样率,16 位位深
  2. 在 Cloud Shell 中,转写 Speech_11k8b.flac 文件,此文件是此示例中音频质量最低的文件:

    gcloud ml speech recognize $PROJECT_FILES/Speech_11k8b.flac \
        --language-code='en-US' --format=text
    

    输出如下所示:

    results[0].alternatives[0].confidence: 0.77032
    results[0].alternatives[0].transcript: number of Pentacle represent
    results[1].alternatives[0].confidence: 0.819939
    results[1].alternatives[0].transcript: " what people can get in trouble if we take a look at the X again"
    
  3. 转写 Speech_441k16b.flac 文件,此文件以较高的保真度录制:

    gcloud ml speech recognize $PROJECT_FILES/Speech_441k16b.flac \
        --language-code='en-US' --format=text
    

    输出如下所示:

    results[0].alternatives[0].confidence: 0.934018
    results[0].alternatives[0].transcript: that gives us the number of pixels per inch when magnified to a 40-foot screen size now we take that number and multiply it by the distance between our eyes the interocular distance of 2 and 1/2 inch number of 10 pixels in other words on a 40-foot screen 10 pixels of information represents 2 and 1/2 in anything farther apart than that and positive Parallax is going to start to force the eyes to rotate that word in order to use the image
    results[1].alternatives[0].confidence: 0.956892
    results[1].alternatives[0].transcript: " where people tend to get in trouble is by looking at these images on a small monitor now if we take a look at the same math using a smaller monitor in this case 60 in the screen size in the resolution to multiply It Again by the distance between our eyes we end up with eighty pixels of Divergence on a monitor which equals two and a half inches so on the monitor things might look fine but when magnified up to the larger screen in this case for defeat we've created a situation that's eight times what we can stand to look at its very painful and should be avoided"
    

    请注意这两个示例的输出的置信度差异。 第一个文件 (Speech_11k8b.flac) 的录制采样率为 11kHz,位深为 8 位,置信度低于 78%。第二个文件的置信度约为 94%。

  4. 您也可以转录第 1 步表格中列出的其他文件,以进一步比较音频文件采样率和位深的准确度。

下表展示了 Speech-to-Text 对第 1 步表格中列出的每个文件执行上述过程的输出汇总。请注意每个文件类型的置信度值的差异。(您的结果可能会略有不同。)采样率和比特率较低的音频文件由于音质较差,其转录往往具有较低的置信度。

音频文件名 置信度(第 1 部分) 置信度(第 2 部分)
Speech_11k8b.flac 0.770318 0.81994
Speech_16k8b.flac 0.935356 0.959684
Speech_16k16b.flac 0.945423 0.964689
Speech_44.1k8b.flac 0.934017 0.956892
Speech_44.1k16b.flac 0.949069 0.961777

优化视频文件以供分析

本教程的此部分将引导您完成从电影文件中提取 5.1 音频所需的步骤。

  1. 在 Cloud Shell 中,从 5.1 电影文件中提取 6 个单声道通道,并将单个文件转换为 FLAC 格式:

    ffmpeg -i $PROJECT_FILES/sample_51_mix_movie.mp4 -filter_complex "channelsplit=channel_layout=5.1[FL][FR][FC][LFE][BL][BR]" -map "[FL]" output/sample_FL.flac -map "[FR]" output/sample_FR.flac -map "[FC]" output/sample_FC.flac -map "[LFE]" output/sample_LFE.flac -map "[BL]" output/sample_BL.flac -map "[BR]" output/sample_BR.flac
    

    此命令将以下文件提取到输出目录中:

    sample_BL.flac
    sample_BR.flac
    sample_FC.flac
    sample_FL.flac
    sample_FR.flac
    sample_LFE.flac
    
  2. 检查示例文件的元数据:

    ffprobe $PROJECT_FILES/Speech_48kFloat.wav
    

    输出如下所示:

    Duration: 00:00:05.12, bitrate: 1536 kb/s
    Stream #0:0: Audio: pcm_f32le ([3][0][0][0] / 0x0003), 48000 Hz, mono, flt, 1536 kb/s
    

    pcm_f32leflt 元数据值表示此文件具有浮点比特率。您需要将浮点比特率 WAV 文件转换为有符号整数格式。

  3. 将文件的比特率转换为有符号整数格式:

    ffmpeg -i $PROJECT_FILES/Speech_48kFloat.wav -c:a pcm_s16le output/Speech_48k16bNonFloatingPoint.wav
    

    此命令会创建一个新的 WAV 文件,其比特率采用有符号整数格式。

  4. 检查新创建的文件的元数据:

    ffprobe ~/output/Speech_48k16bNonFloatingPoint.wav
    

    输出如下所示:

    Duration: 00:00:05.12, bitrate: 768 kb/s
    Stream #0:0: Audio: pcm_s16le ([1][0][0][0] / 0x0001), 48000 Hz, 1 channels, s16, 768 kb/s
    

    元数据现在显示转换后文件的比特率采用有符号整数(小端字节序)格式,如 pcm_s16les16 标识所示。

在本地终端中运行教程示例

您可以在本地机器的终端中运行本教程中的所有示例。在本地运行示例可以使用 ffplay 命令直接播放音频和视频文件,而不用打开浏览器收听。

  1. 在本地机器的终端中安装 FFMPEG 工具:

    sudo apt update
    sudo apt install ffmpeg
    
  2. 将示例文件下载到本地机器:

    gcloud storage cp gs://cloud-samples-data/speech/project_files/*.* local_destination_path
    

    local_destination_path 替换为放置示例文件的位置。

  3. LOCAL_PATH 环境变量设置为您的计算机上下载示例文件的位置:

    export LOCAL_PATH=local_destination_path
    

    local_destination_path 替换为上一步中的路径。

  4. 在终端中,使用 ffplay 命令收听示例音频文件:

    • 音频文件:ffplay $LOCAL_PATH/HumptyDumpty4416.flac
    • 视频文件:ffplay $LOCAL_PATH/sample_51_mix_movie.mp4
    • Cloud Storage 存储桶播放:ffplay $GCS_BUCKET_PATH/HumptyDumpty4416.flac

    按照本教程前面部分中介绍的示例,在本地终端中进行实验。这有助于您更好地了解如何最高效地使用 Speech-to-Text。

问题排查

引起错误的因素有很多,因此您有必要了解一些常见错误并学习如何纠正。对于某个音频文件,您可能会遇到多个导致转录过程无法完成的错误。

音频太长

gcloud speech recognize 命令可以处理长度不超过 1 分钟的文件。例如,请尝试以下示例:

gcloud ml speech recognize $PROJECT_FILES/HumptyDumpty4416.flac \
    --language-code='en-US' --format=text

输出如下所示:

ERROR: (gcloud.ml.speech.recognize) INVALID_ARGUMENT: Request payload size exceeds the limit: 10485760 bytes.

引起该错误的原因在于您尝试使用 speech recognize 命令处理长度超过 1 分钟的文件。

对于长度超过 1 分钟但短于 80 分钟的文件,您可以使用 speech recognize-long-running 命令。如需查看文件的长度,您可以使用 ffprobe 命令,如以下示例所示:

ffprobe $PROJECT_FILES/HumptyDumpty4416.flac

输出内容类似如下:

Duration: 00:04:07.91, start: 0.000000, bitrate: 280 kb/s
Stream #0:0: Audio: flac, 44100 Hz, mono, s16

请注意,此音频文件的长度约为 4 分 8 秒。

读取本地计算机中的大型文件

speech recognize-long-running 命令只能处理本地计算机中长度不超过 1 分钟的文件。如需了解您可能会在哪方面遇到错误,请尝试在 Cloud Shell 中对较长的文件使用 speech recognize-long-running 命令:

gcloud ml speech recognize-long-running $PROJECT_FILES/HumptyDumpty4416.flac \
    --language-code='en-US' --format=text

输出如下所示:

ERROR: (gcloud.ml.speech.recognize-long-running) INVALID_ARGUMENT: Request payload size exceeds the limit: 10485760 bytes.

此错误不是由音频长度引起的,而是由本地机器上文件的大小所致。使用 recognize-long-running 命令时,文件必须位于 Cloud Storage 存储桶中。

如需读取长度超过 1 分钟的文件,请使用 recognize-long-running 从 Cloud Storage 存储桶中读取文件,如以下命令所示:

gcloud ml speech recognize-long-running $GCS_BUCKET_PATH/HumptyDumpty4416.flac \
    --language-code='en-US' --format=text

此过程需要几分钟才能完成。

清理

为避免因本教程中使用的资源导致您的 Google Cloud 账号产生费用,请删除包含这些资源的项目,或者保留项目但删除各个资源。

删除项目

  1. In the Google Cloud console, go to the Manage resources page.

    Go to Manage resources

  2. In the project list, select the project that you want to delete, and then click Delete.
  3. In the dialog, type the project ID, and then click Shut down to delete the project.

后续步骤