Twilio Speech RecognitionのpartialResultCallbackオプション

Twilioの新機能Speech Recogniton(音声認識)は、従来のTwiMLの<Gather>の拡張として実装されています。

<Gahter>はDTMFを認識する機能で、終了のキーの押下またはタイムアウトのタイミングで押されたキーの情報を取得することができます。

Speech Recognitionの場合も同様にタイムアウトのタイミングで、音声認識されて生成された文字列を取得できます。このような仕様なので、音声をリアルタイムに認識しつつ何かをやるようなアプリケーションを作るのは難しそうです。

しかし、ドキュメントによるとSpeech Recognitionをする場合の<Gather>のオプション・パラメータにpartialResultCallbackというのがあり、ここで指定したURLにTwilioはリアルタイムに部分的な音声認識の結果を送信するとのこと。

この機能を使うことにより、リアルタイムに処理を行うアプリケーションを作ることができないかと思い、partialResultCallback指定先にどのように情報が送られるのか試してみました。

送られる情報

  • SequenceNumber … シーケンス番号(五月雨式に送信されて順番が入れ替わって届くことがあるため)
  • Stability … 試した範囲では0.01か0.9のいずれかでした。
  • UnstableSpeechResult
  • StableSpeechResult … 試した範囲では常に空だったので、出力しませんでした。

動画

partialResultCallback指定先では上記情報をファイルに追記するようにし、tail -f の出力を画面に表示しています。

タイムアウト後、actionで指定したURLに送信される認識結果SpeechResultを最後にファイルに追記しています。 

出力結果

ファイルに出力された内容です。

Sequence Number = 3
Stability = 0.01
UnstableSpeechResult = '昔々'

Sequence Number = 2
Stability = 0.01
UnstableSpeechResult = '昔の'

Sequence Number = 1
Stability = 0.01
UnstableSpeechResult = '昔'

Sequence Number = 6
Stability = 0.01
UnstableSpeechResult = '昔々あると'

Sequence Number = 5
Stability = 0.01
UnstableSpeechResult = '昔々ある'

Sequence Number = 4
Stability = 0.01
UnstableSpeechResult = 'むかしむかし'

Sequence Number = 0
Stability = 0.01
UnstableSpeechResult = '床'

Sequence Number = 7
Stability = 0.01
UnstableSpeechResult = '昔々あるとこ'

Sequence Number = 9
Stability = 0.01
UnstableSpeechResult = '昔々あるところに'

Sequence Number = 11
Stability = 0.01
UnstableSpeechResult = '昔々あるところにおじい'

Sequence Number = 10
Stability = 0.01
UnstableSpeechResult = '昔々あるところにお'

Sequence Number = 12
Stability = 0.01
UnstableSpeechResult = '昔々あるところにおじいさ'

Sequence Number = 14
Stability = 0.01
UnstableSpeechResult = '昔々あるところにお爺さんと'

Sequence Number = 8
Stability = 0.01
UnstableSpeechResult = '昔々あるところ'

Sequence Number = 16
Stability = 0.01
UnstableSpeechResult = '昔々あるところにお爺さんとお婆さん'

Sequence Number = 19
Stability = 0.01
UnstableSpeechResult = '昔々あるところにお爺さんとお婆さんが住んで'

Sequence Number = 13
Stability = 0.01
UnstableSpeechResult = '昔々あるところにお爺さん'

Sequence Number = 17
Stability = 0.01
UnstableSpeechResult = '昔々あるところにお爺さんとお婆さんが'

Sequence Number = 18
Stability = 0.01
UnstableSpeechResult = '昔々あるところにお爺さんとお婆さんが住ん'

Sequence Number = 15
Stability = 0.01
UnstableSpeechResult = '昔々あるところにお爺さんとお婆'

Sequence Number = 22
Stability = 0.01
UnstableSpeechResult = '昔々あるところにお爺さんとお婆さんが住んでいました'

Sequence Number = 21
Stability = 0.01
UnstableSpeechResult = '昔々あるところにお爺さんとお婆さんが住んでいまし'

Sequence Number = 20
Stability = 0.01
UnstableSpeechResult = '昔々あるところにお爺さんとお婆さんが住んで今'

