1. 概览
在此 Codelab 中,您将学习如何通过 Google Cloud Speech-to-Text API 发送音频文件,然后将转写内容输出到 Google 文档。Speech-to-Text API 简单易用,并应用了强大的神经网络,让开发者可以将音频转换为文字!此外,它还采用机器学习技术。
您将使用 Google Docs API 创建新文档并向其中写入内容。您将创建一个 Java 命令行应用,使用 Gradle 构建系统运行代码,然后使用 Docs API 查看结果。
学习内容
- 如何使用 Google Cloud Speech-to-Text API
- 如何使用 Google 文档 API 创建新文档
- 如何使用 Docs API 写入文档
所需条件
- 已安装 Java(版本 7 或更高版本)
- 已安装 Gradle(版本 5 或更高版本)
- 能够访问互联网和网络浏览器
- Google 账号
- Google Cloud Platform 项目
2. 设置项目
创建云项目
请记住项目 ID,它在所有 Google Cloud 项目中都是唯一的名称(上述名称已被占用,您无法使用,抱歉!)。它稍后将在此 Codelab 中被称为 PROJECT_ID。
- 接下来,您需要在 Cloud 控制台中启用结算功能,才能使用 Google Cloud 资源。
运行此 Codelab 应该不会产生太多的费用(如果有费用的话)。请务必按照“清理”部分中的所有说明操作,该部分介绍了如何关停资源,以免产生超出本教程范围的结算费用。Google Cloud 的新用户符合参与 $300 USD 免费试用计划的条件。
获取 Cloud Speech-to-Text API 的服务账号密钥

- 前往 GCP 控制台,找到您的新项目
- 创建服务账号
- 以 JSON 格式下载服务账号密钥
- 将环境变量 GOOGLE_APPLICATION_CREDENTIALS 设置为包含服务账号密钥的 JSON 文件的文件路径。如果您重启 shell 会话,则必须再次设置该变量。
$ export GOOGLE_APPLICATION_CREDENTIALS="[PATH]"
例如:
$ export GOOGLE_APPLICATION_CREDENTIALS="/home/usr/downloads/ServiceAccount.json"
获取 Docs API 的凭据
- 返回 GCP 控制台,前往凭据
- 创建 OAuth 2.0 密钥并将其下载为 JSON 文件
- 将文件重命名为
credentials.json,并确保该文件位于代码的src/main/resources/目录中
启用 API

- 选择信息中心标签页,点击启用 API 和服务按钮,然后启用以下 2 个 API:
- 语音转文字
- Google 文档

