Bing Speech APIで音声ファイルをテキスト化してChatworkに投稿してみました。

今回は、Microsoft の Bing Speech APIを利用させて頂いて、音声ファイルのテキスト化をやってみました。 近年、音声をテキスト化する手段は、いろいろ提供されていますが、今回のようにS3にドロップするだけでテキスト化する仕組みを用意しておけば、もしかすると何か利用場面があるかも知れません・・・あれば良いのですが(希望)
2018.04.04

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

1 はじめに

Bing Speech API は、Microsoft Cognitive Services のAPIの一つで、音声データをテキスト化してくれるAPIです。


https://azure.microsoft.com/ja-jp/services/cognitive-services/speech/

ドキュメント:Microsoft Speech API overview

今回は、このAPIを利用して、S3にポストされた音声データをテキスト化してChatworkに投稿するところまでをやってみました。

全体像は、以下のような感じです。

2 音声データの作成

今回、変換元の音声はデータは、AWS Pollyで作成しました。

3 APIキーの作成

Bing Speech APIを利用するためには、最初にリソースを作成してAPIキーを取得します。以下、その手順です。

  • Azureポータルのインテリジェンス・分析カテゴリにあるCognitive Servicesを開きます。

  • +追加 から Bing Speech API を選択します。

  • 名前をつけて作成します。価格レベルはとりあえずS0にしました。

  • 作成されたリソースを開いて、KeysからKEY1及びKEY2をコピーします。

4 認証トークン

Bing Speech APIの認証用のトークンは、API_KEYを使用して取得することができます。

$ curl -X POST "https://api.cognitive.microsoft.com/sts/v1.0/issueToken" -H "Content-type: application/x-www-form-urlencoded" -H "Content-Length: 0" -H "Ocp-Apim-Subscription-Key: API_KEY" > token


参考:Microsoft Speech API overview
参考:Quickstart for Bing Autosuggest API with Node.JS

5 ffmpeg

Bing Speech APIでテキスト化するには、音声ファイルの要件(ビットレート・サンプリングなど)を指定する必要があります。そこで、音声ファイルを一定の条件に揃えるためにffmpegを使用しました。

$ ffmpeg  -i Mizuki.mp3  -vn -ac 2 -ar 16000 -acodec pcm_s16le -f wav Mizuki.wav

6 変換

いよいよテキスト化です。取得したトークンをAuthorizationヘッダーで渡しています。また、languageで日本語を指定しています。

$ curl -v -X POST "https://speech.platform.bing.com/speech/recognition/interactive/cognitiveservices/v1?language=ja-JP&format=detailed" -H "Transfer-Encoding: chunked" -H "Authorization: Bearer `cat token`" -H "Content-type: audio/wav; codec=audio/pcm; samplerate=16000" --data-binary @Mizuki.wav

戻り値は、次のようになりました。Confidenceが一番高いものを利用すれば良い感じでしょうか。

{
    "Duration": 67200000, 
    "NBest": [
        {
            "Confidence": 0.923073053, 
            "Display": "こんにちはこれはamazon pollyで作成された音声ファイルです音声はみずきです", 
            "ITN": "こんにちはこれはamazon pollyで作成された音声ファイルです音声はみずきです", 
            "Lexical": "こんにちはこれは amazon polly で作成された音声ファイルです音声はみずきです", 
            "MaskedITN": "こんにちはこれはamazon pollyで作成された音声ファイルです音声はみずきです"
        }, 
        {
            "Confidence": 0.8951837, 
            "Display": "こんにちはこれはアマゾンポリーで作成された音声ファイルです音声はみずきです", 
            "ITN": "こんにちはこれはアマゾンポリーで作成された音声ファイルです音声はみずきです", 
            "Lexical": "こんにちはこれはアマゾンポリーで作成された音声ファイルです音声はみずきです", 
            "MaskedITN": "こんにちはこれはアマゾンポリーで作成された音声ファイルです音声はみずきです"
        }, 
        {
            "Confidence": 0.8951837, 
            "Display": "今日はこれはamazon pollyで作成された音声ファイルです音声はみずきです", 
            "ITN": "今日はこれはamazon pollyで作成された音声ファイルです音声はみずきです", 
            "Lexical": "今日はこれは amazon polly で作成された音声ファイルです音声はみずきです", 
            "MaskedITN": "今日はこれはamazon pollyで作成された音声ファイルです音声はみずきです"
        }, 
        {
            "Confidence": 0.8949905, 
            "Display": "こんにちはこれはアマゾンpolyで作成された音声ファイルです音声はみずきです", 
            "ITN": "こんにちはこれはアマゾンpolyで作成された音声ファイルです音声はみずきです", 
            "Lexical": "こんにちはこれはアマゾン poly で作成された音声ファイルです音声はみずきです", 
            "MaskedITN": "こんにちはこれはアマゾンpolyで作成された音声ファイルです音声はみずきです"
        }, 
        {
            "Confidence": 0.8949905, 
            "Display": "こんにちはこれはアマゾンplyで作成された音声ファイルです音声はみずきです", 
            "ITN": "こんにちはこれはアマゾンplyで作成された音声ファイルです音声はみずきです", 
            "Lexical": "こんにちはこれはアマゾン ply で作成された音声ファイルです音声はみずきです", 
            "MaskedITN": "こんにちはこれはアマゾンplyで作成された音声ファイルです音声はみずきです"
        }
    ], 
    "Offset": 600000, 
    "RecognitionStatus": "Success"
}

7 Lambda

最終的には、S3にオブジェクトがアップロードされたタイミングで動作するLambdaで上記の処理を行っています。

動作している様子です。

8 最後に

今回は、Microsoft の Bing Speech APIを利用させて頂いて、音声ファイルのテキスト化をやってみました。

近年、音声をテキスト化する手段は、いろいろ提供されていますが、今回のようにS3にドロップするだけでテキスト化する仕組みを用意しておけば、もしかすると何か利用場面があるかも知れません・・・あれば良いのですが(希望)