Google Cloud Speech APIを使って音声の文字起こし

発端

「議事録を書いて欲しい」の一言。会議に参加して、必死に聞いて、同時にメモを取る。そんなことはしたくなかったので、どうにか楽してやってやろうと思った。以前からGoogle Cloud Speech APIの存在は知っていたし、AWSでもAmazon Transcribeという存在を知っていた(こちらは現時点では日本語未対応)
これは挑戦するチャンスでは! ということでやってみました
(もちろんAIメーカーの存在は知ってましたが、どうせなら自分でやってみたいと思ったのでAIメーカーは使わず)

インターネットは素晴らしい

インターネットには神々がいらっしゃる。とにかく何かをするときには「まずググる」ことから始める僕。Qiitaでめちゃくちゃ良いのを見つけた。

Google Cloud Speech API を使った音声の文字起こし手順

「もうまさにコレやん。。」となりました。
しかし、Python初心者の僕にはPythonコードが何をしているのかわからず、さらにはGCPも触ったことがない状態。このまま手順に沿ってコピペするだけでは意味がないので、GCPチュートリアルPythonコードのわからない部分を調べて纏めようと思いました。

GCPチュートリアル

まずはGCPチュートリアルから始めます。 下記のものに目を通しました。よくある質問は無料利用枠について記載があったので読みました。

ざっと目を通して、Qiita記事のPythonコードにあるメソッドだとか、とにかく音声変換に必要そうなところに集中する感じで読み進めました。

Pythonコードについて

ここからが問題です。Python初心者の僕にとって初めて見る記述がいっぱいあるのです。なんてこった。

codecs.open

まず1つ目です。

codecs.open('output{}.txt'.format(today), 'a', 'shift_jis')

ライブラリについてはPythonドキュメントを読む。ドキュメントを読むとどうやらここではエンコードされたファイルを開こうとしているみたい。そのときのファイル名がoutput{}.txtの部分で、'a'は追記モード。最後の'shift_jis'shift_jisエンコーディングするよってこと。

codecs — codec レジストリと基底クラス

name == 'main'

次に2つ目。なんだこれ。

if __name__ == '__main__':

ここでも良さげなQiita記事がありました。簡潔でわかりやすいです。 [Python] if name == 'main' について理解しよう

つまりモジュール名を格納する__name__と直接実行されたモジュール名が格納される__main__が同じだった場合にif条件にあてはまりif文の中へ入る。ということは、直接実行された場合はif条件の中身は絶対実行されるということになる。

argparse.ArgumentParser

3つ目。

argparse.ArgumentParser(
        description=__doc__,
        formatter_class=argparse.RawDescriptionHelpFormatter)

これもPythonのドキュメントを読もう。

argparse — コマンドラインオプション、引数、サブコマンドのパーサー

descriptionは引数のヘルプの前に表示されるテキスト。 formatter_classでフォーマットのクラスを指定するらしい。

その他

APIについてのわからないコードは前述のチュートリアルやドキュメントを繰り返し読むことで理解を進めました。

Qiitaの手順を参考にやってみる

いよいよです。Qiita記事を参考にしてやってみます。

Google Cloud Shellで認証できない

原因は簡単でした。サービスアカウントキーをjsonでダウンロードするのですが、このときにプロジェクト名がつきます。 そしてそのときプロジェクト名に半角スペースを含んでいたのでshell上でexportしようとしたときに怒られました。 jsonファイルから半角スペース消して再度アップロード&exportで解決です。

pipでgoogle-cloud-speechをインストール忘れ

いざ、実行!とすると下記のエラーが発生しました。

Traceback (most recent call last):
  File "transcribe.py", line 43, in <module>
    transcribe_gcs(args.path)
  File "transcribe.py", line 11, in transcribe_gcs
    from google.cloud import speech
ImportError: cannot import name speech

pip listで確認するとやっぱりgoogle-cloud-speechにありませんでした。 pipでインストールします。

sudo pip install google-cloud-speech

google.api_core.exceptions.PermissionDenied

google.api_core.exceptions.PermissionDenied: 403 Cloud Speech API has not been used in project

権限がないと怒られている…?そしてよく見るとprojectが自分のものではない何かを参照しようとしていました。 もしかしてサービスアカウントキーの認証か環境変数への登録ができていなかったのではと思って 再度exportしなおすと大丈夫でした。

google.api_core.exceptions.InvalidArgument

google.api_core.exceptions.InvalidArgument: 400 sample_rate_hertz (16000) in RecognitionConfig must either be unspecified or match the value in the FLAC header (44100).

Audacityというフリーソフトを使用して書き出したのですが、その際にサンプリング周波数を16000にするのを忘れていました。 サンプリング周波数を16000にして再度書き出し&アップロードします。

google.api_core.exceptions.InvalidArgument(2回目)

google.api_core.exceptions.InvalidArgument: 400 Invalid audio channel count

連続の凡ミス。チャンネルがステレオになっていました。。 モノラルに変更して再度書き出しです。

結果

イヤホンマイクで録音して実際に変換させてみるとしっかりテキストに変換してくれました。 Qiita記事を見ながらでしたが自分でもできたことにとても感動しました。

実際に打ち合わせで録音してみたのですが、、、マイクが良くなかったのと雑音がひどかったので、しっかり変換できている部分とできていない部分がありました。録音用のマイクとあと変換前に録音ソフトで雑音を減らしたりだとか、そのあたりの処理をしっかりしてから再チャレンジしてみたいと思います。

ただ、Speech APIを使って音声⇒テキストの変換ができたので満足です。