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 Docs 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:
- Speech to Text
- 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 檔案中,找出主要方法宣告,並概略瞭解其中內容:
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 用戶端,會保存您的憑證;在這個情況下,服務即為使用者驗證。
在您的程式碼中,凡是呼叫 Docs API 的函式都必須使用這個 service
變數,才能執行文件相關工作。
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()
;如果音訊檔案在赫茲的取樣率不同,您就必須編輯 setSampleRateHertz()
(最佳版本為 1600)。
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 文件中列印文字的位置。透過原始碼,您將在文件內文中插入文字。
讓我們將下列程式碼插入函式中,瞭解 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 值區雲端硬碟,並觸發 Google Cloud 函式執行這段程式碼
- 在 Google 文件中插入非空白的文字
瞭解詳情
- 參閱 Google Docs API 開發人員說明文件
- 在 Stack Overflow 上提問及尋找解答,並置於 google-docs-api 標記下方