Sequence Number = 23
Stability = 0.9
UnstableSpeechResult = '昔々あるところにお爺さんとお婆さんが住んでいました'

Sequence Number = 24
Stability = 0.01
UnstableSpeechResult = '昔々あるところにお爺さんとお婆さんが住んでいましたおじい'

Sequence Number = 29
Stability = 0.01
UnstableSpeechResult = '昔々あるところにお爺さんとお婆さんが住んでいましたお爺さんは山'

Sequence Number = 27
Stability = 0.01
UnstableSpeechResult = '昔々あるところにお爺さんとお婆さんが住んでいましたおじいさんは'

Sequence Number = 26
Stability = 0.01
UnstableSpeechResult = '昔々あるところにお爺さんとお婆さんが住んでいましたおじいさん'

Sequence Number = 25
Stability = 0.01
UnstableSpeechResult = '昔々あるところにお爺さんとお婆さんが住んでいましたおじいさ'

Sequence Number = 30
Stability = 0.01
UnstableSpeechResult = '昔々あるところにお爺さんとお婆さんが住んでいましたお爺さんは山へ'

Sequence Number = 28
Stability = 0.01
UnstableSpeechResult = '昔々あるところにお爺さんとお婆さんが住んでいましたおじいさんぱ家'

Sequence Number = 31
Stability = 0.01
UnstableSpeechResult = '昔々あるところにお爺さんとお婆さんが住んでいましたお爺さんは山へし'

Sequence Number = 33
Stability = 0.01
UnstableSpeechResult = '昔々あるところにお爺さんとお婆さんが住んでいましたお爺さんは山へ芝刈り'

Sequence Number = 32
Stability = 0.01
UnstableSpeechResult = '昔々あるところにお爺さんとお婆さんが住んでいましたお爺さんは山へしば'

Sequence Number = 34
Stability = 0.01
UnstableSpeechResult = '昔々あるところにお爺さんとお婆さんが住んでいましたお爺さんは山へ芝刈りに'

Sequence Number = 35
Stability = 0.01
UnstableSpeechResult = '昔々あるところにお爺さんとお婆さんが住んでいましたお爺さんは山へ芝刈りにお'

Sequence Number = 37
Stability = 0.01
UnstableSpeechResult = '昔々あるところにお爺さんとお婆さんが住んでいましたお爺さんは山へ芝刈りにおばあ'

Sequence Number = 38
Stability = 0.01
UnstableSpeechResult = '昔々あるところにお爺さんとお婆さんが住んでいましたお爺さんは山へ芝刈りにお婆さん'

Sequence Number = 39
Stability = 0.01
UnstableSpeechResult = '昔々あるところにお爺さんとお婆さんが住んでいましたお爺さんは山へ芝刈りにおばあさんは'

Sequence Number = 41
Stability = 0.01
UnstableSpeechResult = '昔々あるところにお爺さんとお婆さんが住んでいましたお爺さんは山へ芝刈りにおばあさんは川'

Sequence Number = 36
Stability = 0.01
UnstableSpeechResult = '昔々あるところにお爺さんとお婆さんが住んでいましたお爺さんは山へ芝刈りに'

Sequence Number = 43
Stability = 0.01
UnstableSpeechResult = '昔々あるところにお爺さんとお婆さんが住んでいましたお爺さんは山へ芝刈りにおばあさんは川伊勢'

Sequence Number = 42
Stability = 0.01
UnstableSpeechResult = '昔々あるところにお爺さんとお婆さんが住んでいましたお爺さんは山へ芝刈りにおばあさんは川へ'

Sequence Number = 44
Stability = 0.01
UnstableSpeechResult = '昔々あるところにお爺さんとお婆さんが住んでいましたお爺さんは山へ芝刈りにおばあさんは川へ洗濯'

Sequence Number = 40
Stability = 0.01
UnstableSpeechResult = '昔々あるところにお爺さんとお婆さんが住んでいましたお爺さんは山へ芝刈りにおばあさんは彼'

Sequence Number = 49
Stability = 0.01
UnstableSpeechResult = '昔々あるところにお爺さんとお婆さんが住んでいましたお爺さんは山へ芝刈りにおばあさんは川へ洗濯に行きました'

