使用 Google 文件 & 建立業務會議的轉錄稿;機器學習

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. 設定專案

建立雲端專案

  1. 登入 Cloud 控制台,建立新專案或重複使用現有專案。(如果沒有 Gmail 或 Workspace 帳戶,請先建立帳戶)。

dMbN6g9RawQj_VXCSYpdYncY-DbaRzr2GbnwoV7jFf1u3avxJtmGPmKpMYgiaMH-qu80a_NJ9p2IIXFppYk8x3wyymZXavjglNLJJhuXieCem56H30hwXtd8PvXGpXJO9gEUDu3cZw

ci9Oe6PgnbNuSYlMyvbXF1JdQyiHoEgnhl4PlV_MFagm2ppzhueRkqX4eLjJllZco_2zCp0V0bpTupUSKji9KkQyWqj11pqit1K1faS1V6aFxLGQdkuzGp4rsQTan7F01iePL5DtqQ

8-tA_Lheyo8SscAVKrGii2coplQp2_D1Iosb2ViABY0UUO1A8cimXUu6Wf1R9zJIRExL5OB2j946aIiFtyKTzxDcNnuznmR45vZ2HMoK3o67jxuoUJCAnqvEX6NgPGFjCVNgASc-lg

請記住專案 ID,這是所有 Google Cloud 專案中不重複的名稱 (上述名稱已遭占用,因此不適用於您,抱歉!)。本程式碼研究室稍後會將其稱為 PROJECT_ID

  1. 接著,您必須在 Cloud 控制台中啟用帳單,才能使用 Google Cloud 資源。

完成本程式碼研究室的費用應該不高,甚至完全免費。請務必按照「清除」部分的指示操作,瞭解如何停用資源,避免在本教學課程結束後繼續產生帳單費用。Google Cloud 新使用者可參加價值$300 美元的免費試用計畫。

取得 Cloud Speech-to-Text API 的服務帳戶金鑰

60f112dedc208681.png

  1. 前往 GCP 主控台,找出新專案
  2. 建立服務帳戶
  3. 以 JSON 格式下載服務帳戶金鑰
  4. 將環境變數 GOOGLE_APPLICATION_CREDENTIALS 設為包含服務帳戶金鑰的 JSON 檔案路徑。如果重新啟動殼層工作階段,就必須再次設定變數。
$ export GOOGLE_APPLICATION_CREDENTIALS="[PATH]"

例如:

$ export GOOGLE_APPLICATION_CREDENTIALS="/home/usr/downloads/ServiceAccount.json"

取得 Docs API 的憑證

  1. 返回 GCP 主控台,前往「憑證」
  2. 建立 OAuth 2.0 金鑰並下載為 JSON 檔案
  3. 將檔案重新命名為 credentials.json,並確認檔案位於程式碼的 src/main/resources/ 目錄中

啟用 API

3066cf79c136a078.png

  1. 選取「資訊主頁」分頁標籤,按一下「啟用 API 和服務」按鈕,然後啟用下列 2 項 API:
  2. 語音轉文字
  3. Google 文件

846ba54aa7e1e584.png

現在可以開始使用程式碼了。

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_READONLYSCOPES 變數不僅是應用程式取得適當存取權限的必要條件,也是維持使用者透明度的重要因素。使用者會在 OAuth 驗證頁面看到您要求的特定範圍,且必須同意才能使用應用程式。

重新命名變數

請確認專案已正確宣告上述變數。

  1. 請確認 AUDIO_FILENAME 已設為您要傳送至 Speech-to-Text API 的示範檔案名稱。在 CreateTranscript.java 檔案中,您應該會看到已正確設定。
  2. 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 自動與他人共用這份文件。

使用原始碼和提供的音訊檔案,您應該會看到以下內容:

ee73fcdd1dbcdcff.png

10. 恭喜!

您已瞭解如何建立 Google 文件、呼叫 Speech-to-Text API,以及將音訊檔案的轉錄稿輸出至您建立的文件。

可能的改善做法

以下提供幾個建議,協助您打造更具吸引力的整合功能:

  • 設定程式碼,監聽音訊檔案何時新增至 Google Cloud Storage bucket 雲端硬碟,並觸發 Google Cloud 函式來執行這段程式碼
  • 在非空白的 Google 文件中插入文字

瞭解詳情