1. 概要
この Codelab では、Google Cloud Speech to Text API を使用して音声ファイルを送信し、その文字起こしを Google ドキュメントに出力する方法を学びます。Speech to Text API は使いやすく、強力なニューラル ネットワークを適用して開発者が音声をテキストに変換できます。さらに、ML を活用しています。
新しいドキュメントの作成と書き込みには 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 Console に戻り、[認証情報] に移動します。
- 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. ドキュメント クライアントを初期化する
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 クライアントを表します。
コード内で、Document 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 がドキュメントの 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 ドキュメントへのアクセスを承認するように求められます。アクセスを許可すると、ディレクトリに新しいファイルが保存されます。
作業ディレクトリ内に tokens というタイトルの新しく作成されたフォルダが表示されます。このフォルダには StoredCredential というファイルが含まれています。これは、先ほど指定した認証トークンです。クライアントが 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 タグを付けて質問を投稿したり回答を探したりします。