1. 總覽
在本程式碼研究室中,您將瞭解如何透過 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 專案中不重複的名稱 (上述名稱已遭占用,因此不適用於您,抱歉!)。本程式碼研究室稍後會將其稱為 PROJECT_ID。
- 接著,您必須在 Cloud 控制台中啟用帳單,才能使用 Google Cloud 資源。
完成本程式碼研究室的費用應該不高,甚至完全免費。請務必按照「清除」部分的指示操作,瞭解如何停用資源,避免在本教學課程結束後繼續產生帳單費用。Google Cloud 新使用者可參加價值$300 美元的免費試用計畫。
取得 Cloud Speech-to-Text API 的服務帳戶金鑰

- 前往 GCP 主控台,找出新專案
- 建立服務帳戶
- 以 JSON 格式下載服務帳戶金鑰
- 將環境變數 GOOGLE_APPLICATION_CREDENTIALS 設為包含服務帳戶金鑰的 JSON 檔案路徑。如果重新啟動殼層工作階段,就必須再次設定變數。
$ 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. 初始化文件用戶端
在 CreateTranscript.java 檔案中,找出主要方法宣告,並查看其中的內容:
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。您可以在 Google 文件網址中找到這個 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 是重要參數,可指定要在 Google 文件中列印文字的位置。在原始碼中,您要在 Google 文件的內文中插入文字。
請在函式中插入下列程式碼,瞭解如何搭配使用 Speech-to-Text API 結果和 Docs API 呼叫,在 Google 文件中插入音訊檔案的轉錄稿:
BatchUpdateDocumentRequest body = new BatchUpdateDocumentRequest();
service.documents().batchUpdate(docId,
body.setRequests(insertRequests)).execute();
建立要求
提出 BatchUpdate 要求時,您會設定兩項非常重要的規格:要列印的內容 (.setText()),以及要在文件中列印的位置 (.setIndex(1))。
現在,音訊檔案的轉錄稿已插入您建立的 Google 文件中。
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 bucket 雲端硬碟,並觸發 Google Cloud 函式來執行這段程式碼
- 在非空白的 Google 文件中插入文字
瞭解詳情
- 參閱 Google Docs API 開發人員說明文件
- 在 Stack Overflow 使用 google-docs-api 標籤來發問及尋找答案。