Google Cloud Platform (GCP)のGoogle Speech-to-Text(Speech-to-Text)の使い方についてまとめました。 今回は特に、Pythonを使ってSpeech-to-TextでGoogle Cloud Storage上の音声ファイルをテキストに変換する方法についてまとめています。
既存のネット上の情報だけでは音声ファイルの設定方法の詳細が書いて無く上手くいかないところがあったので、出来るだけこの記事だけで完結出来るようにしました。また、操作は可能な限りCloud Shell上だけで行えるようもしました。
1. 準備
Speech-to-Textを試す前にAPIのセットアップやデータの用意等必要な準備を済ませましょう。
1-1 Speech-to-Textの有効化
先づ、GCPのナビゲーションメニューの[APIとサービス]>[ライブラリ]からAPIライブラリのページに飛びます。 そしたら検索窓に「speech」と入れてSpeech-to-textのページに飛びましょう。
Speech-to-textのページに飛んだら「有効化」のボタンを押してapiを有効化をします。
以下のような画面になったら有効化完了です。
1-2 認証情報(サービスアカウントキー)の作成
Speech-to-Textを利用するための認証情報を作成します。
[APIとサービス]>[認証情報]からAPIライブラリのページに飛びます。
認証情報の画面に移動したら「認証情報を作成」からサービスアカウントキーを選択しましょう。
そしたらサービスアカウントキーの設定画面に必要事項を記載したら「作成」ボタンを押します。 サービスアカウント名とサービスアカウントIDは任意の名前をつけて下さい、今回はtest-svc-accountという名前で作成しています。 Fig.5では隠れてしまっていますが、サービスアカウント名の右隣にある「役割」は図のように[Project]>[オーナー]を指定しました。 サービスアカウントキーを作成するとjsonファイルがダウンロードされるので無くさない様に分かりやすいところに保存しておきましょう。
1-3 バケットの作成
続いて音声ファイルを格納するためのバケット(フォルダのようなもの)をCloud Storage上に作成します。
まづ、ナビゲーションメニューの[Storage]>[ブラウザ]からCloud Storageの 管理画面に飛びます。
そしたら「バケットの作成」ボタンを押し、
適当な名前とリージョンを指定したら画面下部の「作成」ボタンを押下します。
これで音声ファイルをアップロードする場所が作成できました。
1-4 音声ファイルの準備とアップロード
今回はyoutubeの動画からサンプルとして使いやすそうな、敬語の基本 - YouTubeという5分ほどの動画の音声を抜き出して使用しました。
youtubeの動画をmp3の音声に変換する適当なサービスを利用してmp3ファイルをダウンロードしておきましょう。 (Speech-to-Textではmp3は使用できないのですが、後でエンコーディングを変更の仕方を解説するのでここではそのままにしておいて下さい。)
音声ファイルを作成したら、 Google Cloud Storageの管理画面の先程作ったバケットの名前をクリックし、バケットの詳細画面から音声ファイルをアップロードします。
ここまでで準備はおしまいです。
スポンサーリンク
2. Speeh-to-Textを試す
前準備は終わったのでCloud Shell上からSpeech-to-Textを動かしてみましょう。
ここからの作業はCloud Shell内で行うのでCloud Shellを立ち上げておきます。
2-1 サービスアカウントキーのアップロードと登録
Speech-to-textを実行するのに必要なサービスアカウントの認証情報をCloud Shellの環境にアップロードします。
Cloud Shellのアップロードボタンから1-2でダウンロードした、サービスアカウントキーのjsonファイルをアップロードしましょう。
ls
で確認するとjsonファイルがアップロードされているのが確認できます。
アップロードが確認できたら、サービスアカウントキーを環境変数に登録しましょう。
# jsonのファイル名はご自身のサービスアカウントキーのものに変更して下さい export GOOGLE_APPLICATION_CREDENTIALS=~/My\ First\ Project-0e4b8d19a949.json
これでCloud ShellのインスタンスからSpeech-to-Textを実行することが出来るようになりました。
2-2 音声ファイルの変換
次に文字に起こす音声ファイルをSpeech-to-Textが認識可能な形式に変更します。 Googleは中でもFLACかLINEAR16コーデックをおすすめしているので、今回はFLACに変換しました。 但し、Cloud Storage内のファイルを直接処理することはできないので、一旦Cloud Shell内にファイルをコピーしてからffmpegでコーデックを変更し、Cloud Storage内に書き戻すことにしました。
ターミナルで以下を実行しましょう。
以降のバケット名(ここではtest-test989)やファイル名(敬語の基本.mp3、敬語の基本.flac)は自身のバケット名に適宜置き換えてください。
# ffmpegのインストール sudo apt install -y ffmpeg # Cloud StorageからCloud Shell内のhomeにファイルをコピーする gsutil cp gs://test-test989/敬語の基本.mp3 . # 形式をモノラルのflacに変換する ffmpeg -i 敬語の基本.mp3 -ac 1 敬語の基本.flac # Cloud ShellからCloud Storage内にflac形式のファイルをコピーする gsutil cp 敬語の基本.flac gs://test-test989
Cloud Storageを確認してみて次のようにflac形式のファイルが追加されていれば成功です。
2-3 テキストへの変換プログラムの作成と実行
ここまで実行したら、後はSpeech-to-Textを実行するプログラムを書いて動かすだけです。
まづ、実行に必要なpythonのgoogle-cloud-speech
パッケージをインストールします。
sudo pip install google-cloud-speech
そしたら以下の、「Cloud Driveのuriを受け取り、書き起こした結果をoutput.txtに書き出す」プログラムを作成して、Cloud Shell上にアップロードしましょう。ファイル名はtranscribe.py
としています。
(Cloud Shell上のpythonは2.7なので久々に2.7で書いたのですが、文字エンコード周りが死ぬほど面倒くさいですね……)
尚、Speech-to-Textには音声認識のための3種類のapiがありますが、1分以上の音声ファイルはlong_running_recognize
メソッドを使え、と長い音声ファイルの文字変換に記載がありましたので、今回はこちらのメソッドを使用します。 *1
# !/usr/bin/env python # coding: utf-8 import argparse import codecs from google.cloud import speech from google.cloud.speech import enums from google.cloud.speech import types def transcribe_gcs(gcs_uri): """ Asynchronously transcribes the audio file specified by the gcs_uri. """ client = speech.SpeechClient() audio = types.RecognitionAudio(uri=gcs_uri) config = types.RecognitionConfig( encoding=enums.RecognitionConfig.AudioEncoding.FLAC, # sample_rate_hertz=16000, # FLACの場合自動判定できるのでコメントアウト language_code='ja-JP') # 日本語を指定 operation = client.long_running_recognize(config, audio) print('Waiting for operation to complete...') # 10分以内に処理できなければ中断 response = operation.result(timeout=60*10) return response if __name__ == '__main__': parser = argparse.ArgumentParser() parser.add_argument('path') args = parser.parse_args() # Speech-to-Text実行 response = transcribe_gcs(args.path) # 結果の出力 with codecs.open('output.txt', 'w', 'utf-8') as f: for result in response.results: text = result.alternatives[0].transcript f.write(text)
このプログラム(output.txt)をサービスアカウントキーと同様にアップロードしたら、
以下のコマンドを叩いて実行しましょう。
python transcribe.py gs://test-test989/敬語の基本.flac
実行して暫く待つと処理が終わり、以下の様に実行ファイルと同じ階層にoutput.txtが出力されます。
head
で中身を確認すると以下のようになっている筈です。
簡単そうな動画を選んだこともあってか、見た感じ概ね良好な結果になっていますね。
スポンサーリンク
3. まとめ
以上のようにこの記事ではGoogle Speech-to-Textを用いて音声ファイルを文字に変換してみました。 Speech-to-Textを使う際には入力ファイルの形式に少し気を使う必要はありますが、それさえどうにかしてしまえば簡単に使えることは魅力的です。 音声データを文字に変換してテキスト解析にかけられるため、今まではテキスト解析にかけられなかった様なデータも分析できるようになることでしょう。
一方で、話者が複数存在する場合に話者を分けて出力をすることはでき無さそうなので、その様な分析をする際はなにか別の方法をとる必要がありそうです。
参考資料
- 入門ガイド | Cloud Speech-to-Text | Google Cloud
- Cloud Speech-to-Text の基本 | Cloud Speech-to-Text ドキュメント | Google Cloud
- ベスト プラクティス | Cloud Speech-to-Text ドキュメント | Google Cloud
- Google Cloud Speech API を使った音声の文字起こし手順 - Qiita
- 【GCP】超超初心者がGoogle speech api を使うところ。(wav形式) - Qiita
- 超初心者でもgoogle-cloud-speechを使えるが、つまずいた所はある。 - Qiita
- 【Python】Google Cloud Speech-to-Text APIの2種類のライブラリを使い比べてみた - Qiita
- ffmpeg使い方 - Qiita