Sequence Number = 48
Stability = 0.01
UnstableSpeechResult = '昔々あるところにお爺さんとお婆さんが住んでいましたお爺さんは山へ芝刈りにおばあさんは川へ洗濯に行きまし'

Sequence Number = 47
Stability = 0.01
UnstableSpeechResult = '昔々あるところにお爺さんとお婆さんが住んでいましたお爺さんは山へ芝刈りにおばあさんは川へ洗濯に行きま'

Sequence Number = 46
Stability = 0.01
UnstableSpeechResult = '昔々あるところにお爺さんとお婆さんが住んでいましたお爺さんは山へ芝刈りにおばあさんは川へ洗濯に行き'

Sequence Number = 45
Stability = 0.01
UnstableSpeechResult = '昔々あるところにお爺さんとお婆さんが住んでいましたお爺さんは山へ芝刈りにおばあさんは川へ洗濯に'

Sequence Number = 50
Stability = 0.9
UnstableSpeechResult = '昔々あるところにお爺さんとお婆さんが住んでいましたお爺さんは山へ芝刈りにおばあさんは川へ洗濯に行きました'

Sequence Number = 52
Stability = 0.01
UnstableSpeechResult = '昔々あるところにお爺さんとお婆さんが住んでいましたお爺さんは山へ芝刈りにおばあさんは川へ洗濯に行きましたおばさん'

Sequence Number = 53
Stability = 0.01
UnstableSpeechResult = '昔々あるところにお爺さんとお婆さんが住んでいましたお爺さんは山へ芝刈りにおばあさんは川へ洗濯に行きましたおばさんが'

Sequence Number = 51
Stability = 0.01
UnstableSpeechResult = '昔々あるところにお爺さんとお婆さんが住んでいましたお爺さんは山へ芝刈りにおばあさんは川へ洗濯に行きました小正'

Sequence Number = 58
Stability = 0.01
UnstableSpeechResult = '昔々あるところにお爺さんとお婆さんが住んでいましたお爺さんは山へ芝刈りにおばあさんは川へ洗濯に行きましたおばあさんが川で'

Sequence Number = 55
Stability = 0.01
UnstableSpeechResult = '昔々あるところにお爺さんとお婆さんが住んでいましたお爺さんは山へ芝刈りにおばあさんは川へ洗濯に行きましたおばさんの顔'

Sequence Number = 59
Stability = 0.01
UnstableSpeechResult = '昔々あるところにお爺さんとお婆さんが住んでいましたお爺さんは山へ芝刈りにおばあさんは川へ洗濯に行きましたおばあさんが川です'

Sequence Number = 54
Stability = 0.01
UnstableSpeechResult = '昔々あるところにお爺さんとお婆さんが住んでいましたお爺さんは山へ芝刈りにおばあさんは川へ洗濯に行きましたおばさんなか'

Sequence Number = 61
Stability = 0.01
UnstableSpeechResult = '昔々あるところにお爺さんとお婆さんが住んでいましたお爺さんは山へ芝刈りにおばあさんは川へ洗濯に行きましたおばあさんが川で洗濯'

Sequence Number = 60
Stability = 0.01
UnstableSpeechResult = '昔々あるところにお爺さんとお婆さんが住んでいましたお爺さんは山へ芝刈りにおばあさんは川へ洗濯に行きましたおばあさんが川で水'

Sequence Number = 56
Stability = 0.01
UnstableSpeechResult = '昔々あるところにお爺さんとお婆さんが住んでいましたお爺さんは山へ芝刈りにおばあさんは川へ洗濯に行きましたおばあさんが川'

Sequence Number = 63
Stability = 0.01
UnstableSpeechResult = '昔々あるところにお爺さんとお婆さんが住んでいましたお爺さんは山へ芝刈りにおばあさんは川へ洗濯に行きましたおばあさんが川で洗濯して'

Sequence Number = 57
Stability = 0.01
UnstableSpeechResult = '昔々あるところにお爺さんとお婆さんが住んでいましたお爺さんは山へ芝刈りにおばあさんは川へ洗濯に行きましたおばさんが変わっ'