现在,您可以继续操作并开始处理代码了。
3. 设置代码
获取示例代码
如需获取示例代码,您可以将 zip 文件下载到计算机…
…或从命令行克隆 GitHub 代码库。
$ git clone git@github.com:googleworkspace/docs-transcript-codelab.git
您将在 start 目录中的 CreateTranscript.java 文件中进行操作。不应修改 Gradle 文件。
在您的目录中,前往 start 文件夹,然后打开 CreateTranscript.java 文件。向下滚动,直到看到 CreateTranscript 类声明。
public class CreateTranscript {
private static final String CREDENTIALS_FILE_PATH = "/credentials.json";
// Specify audio file name below.
private static final String AUDIO_FILENAME = "audioFile.wav";
private static final String TOKENS_DIRECTORY_PATH = "tokens";
private static final JsonFactory JSON_FACTORY = JacksonFactory.getDefaultInstance();
private static final String APPLICATION_NAME = "CreateTranscript";
private static final List<String> SCOPES = Collections.singletonList(DocsScopes.DOCUMENTS);
对于 SCOPES 变量,您已指定您的代码将能够查看和管理用户的 Google 文档。如果您的代码需要超出或不同于此访问权限的授权,请务必根据 OAuth 2.0 Google API 范围相应地调整此变量。
例如,如果您不是在 Google 文档中写入内容,则可以将范围更改为 DOCUMENTS_READONLY。SCOPES 变量不仅是应用获得适当访问权限所必需的,也是保持用户透明度的必要条件。在 OAuth 验证页面中,系统会向用户显示您请求的具体范围,用户必须同意才能使用应用。
重命名变量
确保已为您的项目正确声明上述变量。
- 请确保 AUDIO_FILENAME 设置为要发送到 Speech-to-Text API 的演示文件名。在 CreateTranscript.java 文件中,您应该已经看到它设置正确。
- 将 CREDENTIALS_FILE_PATH 重命名为下载的凭据文件的名称(应为“/
credentials.json'”)。请确保此文件位于文件夹的src/main/resources目录中,因此如果 GitHub 克隆未创建此目录,请务必自行创建。
现在,您可以开始运行代码了!
4. 初始化 Google 文档客户端
在 CreateTranscript.java 文件中,找到 main 方法声明,并查看其中的内容:
final NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport();
Docs service = new Docs.Builder(HTTP_TRANSPORT, JSON_FACTORY,
getCredentials(HTTP_TRANSPORT))
.setApplicationName(APPLICATION_NAME)
.build();
函数授权
您在此处执行的第一个任务是创建 Docs service(变量)。该服务表示已获授权的 API 客户端,其中包含您的凭据以及(在本例中)您的最终用户身份验证信息。
在您的代码中,任何调用 Google 文档 API 的函数都需要使用此 service 变量才能执行与 Google 文档相关的任务。
5. 创建 Google 文档
您将创建一个具有指定标题的新 Google 文档。因此,我们来复制 createDocument 函数中的以下代码。
Document doc = new Document().setTitle("Transcript for " +
AUDIO_FILENAME);
doc = service.documents().create(doc).execute();
String documentId = doc.getDocumentId();
return documentId;
此函数会返回 Google 文档的云端硬盘文件 ID。此 ID 可在相应文档的网址中找到。
接下来,您将初始化 Speech-to-Text 客户端。
6. 调用 Speech-to-Text API
您要在代码中执行的下一个任务是获取音频文件的书面转写内容。在 CreateTranscript.java 中,找到 getTranscript() 函数。
首先,获取音频文件的路径和音频字节:
SpeechClient speech = SpeechClient.create();
Path path = Paths.get(AUDIO_FILENAME);
byte[] data = Files.readAllBytes(path);
ByteString audioBytes = ByteString.copyFrom(data);
配置语音识别
接下来,您必须正确初始化 RecognitionConfig 变量。
在此处,config 提供有关语音识别器应如何准确处理请求的信息。如果您的音频文件采用的语言不是英语,则需要修改 setLanguageCode();如果您的音频文件的采样率(以赫兹为单位)不是 1600(这是最佳采样率),则需要更改 setSampleRateHertz()。
RecognitionConfig config =
RecognitionConfig.newBuilder()
.setEncoding(AudioEncoding.LINEAR16)
.setLanguageCode("en-US")
.setSampleRateHertz(8000)
.build();
RecognitionAudio audio =
RecognitionAudio.newBuilder().setContent(audioBytes).build();
RecognizeResponse response = speech.recognize(config, audio);
List<SpeechRecognitionResult> results = response.getResultsList();
准备文本
最后,处理音频文件的转写内容 result 变量,并准备将其插入到文档中。
结果中的每个项都是 SpeechRecognitionAlternatives 类型的转写。因此,每个项都包含两部分:文字转写内容和 API 的相应置信度得分。
List<Request> requests = new ArrayList<>();
for (SpeechRecognitionResult result : results) {
// Using the first + most likely alternative transcript
SpeechRecognitionAlternative alternative =
result.getAlternativesList().get(0);
String toInsert = alternative.getTranscript();
// Add requests array list to return.
requests.add(
new Request()
.setInsertText(
new InsertTextRequest()
.setText(toInsert)
.setEndOfSegmentLocation(new
EndOfSegmentLocation().setSegmentId(""))));
}
return requests;
7. 将文本插入到文档中
现在,您将转写文本插入到 Google 文档中。如需对文档进行任何修改,您都需要使用 BatchUpdate 方法。BatchUpdate 是不同类型的写入请求的容器,在此处,您将使用 InsertTextRequest。
EndOfSegmentLocation 是一个重要参数,用于指定您希望在文档中的哪个位置打印文本。在源代码中,您正在将文本插入到文档正文中。
让我们将以下代码插入到您的函数中,看看 Speech-to-Text API 结果与对 Docs API 的调用相结合,如何让我们在 Google 文档中插入音频文件的转写内容:
BatchUpdateDocumentRequest body = new BatchUpdateDocumentRequest();
service.documents().batchUpdate(docId,
body.setRequests(insertRequests)).execute();
创建请求
在发出 BatchUpdate 请求时,您需要设置两个非常重要的规范:您要打印的内容 (.setText()),以及您要在文档中的哪个位置打印 (.setIndex(1))。
您现在已将音频文件的转写内容插入到创建的文档中。
8. 运行代码
现在,您已拥有所需的所有代码,可以获取音频文件、获取其转写内容,并将转写内容打印到新创建的 Google 文档中。接下来,让我们开始行动吧!
由于您将使用 Gradle 构建系统运行 Java 代码,因此必须告知 build.gradle 文件要构建和运行的内容。在此项目和其他项目中,请确保 mainClassName 与您要运行的 Java 类保持一致。
太棒了!现在,您可以运行代码了。为此,请在命令行中输入以下内容:
$ gradle run
最终用户身份验证
首次运行此代码时,您会在终端中看到一个网址,系统会要求您登录服务账号并授权访问其 Google 文档。允许访问后,您会发现目录中存储了一个新文件。
在工作目录中,您会看到一个名为 tokens 的新创建的文件夹,其中包含一个文件 StoredCredential。这是您刚刚提供的身份验证令牌,您的客户端已从 Google 身份验证服务器请求此令牌,并从其响应中提取了此令牌,现在将通过您调用的任何 API 发送此令牌。
解决方案
如果您的代码无法正常运行,请查看 CreateTranscript.java 文件夹中的 CreateTranscript.java 文件。此文件包含您的所有代码,这些代码必须完全符合要求才能成功运行。
现在,我们来看看结果。
9. 查看结果
您刚刚创建了一个新的 Google 文档,其中包含音频文件的转写内容,现在我们来看看它。
此文档是通过最终用户提供授权的账号创建的。一种可能的扩展是,您可以使用 Drive API 自动与他人共享此文档。
使用您的源代码和提供的音频文件,您应该会看到以下内容:

10. 恭喜!
您现在已经学会了如何创建 Google 文档、调用 Speech-to-Text API,以及将音频文件的转写内容输出到您创建的文档中。
可能的改进
以下是一些建议,可帮助您打造更具吸引力的集成:
- 设置代码,使其监听音频文件何时已添加到您的 Google Cloud Storage 存储分区 Drive,并触发 Google Cloud Functions 函数来执行此代码
- 尝试将文本插入到非空的 Google 文档中
了解详情
- 阅读 Google 文档 API 开发者文档
- 在 Stack Overflow 上发布问题和查找答案时,请使用 google-docs-api 标记