[C#] Cognitive Servicesで日本語の音声認識(Bing Speech Recognition API・その2)

Cloud Application Engineerの内海です。

今回はMicrosoft AzureのCognitive Servicesの中から音声認識が可能なBing Speech Recognition APIを使ってみたいと思います。

“[C#] Cognitive Servicesで日本語の音声認識(その1)”では認証トークンの取得まで、

“[C#] Cognitive Servicesで日本語の音声認識(その2)”では取得したトークンを使用してAPIにアクセス、固定ファイルを送って実際に認識結果を確認したいと思います。


REST APIへアクセスするために必要なもの

前回取得したアクセストークン(有効期間:10分間)

REST APIに音声を送る時のリクエストヘッダーに仕込みます。


今回Text化を行うオーディオファイル

16bit 16kHz モノラル音声を送りたいと思います。


REST APIへのアクセス手順

認証トークンを用いたREST APIへアクセス方法

前回取得した認証トークンを用いて、

Text化したい音声ファイルをHTTPリクエストでPOSTしましょう。

上手くいけば日本語音声をText化した結果がjsonで返ってきます。

POST先アドレスは以下のものになります。

https://speech.platform.bing.com/recognize

今回は前回とは違い、POST先アドレスにパラメータを仕込みます。

Key Value
scenarios “websearch”か”ulm”
appid “D4D52672-91D7-4C74-8AD8-42B1D98141A5”
音声認識モードであることを示すためのIDなので固定です。
locale Text化したい言語(日本語音声なら”ja-JP”)
device.os 自分の使っている端末(例:”wp7″)
version “3.0”(今後変更される可能性あり)
instanceid APIにアクセスする端末の一意のGUID(自由)
requestid アクセス毎の一意のGUID(アクセス毎にジェネレートするのが基本)

リクエストヘッダーは以下を設定しておきましょう。

Key Value
Host “speech.platform.bing.com”
Content-Type “audio/wav; samplerate=16000”
(今回はサンプリングレート16kHzのwavファイルを送るため)
詳しくは公式リファレンスを読みましょう!
Authorization “Bearer [Base64 access_token]”(前回取得したトークン)

また、リクエストボディには音声の入ったオーディオデータをByte配列として書き込みましょう。
音声ファイルのbyte配列化はVisualStudioならこんな感じ

var fs = new FileStream(/*ファイルパス*/, FileMode.Open, FileAccess.Read);
var bs = new byte[fs.Length];
fs.Read(bs, 0, bs.Length);
fs.Close();

レスポンス

リクエストヘッダーとボディに間違いがなければ以下のようなjsonが返ってくるはずです!
この中の”lexical”にText化された文字列が入っています。

{
    "version":"3.0", //リクエスト時に設定したバージョン
    "header":{
    "status":"success", //成功かどうか
    "scenario":"websearch", //リクエスト時に設定したシナリオ
    "name":"",
    "lexical":"",
    "properties":{
        "requestid":/*リクエスト時に設定した一意のID*/
    },
    "results":[{
        "name":"",
        "lexical":/*音声認識結果*/,
        "confidence":/*精度のスコア*/,
        "tokens":[{
            "token":"",
            "lexical":"",
            "pronunciation":"",
        },
        {
            "token":"",
            "lexical":"",
            "pronunciation":"",
        }],
        "properties":{
            "HIGHCONF":"1"
        },
    }],
    }
}

サンプルコード

サンプルコードを載せておきます。
オーディオファイルをPOSTして取得出来たTextを表示させるサンプルです。

using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.IO;
using System.Net;
using System.Text;

namespace BingSpeechRecognition
{
    class Program
    {
        public class AccessTokenInfo
        {
            public string access_token { get; set; }
            public string token_type { get; set; }
            public string expires_in { get; set; }
            public string scope { get; set; }
        }
        public class Properties
        {
            public string requestid { get; set; }
            public string HIGHCONF { get; set; }
        }
        public class Header
        {
            public string status { get; set; }
            public string scenario { get; set; }
            public string name { get; set; }
            public string lexical { get; set; }
            public Properties properties { get; set; }
        }
        public class Properties2
        {
            public string HIGHCONF { get; set; }
        }
        public class Result
        {
            public string scenario { get; set; }
            public string name { get; set; }
            public string lexical { get; set; }
            public string confidence { get; set; }
            public Properties2 properties { get; set; }
        }
        public class RecognitionResultJson
        {
            public string version { get; set; }
            public Header header { get; set; }
            public List<Result> results { get; set; }
        }
        static string GetAccessToken()
        {
            //取得したアクセスKeyを入力しましょう!
            const string clientId = "";
            const string clientSecret = "";
            var request = (HttpWebRequest)WebRequest.Create(@"https://oxford-speech.cloudapp.net/token/issueToken");
            //リクエストメソッド設定
            request.Method = "POST";
            //リクエストヘッダー設定
            request.ContentType = "application/x-www-form-urlencoded";
            //リクエストボディ設定
            var str = string.Format("grant_type=client_credentials&client_id={0}&client_secret={1}&scope={2}",
                clientId,
                clientSecret,
                "https://speech.platform.bing.com");
            using (var outputStream = new StreamWriter(request.GetRequestStream()))
            {
                outputStream.Write(str);
            }
            var response = request.GetResponse();
            var responseStream = response.GetResponseStream();
            if (responseStream == null)
            {
                throw new Exception();
            }
            //受け取ったJsonをデシリアライズし、トークンのみ返す
            using (var sr = new StreamReader(responseStream))
            {
                return JsonConvert.DeserializeObject<AccessTokenInfo>(sr.ReadToEnd()).access_token;
            }
        }
        static void AccessBingSpeechRecognition(string token, string filename)
        {
            using (var fs = new FileStream(filename, FileMode.Open, FileAccess.Read))
            {
                var bs = new byte[fs.Length];
                fs.Read(bs, 0, bs.Length);
            }
            var postAddress = @"https://speech.platform.bing.com/recognize";
            postAddress += @"?scenarios=websearch";
            postAddress += @"&appid=D4D52672-91D7-4C74-8AD8-42B1D98141A5";
            postAddress += @"&locale=ja-JP";
            postAddress += @"&device.os=wp7";
            postAddress += @"&version=3.0";
            postAddress += @"&format=json";
            /*デバイスごとの一意のIDを使用する*/
            postAddress += @"&instanceid=" + "";
            postAddress += @"&requestid=" + Guid.NewGuid().ToString();
            
            var request = (HttpWebRequest)WebRequest.Create(postAddress);
            request.Method = "POST";
            request.Host = @"speech.platform.bing.com";
            request.ContentType = @"audio/wav; samplerate=16000";
            request.Headers["Authorization"] = "Bearer " + token;
            using (var writer = request.GetRequestStream())
            {
                writer.Write(bs, 0, bs.Length);
            }
            var webResponse = request.GetResponse();
            var responseStream = response.GetResponseStream();
            if (responseStream == null)
            {
                throw new Exception();
            }
            using (var sr = new StreamReader(responseStream))
            {
                return JsonConvert.DeserializeObject<RecognitionResultJson>(sr.ReadToEnd()).results[0].name;
            }
        }
        static void Main(string[] args)
        {
            /*音声認識させたいオーディオファイルのパスを入力*/
            AccessBingSpeechRecognition(GetAccessToken(), "file path");
            Console.WriteLine("finish");
            Console.ReadLine();
        }
    }
}

One thought on “[C#] Cognitive Servicesで日本語の音声認識(Bing Speech Recognition API・その2)

コメントは停止中です。