Macで音声認識をしてみた。
音声ファイル(wav)を文字列として認識させる。
Google Speech API
音声認識には、Speech APIを利用する。
リンク先で試せるが、音声を認識して文字列に変換してくれる。Chromeの音声検索とかに利用されてるやつだと思う。
日本のgoogleアカウントだと、デフォルトの状態ではAPIを利用でいないようなので、Chromium Projects?にメンバー登録しておく。そうすると、Google Developers Consoleで、Speech APIが利用できるようなるので、API keyなどを取得をしておく。詳しくは以下。
http://www.chromium.org/developers/how-tos/api-keys
ちなみに、リクエストの上限が50回/日 だし、ちゃんとしたドキュメントが(おそらく)無いし、あまり使いやすい感じではない。。。
音声ファイルを用意
自分の声を録音するために、少しだけ準備。HomebrewでSoXをインストール。
$ brew install sox
これで、recコマンドで録音ができるようになる。コマンドの使い方などのドキュメントはこちら。
$ rec --encoding signed-integer --bits 16 --channels 1 --rate 16000 test.wav
上記を実行すると録音開始されるので、「テスト」とでも言って保存。
Rubyで認識用のコードを書く
あとは、Speech APIに音声ファイルを認識させる。
https://www.google.com/speech-api/v2/recognize
に対して、POSTでリクエストを送信すると、音声を認識した結果がレスポンスで帰ってくる。
以下が書いたコード。
require 'net/http'
require 'JSON'
uri = URI('https://www.google.com/speech-api/v2/recognize' \
'?output=json&lang=ja&key=AIzaSyAD_5b6--4Jz0CXD5_sRoPa9ZjgJsYNK-M')
https = Net::HTTP.new(uri.hostname, uri.port)
https.use_ssl = true
res = https.start do |h|
req = Net::HTTP::Post.new(uri)
req.body = File.read(ARGV[0])
req.content_type = "audio/l16; rate=16000"
req['User-Agent'] = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2062.94 Safari/537.36"
h.request(req)
end
p res
result_data = res.body.force_encoding('UTF-8')
result_data.split("\n").each do |data|
p JSON.parse data
end
出力形式(output)やAPI key(key)をパラメータとして指定し、APIのURLにPOSTでリクエスト。headerやbodyにも情報を入れている。
スクリプトを実行。
$ ruby voice_recognition.rb test.wav
#<Net::HTTPOK 200 OK readbody=true>
{"result"=>[]}
{"result"=>[{"alternative"=>[{"transcript"=>"テスト", "confidence"=>0.46040118}, {"transcript"=>"test"}, {"transcript"=>"てすと"}, {"transcript"=>"チェスト"}], "final"=>true}], "result_index"=>0}
ちゃんと認識している!!さすが優秀。
transcriptと一緒に入っているconfidenceというキーの値は、解析結果の信頼度のようなものだろうか。
おわり
APIに関する情報がちょっと少なくて分からないことが多いのだが、以上が軽く触ってみた結果です。