Sequence Number = 62
Stability = 0.01
UnstableSpeechResult = '昔々あるところにお爺さんとお婆さんが住んでいましたお爺さんは山へ芝刈りにおばあさんは川へ洗濯に行きましたおばあさんが川で洗濯し'

Sequence Number = 64
Stability = 0.01
UnstableSpeechResult = '昔々あるところにお爺さんとお婆さんが住んでいましたお爺さんは山へ芝刈りにおばあさんは川へ洗濯に行きましたおばあさんが川で洗濯してい'

Sequence Number = 66
Stability = 0.01
UnstableSpeechResult = '昔々あるところにお爺さんとお婆さんが住んでいましたお爺さんは山へ芝刈りにおばあさんは川へ洗濯に行きましたおばあさんが川で洗濯していると'

Sequence Number = 65
Stability = 0.01
UnstableSpeechResult = '昔々あるところにお爺さんとお婆さんが住んでいましたお爺さんは山へ芝刈りにおばあさんは川へ洗濯に行きましたおばあさんが川で洗濯している'

Sequence Number = 67
Stability = 0.01
UnstableSpeechResult = '昔々あるところにお爺さんとお婆さんが住んでいましたお爺さんは山へ芝刈りにおばあさんは川へ洗濯に行きましたおばあさんが川で洗濯しているとか'

Sequence Number = 71
Stability = 0.01
UnstableSpeechResult = '昔々あるところにお爺さんとお婆さんが住んでいましたお爺さんは山へ芝刈りにおばあさんは川へ洗濯に行きましたおばあさんが川で洗濯していると川上'

Sequence Number = 72
Stability = 0.01
UnstableSpeechResult = '昔々あるところにお爺さんとお婆さんが住んでいましたお爺さんは山へ芝刈りにおばあさんは川へ洗濯に行きましたおばあさんが川で洗濯していると川上か'

Sequence Number = 73
Stability = 0.01
UnstableSpeechResult = '昔々あるところにお爺さんとお婆さんが住んでいましたお爺さんは山へ芝刈りにおばあさんは川へ洗濯に行きましたおばあさんが川で洗濯していると川上から'

Sequence Number = 69
Stability = 0.01
UnstableSpeechResult = '昔々あるところにお爺さんとお婆さんが住んでいましたお爺さんは山へ芝刈りにおばあさんは川へ洗濯に行きましたおばあさんが川で洗濯していると変わっ'

Sequence Number = 70
Stability = 0.01
UnstableSpeechResult = '昔々あるところにお爺さんとお婆さんが住んでいましたお爺さんは山へ芝刈りにおばあさんは川へ洗濯に行きましたおばあさんが川で洗濯していると彼は彼'

Sequence Number = 68
Stability = 0.01
UnstableSpeechResult = '昔々あるところにお爺さんとお婆さんが住んでいましたお爺さんは山へ芝刈りにおばあさんは川へ洗濯に行きましたおばあさんが川で洗濯していると彼は'

Sequence Number = 74
Stability = 0.01
UnstableSpeechResult = '昔々あるところにお爺さんとお婆さんが住んでいましたお爺さんは山へ芝刈りにおばあさんは川へ洗濯に行きましたおばあさんが川で洗濯していると川上から桃'

Sequence Number = 75
Stability = 0.01
UnstableSpeechResult = '昔々あるところにお爺さんとお婆さんが住んでいましたお爺さんは山へ芝刈りにおばあさんは川へ洗濯に行きましたおばあさんが川で洗濯していると川上から桃が'

Sequence Number = 77
Stability = 0.01
UnstableSpeechResult = '昔々あるところにお爺さんとお婆さんが住んでいましたお爺さんは山へ芝刈りにおばあさんは川へ洗濯に行きましたおばあさんが川で洗濯していると川上から桃がどんぶらこ'

Sequence Number = 76
Stability = 0.01
UnstableSpeechResult = '昔々あるところにお爺さんとお婆さんが住んでいましたお爺さんは山へ芝刈りにおばあさんは川へ洗濯に行きましたおばあさんが川で洗濯していると川上から桃が飛ん'

