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 Docs API を使用して新しいドキュメントを作成する方法
- Docs API を使用してドキュメントに書き込む方法
必要なもの
- Java がインストールされている(バージョン 7 以降)
- Gradle がインストールされている(バージョン 5 以降)
- インターネット アクセスとウェブブラウザ
- Google アカウント
- Google Cloud Platform プロジェクト
2. プロジェクトをセットアップする
クラウド プロジェクトを作成する
- Cloud コンソールにログインして、新しいプロジェクトを作成するか、既存のプロジェクトを再利用します(Gmail アカウントも Workspace アカウントもまだお持ちでない場合は、アカウントを作成してください)。
プロジェクト ID を忘れないようにしてください。プロジェクト ID はすべての Google Cloud プロジェクトを通じて一意の名前にする必要があります(上記の名前はすでに使用されているので使用できません)。以降、このコードラボでは PROJECT_ID と呼びます。
- 次に、Google Cloud リソースを使用するために、Cloud Console で課金を有効にする必要があります。
このコードラボを実行しても、費用はほとんどかからないはずです。このチュートリアル以外で請求が発生しないように、リソースのシャットダウン方法を説明する「クリーンアップ」セクションの手順に従うようにしてください。Google Cloud の新規ユーザーは、300 米ドル分の無料トライアル プログラムをご利用いただけます。
Cloud Speech-to-Text API のサービス アカウント キーを取得する

- GCP Console に移動して、新しいプロジェクトを見つけます。
- サービス アカウントを作成する
- サービス アカウント キーを 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 ファイルで、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 クライアントを表し、認証情報と(この場合は)エンドユーザー認証を保持します。
コード内で Docs API を呼び出す関数は、Docs 関連のタスクを実行するためにこの 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 は、ドキュメントの URL 内でも確認できます。
次に、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() を編集し、音声ファイルのサンプルレートが異なる場合(1,600 が最適)は 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 の対応する信頼度スコアの 2 つの部分が含まれます。
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))という 2 つの非常に重要な仕様を設定します。
これで、作成したドキュメントに音声ファイルの文字起こしが挿入されました。
8. コードを実行する
音声ファイルを取得し、その文字起こしを取得して、新しく作成した Google ドキュメントに文字起こしを印刷するために必要なコードがすべて揃ったので、早速実行してみましょう。
gradle ビルドシステムを使用して Java コードを実行するため、build.gradle ファイルでビルドと実行の対象を正確に指定する必要があります。このプロジェクトや他のプロジェクトでは、実行する Java クラスと mainClassName の整合性を保つようにしてください。
これで、これで、コードを実行する準備が整いました。これを行うには、コマンドラインに次のコマンドを入力します。
$ gradle run
エンドユーザー認証
このコードを初めて実行すると、ターミナルに URL が出力され、サービス アカウントにログインして Google ドキュメントへのアクセスを承認するよう求められます。アクセスを許可すると、ディレクトリに新しいファイルが保存されます。
作業ディレクトリに、StoredCredential というファイルを含む tokens という名前の新しいフォルダが表示されます。これは、先ほど提供した認証トークンです。クライアントが Google 認証サーバーにリクエストし、そのレスポンスから抽出して、呼び出す API に送信します。
解決策
コードが動作しない場合は、CreateTranscript.java フォルダ内の CreateTranscript.java ファイルの中身を確認してください。このファイルには、コードが正常に実行されるために必要なすべてのコードが記述されています。
結果を見てみましょう。
9. 結果の表示
音声ファイルの文字起こしを含む新しい Google ドキュメントが作成されたので、見てみましょう。
このドキュメントは、エンドユーザーが承認したアカウントを使用して作成されました。たとえば、Drive API を使用して、このドキュメントを他のユーザーと自動的に共有できます。
ソースコードと提供された音声ファイルを使用すると、次のようになります。

10. 完了
これで、Google ドキュメントを作成し、Speech-to-Text API を呼び出して、作成したドキュメントに音声ファイルの文字起こしを出力する方法を学びました。
考えられる改善
さらに魅力的な統合を行うためのアイデアを紹介します。
- 音声ファイルが Google Cloud Storage バケットのドライブに追加されたときにリッスンするようにコードを設定し、このコードを実行する Google Cloud Functions をトリガーします。
- 空ではない Google ドキュメントにテキストを挿入してみる
詳細
- Google Docs API のデベロッパー向けドキュメントを読む。
- Stack Overflow で、google-docs-api タグを付けて質問を投稿し、回答を見つける