猫になりたい

コンサルのデータ分析屋、計量経済とか機械学習をやっています。pyてょnは3.7を使ってマスコレルウィンストングリーン。

機械学習:Pythonを使ってGoogle Speech-to-TextでCloud Storage上の音声ファイルをテキストに変換する

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のページに飛びましょう。

f:id:shikiponn:20190614164509p:plain:w500
Fig.1 Speech-to-textを検索する

Speech-to-textのページに飛んだら「有効化」のボタンを押してapiを有効化をします。
以下のような画面になったら有効化完了です。

f:id:shikiponn:20190614164839p:plain:w500
Fig2. Apiを有効化した後の画面

1-2 認証情報(サービスアカウントキー)の作成

Speech-to-Textを利用するための認証情報を作成します。

[APIとサービス]>[認証情報]からAPIライブラリのページに飛びます。

f:id:shikiponn:20190614210515p:plain:w500
Fig.3 認証情報設定の画面に遷移する

認証情報の画面に移動したら「認証情報を作成」からサービスアカウントキーを選択しましょう。

f:id:shikiponn:20190617143430p:plain:w500
Fig.4 認証情報画面で新しくサービスアカウントキーを作成する

そしたらサービスアカウントキーの設定画面に必要事項を記載したら「作成」ボタンを押します。 サービスアカウント名とサービスアカウントIDは任意の名前をつけて下さい、今回はtest-svc-accountという名前で作成しています。 Fig.5では隠れてしまっていますが、サービスアカウント名の右隣にある「役割」は図のように[Project]>[オーナー]を指定しました。 サービスアカウントキーを作成するとjsonファイルがダウンロードされるので無くさない様に分かりやすいところに保存しておきましょう。

f:id:shikiponn:20190617143846p:plain:w500
Fig.5 サービスアカウント名とサービスアカウントIDを適当に指定してサービスアカウントキーを作成する

1-3 バケットの作成

続いて音声ファイルを格納するためのバケット(フォルダのようなもの)をCloud Storage上に作成します。

まづ、ナビゲーションメニューの[Storage]>[ブラウザ]からCloud Storageの 管理画面に飛びます。

f:id:shikiponn:20190614180729p:plain:w500
Fig.6 Google Cloud Storageの管理画面に飛ぶ

そしたら「バケットの作成」ボタンを押し、

f:id:shikiponn:20190615091935p:plain:w500
FIg.7 「バケットの作成」ボタンからバケットの作成画面に飛ぶ

適当な名前とリージョンを指定したら画面下部の「作成」ボタンを押下します。

f:id:shikiponn:20190615092430p:plain:w500
Fig.8 「名前」と「場所」のみ任意の名前を指定して作成

これで音声ファイルをアップロードする場所が作成できました。

1-4 音声ファイルの準備とアップロード

今回はyoutubeの動画からサンプルとして使いやすそうな、敬語の基本 - YouTubeという5分ほどの動画の音声を抜き出して使用しました。

youtubeの動画をmp3の音声に変換する適当なサービスを利用してmp3ファイルをダウンロードしておきましょう。 (Speech-to-Textではmp3は使用できないのですが、後でエンコーディングを変更の仕方を解説するのでここではそのままにしておいて下さい。)

音声ファイルを作成したら、 Google Cloud Storageの管理画面の先程作ったバケットの名前をクリックし、バケットの詳細画面から音声ファイルをアップロードします。

f:id:shikiponn:20190615095953p:plain:w500
Fig.9 バケットの詳細画面に先程ダウンロードしたmp3ファイルをドラッグ&ドロップしてアップロードする

ここまでで準備はおしまいです。


スポンサーリンク

2. Speeh-to-Textを試す

前準備は終わったのでCloud Shell上からSpeech-to-Textを動かしてみましょう。

ここからの作業はCloud Shell内で行うのでCloud Shellを立ち上げておきます。

f:id:shikiponn:20190615124838p:plain:w200
Fig.10 右上のボタンからCloud Shellを起動する

2-1 サービスアカウントキーのアップロードと登録

Speech-to-textを実行するのに必要なサービスアカウントの認証情報をCloud Shellの環境にアップロードします。

Cloud Shellのアップロードボタンから1-2でダウンロードした、サービスアカウントキーのjsonファイルをアップロードしましょう。

f:id:shikiponn:20190617150702p:plain:w500
Fig.11 クラウドシェルの「ファイルをアップロード」ボタンからサービスアカウントキーをアップロードする

ls で確認するとjsonファイルがアップロードされているのが確認できます。

f:id:shikiponn:20190617152315p:plain:w600
Fig.12 アップロードした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形式のファイルが追加されていれば成功です。

f:id:shikiponn:20190615212810p:plain:w500
Fig.13 元のmp3ファイルとは別に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)をサービスアカウントキーと同様にアップロードしたら、

f:id:shikiponn:20190615220535p:plain:w500
Fig.14 作成したプログラムをホームディレクトリにアップロードする

以下のコマンドを叩いて実行しましょう。

python transcribe.py gs://test-test989/敬語の基本.flac

実行して暫く待つと処理が終わり、以下の様に実行ファイルと同じ階層にoutput.txtが出力されます。

f:id:shikiponn:20190617153702p:plain:w600
Fig.15 output.txtが出力されていることが確認できる

headで中身を確認すると以下のようになっている筈です。
簡単そうな動画を選んだこともあってか、見た感じ概ね良好な結果になっていますね。

f:id:shikiponn:20190616153341p:plain:w600
Fig.16 Speech-to-Textでテキスト化した結果の先頭部分


スポンサーリンク

3. まとめ

以上のようにこの記事ではGoogle Speech-to-Textを用いて音声ファイルを文字に変換してみました。 Speech-to-Textを使う際には入力ファイルの形式に少し気を使う必要はありますが、それさえどうにかしてしまえば簡単に使えることは魅力的です。 音声データを文字に変換してテキスト解析にかけられるため、今まではテキスト解析にかけられなかった様なデータも分析できるようになることでしょう。

一方で、話者が複数存在する場合に話者を分けて出力をすることはでき無さそうなので、その様な分析をする際はなにか別の方法をとる必要がありそうです。

参考資料

  1. 入門ガイド  |  Cloud Speech-to-Text  |  Google Cloud
  2. Cloud Speech-to-Text の基本  |  Cloud Speech-to-Text ドキュメント  |  Google Cloud
  3. ベスト プラクティス  |  Cloud Speech-to-Text ドキュメント  |  Google Cloud
  4. Google Cloud Speech API を使った音声の文字起こし手順 - Qiita
  5. 【GCP】超超初心者がGoogle speech api を使うところ。(wav形式) - Qiita
  6. 超初心者でもgoogle-cloud-speechを使えるが、つまずいた所はある。 - Qiita
  7. 【Python】Google Cloud Speech-to-Text APIの2種類のライブラリを使い比べてみた - Qiita
  8. ffmpeg使い方 - Qiita

*1:正確に言うとpython向けのライブラリもSpeech-to-Text v1 とクライアントライブラリの二種類があります。ここで使用しているのはアルファ版のクライアントライブラリの方です。本番環境での使用を推奨されているSpeech-to-Text v1 を使用する際はこちらの公式ドキュメントをご参照下さい