Google Cloud Speech APIを使って音声ファイルを文字起こしする

Blog Single

気になる動画や音声があっても再生時間が長いと再生する気になれなかったり、再生したはいいものの想像していた内容とは大きく違ってガッカリしたことはないでしょうか?
音声データは文字と違ってパッと見で全体の内容を見渡せないため、どこでどういう内容の話をしているかなどの全体像を掴むのが大変だったりします。

そこで、今回はGoogle Cloud Speech APIという機械学習によって音声認識を行うAPIを利用して、音声データを文字起こしをしていきます。

公式のドキュメントは以下のリンクから
Cloud Speech-to-Text – 音声認識  |  Cloud Speech-to-Text API  |  Google Cloud

準備

Google Cloud Speech APIを利用するには
Google Cloud Platform (GCP)
への登録が必要です。

次に、プロジェクトに対してAPIを有効化します。

GCPから、APIを利用するプロジェクトを作成します。(既存のプロジェクトを利用する場合は、作成する必要はありません)

プロジェクト名は任意です。

そして、先ほど作成したプロジェクトを選択します。

「ナビゲーションバー」-> 「APIとサービス」->「ダッシュボード」から、APIの有効化を行います。

ダッシュボードの「APIとサービスの有効化」

cloud speech apiと検索して、「Cloud Speech API」を選択します。

APIについての説明のページが出てくるので、「有効にする」をクリックします。

料金は、現時点(2018/10/3)では、月あたり60分まで無料でその後は1分あたり0.024ドルかかります。

プロジェクトへの認証情報の追加

認証を行うために認証情報の設定を行います。

認証情報を作成をクリックします。

以下のように設定を行います。

すると、jsonファイルがダウンロードされるので大切に保管してください。

このjsonファイルは任意のディレクトリに配置していいですが、ここでは$HOME/Downloads/Project-XXXXXXXXX.jsonに配置しているとして、環境変数を以下のように設定します。

export GOOGLE_APPLICATION_CREDENTIALS="$HOME/Downloads/Project-XXXXXXXXX.json"

これでAPIを利用するための設定は完了です。

サンプル

今回は、Go言語を用いて、ローカルのファイルを文字起こしするプログラムを実行します。

ライブラリのインストール

go get -u cloud.google.com/go/speech/apiv1

サンプルプログラム

今回は以下のGoogleが用意しているサンプルプログラムから、少しだけ変更して言語の設定などを行います。

Go言語 speech_quickstart

今回はサンプルの音声ファイルとして、
話速バリエーション型音声データベース(SRV-DB)のATR25文の第一文を利用させていただきました。

// Sample speech-quickstart uses the Google Cloud Speech API to transcribe
// audio.
package main

import (
    "fmt"
    "io/ioutil"
    "log"

    // Imports the Google Cloud Speech API client package.
    "golang.org/x/net/context"

    speech "cloud.google.com/go/speech/apiv1"
    speechpb "google.golang.org/genproto/googleapis/cloud/speech/v1"
)

func main() {
    ctx := context.Background()

    // Creates a client.
    client, err := speech.NewClient(ctx)
    if err != nil {
        log.Fatalf("Failed to create client: %v", err)
    }

    // Sets the name of the audio file to transcribe.
    filename := "/Users/username/Downloads/ATR_AM00_0673_000.wav"

    // Reads the audio file into memory.
    data, err := ioutil.ReadFile(filename)
    if err != nil {
        log.Fatalf("Failed to read file: %v", err)
    }

    // Detects speech in the audio file.
    resp, err := client.Recognize(ctx, &speechpb.RecognizeRequest{
        Config: &speechpb.RecognitionConfig{
            Encoding: speechpb.RecognitionConfig_LINEAR16,
            SampleRateHertz: 44100,
            LanguageCode: "ja-JP",
        },
        Audio: &speechpb.RecognitionAudio{
            AudioSource: &speechpb.RecognitionAudio_Content{Content: data},
        },
    })
    if err != nil {
        log.Fatalf("failed to recognize: %v", err)
    }

    // Prints the results.
    for _, result := range resp.Results {
        for _, alt := range result.Alternatives {
            fmt.Printf("\"%v\" (confidence=%3f)\n", alt.Transcript, alt.Confidence)
        }
    }
}

変更した箇所は、文字起こしする音声ファイルを指定するfilenameと、今回利用するwaveファイルのサンプルレートを合わせるためにSampleRateHertzを44100、LanguageCodeを日本語に変更しました。

今回の音声の内容

あらゆる現実をすべて自分のほうへねじ曲げたのだ。

それでは先ほどのプログラムを実行します。

$ go run main.go
"あらゆる現実を全て自分の方へねじ曲げたのだ" (confidence=0.961493)

このように同じ文章が出力されました。
文章の後ろに表示されているconfidenceはテキストの信頼度で1に近いほど、一致している可能性が高いことが示されます。

1分以上のローカルに配置されている音声ファイルは、先ほどのプログラムでは実行できません。

1分を超える音声ファイルの場合はGoogle Cloud Storageに格納する必要がありますが、このやり方に関しては公式ドキュメントから参照してください。

感想

長い文章の音声ファイルを試したところ、思っていたより精度が良く、長いスピーチなどで概要を把握するのには向いていると思いますが、細かいところで何を言っているのかわからない箇所も当然ですが結構出てきました。

日本語と英語の文字起こしの精度を比較すると英語の方がかなり精度が高いように感じました。

Googleが用意しているサンプルのプログラムが充実しているので、GCPの設定さえできたらいろんなことが試せるのでぜひ使ってみてください。

参考

Cloud Speech-to-Text – 音声認識  |  Cloud Speech-to-Text API  |  Google Cloud

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

Posted by MatsumotoKazuki
PHPやJavaで開発を行っているエンジニア。 LOLというゲームの試合を観戦するのが好きです。

Other Posts: