使用 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 Docs 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. Speech to Text
  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. 初始化 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,自動與其他人共用這份文件。

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

ee73fcdd1dbcdcff.png

10. 恭喜!

您已學會如何建立 Google 文件、呼叫 Speech-to-Text API,以及將音訊檔案的轉錄稿輸出到自己建立的文件中。

可能的改善項目

如要進行更具吸引力的整合服務,請參考以下建議:

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

瞭解詳情