GoogleのSpeech to Textで音声をニューラルネットワークを使ってテキスト化してみた
Contents
音声をテキスト化
2020年5月にGoogleよりML Study Jams Vol.4 : Machine Learning トレーニングプログラムの無料提供の発表があった件は、以前の記事に書いた。
この時に音声ファイルをGoogleのSpeech to TextのAPIを使ってテキスト化するハンズオン(体験学習)を行ったのだが、その際はGoogleのハンズオンということもあり英語の音声のテキスト化だった。
その時は試せなかったのだが日本語にも対応しているとの事なので試してみることにした。
初めに
どの音声を使うのかを迷ったのだが勝手に他人の音声を変換するのは著作権もあるので問題がありそう。
結局自分の音声で自分の過去のブログの文書を読み上げることにした。
素人があえて練習無しで読み上げて「滑舌の悪さ」「聞き取りやすい発音」「かんだり言いよどむ」など悪条件をどの程度クリアできるのかを試してみたい。
手順
主な手順は以下の通り。
- 音声ファイル(mp3)を用意する
- mp3をflacのモノラルに変換する
- GCP(Google Clond Platform)でプロジェクトを作成する
- API認証情報を作成する
- VMインスタンスを作成する
- Cloud Storageに音声ファイルをアップロードして必要な権限を与える
- Speech To Text APIサービスを有効化する
- Speech APIを呼び出す
- 終了したらインスタンスを停止する
概要図
音声ファイル(mp3)を用意する
まずは過去の自分のブログの文書をあえて練習無しで読み上げてmp3ファイルに保存した。
読み上げた文章は「レゴ・マインドストームに7年ぶりの新作(ロボットキット)」の記事。
冒頭の、
レゴ・マインドストームに7年ぶりの新ロボットキットが発売されるとの記事を見た。自分は教育用レゴマインドストームEV3の基本セットと拡張セットを持っているのだけれども、マインドストームで新作はもうでないのかと諦めていたので新作がでると聞いてとても嬉しい!
以下気になった、というか興味深い点。
プログラミング環境
PythonやScratchベースのドラッグアンドドロップでのコーディングが可能でWindowsやmac、Androidタブレット、スマートフォンにも対応するとの事だが、今までのレゴマインドストームソフトウェアは使えないのかも知れない。
を読み上げている。
Googleの機械学習には文章や単語の感情分析APIもあるので、「嬉しい」などの感情表現が入っている文章を選んでいる。
尚、感情分析については別記事とする。
録音はフリーの音声編集ソフトのAudacityを使用してmp3形式で出力&保存した。
尚、APIには長さが1分以内という制限があるので長時間の音声ファイルを一気にテキストに変換する様な使い方には向かない。
mp3をflacのモノラルに変換する
Speech to TextのAPIが対応しているのがflac形式の音声ファイルなのでmp3からflac形式に変換する。
変換はこちらのサイトを利用させてもらった。
というのも音声ファイルはAPIの仕様上モノラルである必要があり、こちらのサイトではチャネル数を1(モノラル)に設定して変換する事が出来るからである。
GCPでプロジェクトを作成する
ファイルの準備が出来たらGCP(Google Cloud Platform)にログインをして(Googleアカウントが必要)コンソールに移動する。
左上の”プロジェクト欄”をクリックするとプロジェクトの選択画面が開くので”新しいプロジェクト”をクリックする。
プロジェクト名:Natural-Language
プロジェクトIDは自動で発番されるが変更したい場合は”編集”をクリックして変更する。
「作成」ボタンをクリックする。
API認証情報を作成する
プロジェクトが作成されたら画面左上で作成したプロジェクトが選択されている事を確認して”APIとサービス”ー>”認証情報”をクリックする。
”+認証情報を作成”ー>”APIキー”をクリックする。
”APIキーを作成しました”のメッセージが表示されるので”自分のAPIキー”欄の文字列を控える。
※この後のSpeech to TextのAPIを使う時に必要になる。
VMインスタンスを作成する
次にGCP上にAPIを処理する為の仮想サーバー、VMインスタンスを作成する。
左のメニューから”Compute Engine”ー>VMインスタンスをクリックする。
”インスタンスを作成”をクリックする。
- 名前: natural-language-instance-1(任意の名前)
- ラベル:未入力
- リージョン:東京リージョン
- ゾーン:asia-northeeast1-b(どこのゾーンでもOK)
- シリーズ:N1
- マシンタイプ:n1-standard-1(1CPU、3.75GBメモリ)※
※とりあえずロースペックのインスタンスで大丈夫
”HTTPトラフィックを許可する”にチェックを入れて「作成」ボタンをクリックする。
VMインスタンスが作成される。
尚、この瞬間から課金が発生する。
金額の目安は作成画面でも表示されていたが東京リージョンで0.043ドル/1時間。
立ち上げ直後は1分単位、1分を超えると1秒単位で課金されるのだが、今回1時間程インスタンスを稼働させたので6円の請求だった。
インスタンスを選択して”停止”をクリックしてインスタンスを停止させれば課金は止まる(後述)
ファイルをアップロード
次に先程作成した音声ファイル(flac形式)をGCPにアップロードする。
左側のメニューから”Storage”ー>”ブラウザ”をクリックする。
尚、後でまたこの画面に戻ってくるので新しいタブで開く事をオススメする。
バケットの作成
最初にバケットを作成する。
バケットはWindowsで言うところのドライブ(CやDドライブなど)の様なものと理解した。
バケットの下にディレクトリやファイルが作成できる。
”バケットを作成”をクリックする。
- バケット名:speech20200620(グローバルでユニークな名前である必要がある)
- ロケーションタイプ:Multi-region
- ロケーション:US※
※VMインスタンスと同じリージョンである必要は無い。もちろん東京リージョンを選択してもOK
下にスクロールして、ストレージクラス、オブジェクトのアクセス制御、詳細設定はそのままで「作成」ボタンをクリックする。
ファイルのアップロード
バケットが作成されたので「ファイルをアップロード」をクリックしてダイアログボックスから該当ファイルを選択する。
LEGO-MINDSTORMS.flacというファイルをアップロードした。
権限の設定
VMインスタンスからこのファイルを参照できるようにアクセス権の設定を行う。
ファイルの右端の3点のメニューから”権限を編集”をクリックする。
既に付与されている権限一覧が表示されるので、「+項目を追加」ボタンをクリックする。
- エンティティ:ユーザー
- 名前:allUsers
- アクセス権:読み取り
を設定して「保存」ボタンをクリックする。
権限が追加されたがallUsersなので”インターネットに公開されている”との警告表示がでている。
そもそもこのブログの最初の方で音声ファイルを公開しているので問題は無いのだがセキュアなファイルであればきちんと権限を付与する必要があるので注意が必要だ。
APIサービスを有効化する
このプロジェクトで音声からテキストに変換するAPI(Speech to Text API)を使用できるようにする。
左側のメニューから”APIとサービス”ー>”ライブラリ”をクリックする。
検索欄で”speech to Text API”を検索する。
”sppech”と入力した所で一番先頭にCloud Speech-to-Text APIが表示されるので選択する。
Cloud Speech-to-Text APIで「有効にする」ボタンをクリックする。
APIが有効化された。
Speech APIを呼び出す
ようやく前準備は終了したのでAPIを呼び出すことにする。
sshの起動
Compute EngineのVMインスタンスの画面に戻って該当インスタンスのSSH横の三角をクリックして”ブラウザウィンドウで開く”をクリックする。
APIキーの設定
しばらく待つと新しいsshウィンドウが開く。
”API認証情報を作成する”で控えておいたAPIキーを使うのだがAPIを呼び出すたびに何回も入力するのは面倒なので下記のコマンドで環境変数に保存しておく。
export API_KEY=控えておいたAPI KEY
requestファイルの作成
nano、vi等のテキストエディターでAPIリクエスト用のファイルを作成する。
nano request.json
{
"config": {
"encoding":"FLAC",
"languageCode": "ja-JP"
},
"audio": {
"uri":"gs://speech20200620/LEGO-MINDSTORMS.flac"
}
}
uriにはGoogleストレージのバケット、ファイル名を指定する。
nanoはCtrl+xの後、yで保存して終了する。
APIを呼び出す
作成したrequest.jsonファイルを引数としてSpeech-to-Text APIを呼び出す。
curl -s -X POST -H "Content-Type: application/json" --data-binary @request.json \
"https://speech.googleapis.com/v1/speech:recognize?key=${API_KEY}"
結果
APIの出力結果は以下の通り。
{
"results": [
{
"alternatives": [
{
"transcript": "レゴマインドストームに1年ぶりの新ロボットキットが発売されるとの記事を見た自分は教育用レゴマインドストーム EV 3の基本セットと拡張セットを持っているのだけれどもマインドストームで新作はもう出ないのかと諦めていたので新作が出ると聞いてとても嬉しい以下気になったと言うか興味深い点プログラミング環境依存やスクラッチベースのドラッグ&ドロップでのコーディングが可能で Windows や Mac Android タブレットスマートフォンにも対応するとのことだが今までのレゴマインドストームソフトウェアは使えないのかもしれない",
"confidence": 0.93927604
}
]
}
]
}
transcriptにテキストに変換された結果が入っている。
レゴ・マインドストームに7年ぶりの新ロボットキットが発売されるとの記事を見た。自分は教育用レゴマインドストームEV3の基本セットと拡張セットを持っているのだけれども、マインドストームで新作はもうでないのかと諦めていたので新作がでると聞いてとても嬉しい!
以下気になった、というか興味深い点。
プログラミング環境
PythonやScratchベースのドラッグアンドドロップでのコーディングが可能でWindowsやmac、Androidタブレット、スマートフォンにも対応するとの事だが、今までのレゴマインドストームソフトウェアは使えないのかも知れない。
7年→1年と間違っているのが、改めて自分の音声を聞き直したのだが、人間でも聞き間違えるレベルの酷い滑舌なのでこれは仕方が無い。
あとPython→依存と間違っているがこれは聞き取って欲しかった。
それ以外は完璧なテキスト化!
また句読点は入らないのは仕様通りである。
Windowsやmacなどの日本人のネイティブでない英語の発音でもきちんと英語のテキストに変換してくれるているのには驚いた。
タブレットやマインドストームなどは英語では無くカタカナに変換しているが何らかのルールがあるのだと思う。
confidenceはAPIがどのくらいの精度で音声を文字変換できたと思うかを示している。
つまり93.92%の自信があったという事。
発声の専門家(アナウンサーや歌手)の音声であればもう少し高い数値が出るのかも知れない。
インスタンスを停止
終了したらインスタンスを停止する。
sshのウィンドウを閉じたら、該当のVMインスタンスを選択して「停止」ボタンをクリックする。
確認メッセージが表示されるので「停止」ボタンをクリックする。
終わりに
以上でSpeech-to-Text APIは終了。
次は変換したテキストのAIによる感情分析をやってみる予定。
この記事が何処かで誰かの役に立つことを願っている。
尚、当記事中の商品へのリンクはAmazonアソシエイトへのリンクが含まれています。Amazonのアソシエイトとして、当メディアは適格販売により収入を得ていますのでご了承ください。
1件の返信
[…] Google Cloud Speech-to-Text を利用して「長時間」の音声ファイルをテキスト化したいと考えております。Cloud Speech-to-Texthttps://cloud.google.com/speech-to-text/docs/how-to?hl=ja以下を参考に1分未満のファイルのテキスト化に成功しておりますが、1分以上のファイルには longrunningrecognize を非同期で実行する必要があるとのことで、いろいろと調べながら試してみたものの上手く進まないため必要なご支援をお願いしたいものです。https://www.souichi.club/deep-learning/speech-to-text/実施したいことは以下のとおりです。上記を理解する程度の知見しかないことはご承知おきください。 ・必要なスクリプトの作成 ・GoogleCloudの設定方法(Storageの設定含む) (対処できれば格式ばったものは不要です。スクリーンショットなどで十分です。) ・300MBの70分程度のFLACファイルを対象 ・アップロードしたファイルは一般公開(関係者以外閲覧不可)しない設定 ・サンプリングレート、音声文字変換モデルの選択、自動句読点入力の設定 (スクリプトを書き換える等で済むのであればその方法で構いません。) ・テキスト化したデータはStorageに.txtにて保存なお、Pythonによる長時間の音声ファイルのテキスト化について述べた記事があります。Python環境やスクリプトの作成が分からないところがあり試すことはできませんでした。https://qiita.com/r-wakatsuki/items/d867bfb80afc24d96de5( 上記の実施したいことが達成できれば良いので Python不可というわけではありません。) 個人利用のため 予算が僅少な可能性もあり、あまりにも少ないようであれば追加のうえ相談させてください。 どうぞ宜しくお願い致します。追伸: 本件の後に、別件別費用(当然ながら)にて、 Google Cloud Speech-to-Text を利用して、 リアルタイムで流れてくる音声のテキスト化(Googleドキュメントの音声入力の様な)をお願いするかもしれません。 アップロード不可の音声ファイルがありまして、これを寝ている間に流してテキスト化できればなと思っております。 Googleドキュメントの音声入力 ですと途中止まる可能性があり、連続再生ですとファイルの区切りが分からないため、 例えば、再生時間を一定時間ごとにテキストに付記するような手当をお願いするかもしれません。 本件が流用できるようであれば、これを前提に対応いただけると助かります。 […]