Sequence Number = 78
Stability = 0.9
UnstableSpeechResult = '昔々あるところにお爺さんとお婆さんが住んでいましたお爺さんは山へ芝刈りにおばあさんは川へ洗濯に行きましたおばあさんが川で洗濯していると川上から桃がどんぶらこ'

Sequence Number = 79
Stability = 0.01
UnstableSpeechResult = '昔々あるところにお爺さんとお婆さんが住んでいましたお爺さんは山へ芝刈りにおばあさんは川へ洗濯に行きましたおばあさんが川で洗濯していると川上から桃がどんぶらこどんぶらこ'

Sequence Number = 82
Stability = 0.01
UnstableSpeechResult = '昔々あるところにお爺さんとお婆さんが住んでいましたお爺さんは山へ芝刈りにおばあさんは川へ洗濯に行きましたおばあさんが川で洗濯していると川上から桃がどんぶらこどんぶらこと流れ'

Sequence Number = 83
Stability = 0.01
UnstableSpeechResult = '昔々あるところにお爺さんとお婆さんが住んでいましたお爺さんは山へ芝刈りにおばあさんは川へ洗濯に行きましたおばあさんが川で洗濯していると川上から桃がどんぶらこどんぶらこと流れて'

Sequence Number = 81
Stability = 0.01
UnstableSpeechResult = '昔々あるところにお爺さんとお婆さんが住んでいましたお爺さんは山へ芝刈りにおばあさんは川へ洗濯に行きましたおばあさんが川で洗濯していると川上から桃がどんぶらこどんぶらことな'

Sequence Number = 80
Stability = 0.01
UnstableSpeechResult = '昔々あるところにお爺さんとお婆さんが住んでいましたお爺さんは山へ芝刈りにおばあさんは川へ洗濯に行きましたおばあさんが川で洗濯していると川上から桃がどんぶらこどんぶらこと'

Sequence Number = 84
Stability = 0.01
UnstableSpeechResult = '昔々あるところにお爺さんとお婆さんが住んでいましたお爺さんは山へ芝刈りにおばあさんは川へ洗濯に行きましたおばあさんが川で洗濯していると川上から桃がどんぶらこどんぶらこと流れてき'

Sequence Number = 87
Stability = 0.01
UnstableSpeechResult = '昔々あるところにお爺さんとお婆さんが住んでいましたお爺さんは山へ芝刈りにおばあさんは川へ洗濯に行きましたおばあさんが川で洗濯していると川上から桃がどんぶらこどんぶらこと流れてきました'

Sequence Number = 85
Stability = 0.01
UnstableSpeechResult = '昔々あるところにお爺さんとお婆さんが住んでいましたお爺さんは山へ芝刈りにおばあさんは川へ洗濯に行きましたおばあさんが川で洗濯していると川上から桃がどんぶらこどんぶらこと流れてきま'

Sequence Number = 86
Stability = 0.01
UnstableSpeechResult = '昔々あるところにお爺さんとお婆さんが住んでいましたお爺さんは山へ芝刈りにおばあさんは川へ洗濯に行きましたおばあさんが川で洗濯していると川上から桃がどんぶらこどんぶらこと流れてきまし'

Sequence Number = 88
Stability = 0.9
UnstableSpeechResult = '昔々あるところにお爺さんとお婆さんが住んでいましたお爺さんは山へ芝刈りにおばあさんは川へ洗濯に行きましたおばあさんが川で洗濯していると川上から桃がどんぶらこどんぶらこと流れてきました'

Speech Result:
'昔々あるところにお爺さんとお婆さんが住んでいましたお爺さんは山へ芝刈りにおばあさんは川へ洗濯に行きましたおばあさんが川で洗濯していると川上から桃がどんぶらこどんぶらこと流れてきました'

 

 最後に

この結果だけ見るとpartialResultCallbackが使い物になるかどうかは定かではありませんが、TwilioのSpeech Recognitionは裏でGoogle APIを呼び出しているということなので、Google APIの使われ方を検索するとうまい応用があるかもしれませんね。

参考

Twilio TwiML <Gather>の仕様 … TwiML™ Voice: <Gather> - Twilio

Twilio Blog … Introducing Speech Recognition - Public Beta Now Open