uni farm

gcloudコマンドでGoogle Speech APIを使って再生時間の長い音声の文字起こしを行う

gcloudコマンドでGoogle Speech APIを使って再生時間の長い音声の文字起こしを行う

Cloud Speech APIを使って1時間くらいの長さの音声ファイルを 文字起こししようとしたら色々要件があって大変だったので残しておく

環境

  • ubuntu: 16.04
  • Google Cloud SDK: 216.0.0

セットアップ

https://cloud.google.com/speech-to-text/docs/quickstart-gcloud?hl=ja#top_of_page の「始める前に」を参考に、apiの有効化、gcloudコマンドの設定をする

要件

1分以上の長さのファイルであれば、おそらく

  • gcs(google cloud storage)にファイルをアップロードしておく
  • 実行コマンドに--asyncフラグを追加(非同期リクエスト)

が必要になる

また、音声ファイルの長さは3時間以内であるなどいくつかの制約もある(参考)

1分以内の音声ファイルであれば--asyncフラグなし、ローカルのファイルパス指定でも行けるはず

実行コマンド

リクエスト

音声の言語は日本語、ファイル形式は.flac、サンプルレートは44100 Hzを指定している

gcloud ml speech recognize-long-running \
'gs://"bucket_name"/"filename"' \
--language-code='ja-JP' --sample-rate=44100 --encoding=flac

Check operation [OPERATION_ID] for status.
{
  "name": "OPERATION_ID"
}

OPERATION_IDとして数値列が返ってくるので、これを用いて結果取得等行う

結果取得

結果を取得する。正常に終了していれば何回でも結果を表示できる

進捗確認

operationの進捗を確認する。終了していれば結果が返ってくる

結果は長めの.json形式で返ってくるので、あらかじめ標準出力をファイル(output.json)に保存しておく

gcloud ml speech operations describe "OPERATION_ID" > output.json

終了していない場合はprogressPercentが返ってくる

cat output.json 
{
  "metadata": {
    "@type": "type.googleapis.com/google.cloud.speech.v1.LongRunningRecognizeMetadata",
    "lastUpdateTime": "2018-09-29T16:50:33.335585Z",
    "progressPercent": 38,
    "startTime": "2018-09-29T16:37:38.780895Z"
  },
  "name": "OPERATION_ID"
}

終了している場合はresults以下に結果が入る

cat output.json
{
  "done": true,
  "metadata": {
    "@type": "type.googleapis.com/google.cloud.speech.v1.LongRunningRecognizeMetadata",
    "lastUpdateTime": "2018-09-29T16:55:52.102150Z",
    "progressPercent": 100,
    "startTime": "2018-09-29T16:53:36.856374Z"
  },
  "name": "OPERATION_ID",
  "response": {
    "@type": "type.googleapis.com/google.cloud.speech.v1.LongRunningRecognizeResponse",
    "results": [
      {
        "alternatives": [
          {
            "confidence": 0.93601626,
            "transcript": "6\u670819\u65e5
...
結果が返るまで待つ(ポーリング(polling)形式)

operationの進捗は興味がなくて、とりあえず結果がほしいときはこっち

gcloud ml speech operations wait "OPERATION_ID"  > output.json
Waiting for operation ["OPERATION_ID"] to complete...⠶     

結果が返ってくるまで、実行中になる こちらの結果は、progressPercentの情報は返ってこない

cat output.json
{
  "@type": "type.googleapis.com/google.cloud.speech.v1.LongRunningRecognizeResponse",
  "results": [
    {
      "alternatives": [
        {
          "confidence": 0.93601626,
          "transcript": "6\u670819\u65e5
...

結果からテキスト部分を抽出する

返ってくる値はjson形式になっているので、テキスト部分を抜き出したい

https://konklone.io/json/ このサイトでjsonを変換するとconfidenceとtranscriptをいい感じにcsvへ変換された

ラジオを録音したものを試したが8割程度あっていた。あとは、文章単位で区切られていないので、どうにかして区切っておきたい

参考

2024, Built with Gatsby. This site uses Google Analytics.