語学のための文字起こし

GCloud編

去年末ごろから台湾中国語(台湾華語)を真面目に勉強するためにレッスンを受けています。オフラインのマンツーマンレッスンが中心ですが、オンラインのZoomレッスンも受けたことがあります。

オンライン・オフラインに関わらず、データは録音して保存していて、自分で聞き直して発声練習をしたり、文字起こしをして読み直すことで効率をなるべく高めようと努力しているのですが、今回はその「文字起こし」に関して最近自分がやっている方法について解説します。なお、オフラインレッスンにおいては、スマホやレコーダー等でなるべく高音質に録音したらいいだけなのですが、オンラインレッスンでの録音はなかなか簡単にはできず、一本記事にできるくらいの内容です。また後日記事にしたいと思っています。

さて、自分かこれまで行っていた文字起こしの方法は、聞きながらメモアプリに入力するだけのとても非効率なものでした。しかも、外国語なので聞き取れない単語や聞いたことがない言葉・表現が出てきます。それを耳だけでやるのは限界がありました。そこで、文字起こしのサービスを使って無駄な入力時間を短縮し、自分が知らない言葉を文字にできたら(漢字さえわかれば)簡単に理解できるのではないか?と考えました。

今回行うのは Google Cloud の Speech-to-Text (STT)を使った文字起こしです。STT はGoogleが良いした機械学習モデルを利用して文字起こしをしてくれます。ネットで調べてみると、日本語の記事を文字起こししてみた記事が多く出てきますが、英語はもちろん、台湾中国語でも文字起こしができます。ということで早速やってみます。

この記事はやり方の説明(備忘録)です。具体的に出力された文章は載せていません。

録音データの整形とフォーマット

まずは録音したデータをきれいにしなくてはなりません。いくつかのサポート形式がありますが、推奨されている形式で試します。

  • サンプリングレートを16,000Hzにする。
  • モノラル にする。
  • 音声ファイル形式を flac にエンコードする。

非可逆圧縮の mp3 で録音すると、変換時に劣化するので録音時点で wav か flac で撮るように設定するのがおすすめです。wav や mp3 で録音しても最終的には flac に変換します。

変換には Audacity を使っています。Audacity が読み込めないファイル形式の場合は、先に ffmpeg でエンコードしてから利用してます。この辺はまた別の記事でかけたら書きます。

  • 無音部分のトリミング
  • ノーマライズ
  • 前後の余計な部分のカット

これも文字起こしのために大切な処理となります。無音部分のトリミングは、利用料金を多少抑える役割を果たします。

Google Cloudの利用準備

利用方法として、Web 上の GCloud コンソールから行う方法もありますが、今回はローカルのターミナルから Python クライアントライブラリを使って実行するためのセットアップをします。

なお事前にpython3が実行できる環境を用意する必要があります。

利用準備に関しては、書いてもUIが更新されたりしてノイズになってしまいがちなので、公式のクイックスタートのURLを貼っておきます。手順は以下の通りです。

  1. Cloud Console プロジェクトを作成する。
  2. APIがデフォルトで全て無効になっているため、プロジェクトに対して Cloud Speech-to-Text API を有効にする。
  3. サービス アカウントを作成し(Cloud Storage の閲覧権限があれば良い)、JSON 形式の秘密鍵をダウンロードする。
  4. 環境変数 GOOGLE_APPLICATION_CREDENTIALS を、ダウンロードした JSON ファイルのパスに設定する。
  5. GCloud SDK をインストール。追加コンポーネントは不要。gcloudコマンドがどこでも使えるように PATH を通しておきます。

Speech-to-Text と Cloud Storage の利用準備

ライブラリを使うための準備をします。録音データのサイズが非常に大きい場合、ローカルからのデータを読み込ませるとAPIがエラーを返しますので、Cloud Storage(GCS)も準備します。

pip install --upgrade google-cloud-speech google-cloud-storage

スクリプトの準備

ドキュメントにあるサンプルコードは古いものが混ざっています。なのでGitHub上のpython3で動作するサンプルコードから、GCS のファイルも対応できるように改変しました。

コードは以下の通りです。ダウンロードして保存します。キモとしては、language_codeにzh-Hant-TWを設定することで繁体中国語(台湾)の設定になります。

料金

月ごとの請求で最初の1時間は無料です。それ以降はデフォルト設定の場合 $0.006/15 秒 です。拡張モデルとして通話に特化した学習モデルもあるのですが、料金がやや高くなります(利用したことはありませんが、今後試してみたいと思います)。

無料で試す場合は、支払いの設定をせずに試すことができ、無料の範囲を超えるとエラーが返ってきて処理ができなくなります。

実行方法

ローカルファイルの場合

まずはローカルファイルで試すのが簡単です。サイズオーバーのエラーが返ってきた場合は GCS を使ってみると良いです。

python speech_transcribe_async.py --file_path path/to/file.flac

これで、現在のファイルに.txtファイルが新しくできていると思います。感覚値ですが、40分の音声で10分程度の時間がかかります。

GCS の場合

GCS 上にバケットを作り、中にデータをアップロードします。バケットの設定はロケーションをアジアに、それ以外はデフォルトでOKです。

{{ blogcard “https://console.cloud.google.com/storage/create-bucket" }}

その後、バケット内に音声ファイルをD&Dでアップロードしたら準備完了。ターミナルで以下のコマンドを実行します。

python speech_transcribe_async.py --file_path gs://bucket名/file.flac

これで、ローカルファイルの時と同様に現在のファイルに.txtファイルが新しくできていると思います。

まとめ

準備がやや大変ですが、一度設定しちゃえば音声をエンコードしてスクリプトを実行して待つだけでできちゃいます。対話の被りや日本語があると翻訳されなかったり、がないので手動で補正してやる必要はありますが、初めて聞く単語が漢字で確認できたり、全体像が把握できるので非常に役立っています。

この方法はレッスンに限らず好きな動画の音声を入れて勉強に役立てるなど、様々な使い道がありそうです。

Software Engineer

issueを倒したいエンジニア。