2016年7月15日金曜日

Google Cloud Speech API日記(17~19日目)

ここ3日位の解析結果はよくなったり、悪くなったり波がある感じです。

[ 音声ファイル ]
(私)はい、もしもし、おまたせしました。オプトエスピー上原でございます。
(サポート)えー、セールスフォースドットコムサポート担当の西田と申しますが。
(私)はい、お世話になっております。
(サポート)えー、お電話でご質問を頂きました(あっ、はいはい)売上予測のデータを外部出力することができるか(うん)という件なんですけれども(ええ)、今この件で少しお時間頂いても大丈夫ですか。
(私)はい、大丈夫です。

[ 解析結果 ]
通常と結果に違いがなかったのでcontinuousのみ載せています。
<2016/07/13>
・continuous(多分、文の切れ目までを1つの結果として返却する)
"transcript": "はいもしもしまたしましたお手数 you have でございますと申しますいただきますすることができるかという間なんですけれども今この手に少しお時間いただいても大丈夫ですかはい大丈夫です"
<2016/07/14>
・continuous(多分、文の切れ目までを1つの結果として返却する)
"transcript": "はいもしもしまたしましたお手数 you have でございますと申しますいただきますすることができるかという間なんですけれども今この手に少しお時間いただいても大丈夫ですかはい大丈夫です"
<2016/07/15>
・continuous(多分、文の切れ目までを1つの結果として返却する)
"transcript": "はいもしもしまたしましたお手数 you have でございますと申します"

このような結果を受けて、テストグループに以下の質問を投げています。
===============================================================
Hi,
Cloud Speech API team

When it passes for several days, an execution result of API is different.
I think the cause is a renewal of a program.( or machine learning ?)

Is it possible to see the change log?

Thank you.
===============================================================
数日置きに、結果が変わるので、プログラムの改修されているのかなと思ってます。
変更履歴見せてもらえませんか?
という内容です。
※今のところ、見事に既読スルーされておりますが、レスポンスがあったら、フィードバックします。

また、前職の後輩がPepperアプリの開発プロジェクトに参画しているということで、音声認識絡みの情報交換をしてきました。
ポイントは、
・後輩のプロジェクトでは、1フレーズを音声認識して、答えをPepperにしゃべらせてるとのこと。
⇒そのため、私たちのやっている会話を認識させるのとは少し系統が違います。
・今まで、検証した中でGoogle speech APIが一番認識率がよい。
・ただし、採用しているのは、docomoの音声認識エンジン(実は、中身は、HOYA製)。
⇒Google speech APIは、一日の認識依頼できる数に制限があるため、使うのをあきらめたとのこと。
・docomoの音声認識エンジンにも制約があり、一度にリクエストできる音声のサイズは、7~8秒とのこと。
⇒それでも1フレーズには十分なサイズみたいです。

※後輩が開発に携わっている製品は、こちら。(Tweeperという製品です)

先日、カンファレンスに参加して、docomoディベロッパーのアカウントも持っているので、こちらも使ってみようと思います。

2016年7月14日木曜日

Twilioハンズオン Vol.2に参加してきました。

今回のハンズオンは、Twilioでコールフローを作成してみようが大きな目的です。

セミナーの内容は、以下のリンクを見てもらえればと思います。
Twilioハンズオン Vol.2

細かいセミナーの内容は、上記のリンクを確認してもらうとして、ここでは、私の感想をいくつか。

[ コールフローの作成について ]
ニーズ別にFreePBX(Asterisk)と比較して考えると

1. 環境構築後、すぐに外線通話したい
甲乙つけがたいです。それぞれに良さがあると思ってます。

外線着信番号のアカウントがあるならば、
FreePBXの方がいいと思います。
なぜなら、管理画面から定型の必要項目を入力するだけでコールフロー(ダイヤルプラン)は自動生成されるので。
Twilioの場合、都度、着信動作用のコールフローを意識して、XMLを記述するのは少し面倒。
どうしてもプログラムを書くイメージを拭えない。ただし、定型化できると話は違うかもという感じです。

外線着信番号のアカウントがないならば、
断然、Twilioです。
管理画面で購入してすぐに使える威力はすごいと思います。

実際の画面イメージ



2. 外部アプリケーションからコールフローを呼び出したい
実際のどんなとき使うの?といわれると勉強不足で、的確なユースケースを出すのが難しいですが、
少なくともWebアプリケーションに限定すれば、Twilioに分があると思います。
TwiML BINを作成するとすぐにURLが発行されて、それをPHPなどから呼び出せば、OKという感じです。ここに関しては、ドキュメントも充実しているように思えます。
ただ、FreePBXについては、ARI(Asterisk REST Interface)や、sipML5などのJavaScriptライブラリを使うと、機能の柔軟性では勝りそうです。
もっと突っ込んで、ARIを使ってみたくなりました。

今回のハンズオンに参加しての比較は、こんなところでしょうか。

もうひとつ、
[ コールデザインについて ]
今回のハンズオンに参加してよかったと思ったのは、コールデザインで出てきた例を聞けたことです。
今まで、IP-PBXを自社で扱ってきて感じていた閉塞感は、この話を聞いて、もっとIP-PBXを黒子にすることで解消しそうな感じがしました。
ユーザーには、IP-PBXとして、使ってもらうよりも、ユーザーの業務や既存システムをより便利にするという本当の意味でのCTI(Computer Telephony Integration)という使い方を提案すべきなんだろうなと。

ハンズオンで出てきた同報一斉発報などは、いい例だと思います。
提供しているシステムやサービスにトラブルが発生したとき、保守関係者の電話に一斉にトラブル発生を伝える自動音声を発信するとか、
顧客からのトラブル電話について、保守関係者に繋がるまで、順番に優先度の高い人から掛けていき誰かに繋がるまで、掛け続けるのような使い方です。
※保守関係者は、嫌がりそうですが、そこは、休日は発信リストから除外で対応しましょう!

電話サービスといっても、様々な打ち出し方があることを強く感じたハンズオンでした。

2016年7月12日火曜日

Google Cloud Speech API日記(16日目)

本日は、業務の都合上、解析結果の報告だけにとどめておきます。
会話が中途半端なところで切れている音声については、結果に進展はなかったのですが、
会話が途切れていない音声について進展がありました。

[ 音声ファイル ]
(私)はい、もしもし、おまたせしました。オプトエスピー上原でございます。
(サポート)えー、セールスフォースドットコムサポート担当の西田と申しますが。
(私)はい、お世話になっております。
(サポート)えー、お電話でご質問を頂きました(あっ、はいはい)売上予測のデータを外部出力することができるか(うん)という件なんですけれども(ええ)、今この件で少しお時間頂いても大丈夫ですか。
(私)はい、大丈夫です。

[ 解析結果 ]
なんと、かなりの量の会話を認識しております。

・通常時
"transcript": "はいもしもしまたしましたお手数 you have でございますと申しますいただきますすることができるかという間なんですけれども今この手に少しお時間いただいても大丈夫ですかはい大丈夫です"
・continuous(多分、文の切れ目までを1つの結果として返却する)
"transcript": "はいもしもしまたしましたお手数 you have でございますと申しますいただきますすることができるかという間なんですけれども今この手に少しお時間いただいても大丈夫ですかはい大丈夫です"

ちなみに前日までの結果は以下の通りでした。

・通常時
"transcript": "はいもしもしまたしましたお手数 you have でございますと申します"
・continuous(多分、文の切れ目までを1つの結果として返却する)
"transcript": "はいもしもしまたしましたお手数 you have でございますと申します"

やはり、会話が途中で途切れないことは重要なのかも知れないです。
この辺り、問合せしてみたいですね。

2016年7月11日月曜日

Google Cloud Speech API日記(15日目)

13、14日目は、お休みしてしまったため、本日15日目になります。
前回の宣言通り、今日は音圧を調整して、結果に影響があるかを検証してみました。
検証した音圧は、通常、1.5倍、2倍、3倍、5倍、10倍になります。
[ 音声ファイル ]
(私)はい、もしもし、おまたせしました。オプトエスピー上原でございます。
(サポート)えー、セールスフォースドットコムサポート担当の西田と申しますが。
(私)はい、お世話になっております。
(サポート)えー、お電話でご質問を頂きました(あっ、はいはい)売上予測のデータを外部出力することができるか(うん)という件なんですけれども(ええ)、今この件で少しお時間頂いても大丈夫ですか。
(私)はい、大丈夫です。

[ 解析結果 ]
※すべて、continuous(多分、文の切れ目までを1つの結果として返却する)で検証しております。

<通常>
"transcript": "はいもしもしまたしましたお手数 you have でございますと申します"
<1.5倍>
"transcript": "はいもしもしまたしましたお手数 you have でございます"
<2倍>
"transcript": "はいもしもしまたしましたお手数 you have でございますと申します"
<3倍>
"transcript": "はいもしもしまたしましたお手数 you have でございます"
<5倍>
"transcript": "はいもしもしまたしましたお手数 you have でございますと申します"
<10倍>
"transcript": "はいもしもしまたしましたお手数 you have でございます"

結果を見る限り、交互に「と申します」が含まれたり、含まれなかったりするのは気になりますが、音圧による結果への影響はあまりなさそうです。

明日以降は、結果の変動もチェックしつつ、機能をもう少し掘り下げてみようと思います。

Google Cloud Speech API日記(12日目)

前日の宣言通り、話し手が変わると、それ以降は認識しなくなるか検証してみました。
最初のIVR部分と呼び出し音を削って、私の会話からスタートしたものに変更しています。
私の音声だけが抜き出されて、解析結果に出たら面白いですよね。

[ 音声ファイル ]
(私)はい、もしもし、おまたせしました。オプトエスピー上原でございます。
(サポート)えー、セールスフォースドットコムサポート担当の西田と申しますが。
(私)はい、お世話になっております。
(サポート)えー、お電話でご質問を頂きました(あっ、はいはい)売上予測のデータを外部出力することができるか(うん)という件なんですけれども(ええ)、今この件で少しお時間頂いても大丈夫ですか。
(私)はい、大丈夫です。

[ 解析結果 ]
・通常時(最低限必要な、エンコード、サンプリング周波数、言語コードのみ指定)
"transcript": "はいもしもしまたしましたお手数 you have でございますと申します"

・continuous(多分、文の切れ目までを1つの結果として返却する)
"transcript": "はいもしもしまたしましたお手数 you have でございますと申します"

うーん、私の会話の後、サポートさんの会話(と申します)がくっついている、なんだろう?
なぞが深まります。
ただ、通常時の結果が前回のように複数候補を挙げるものではなくなっています。

前回の音声を解析してみましょう。

[ 解析結果(前回の音声) ]
・通常時(最低限必要な、エンコード、サンプリング周波数、言語コードのみ指定)
"transcript": "ハイ2 sp でございます内線番号を教えて下さいできるかという間なんですけれど少しお時間いただいても大丈夫ですか"

・continuous(多分、文の切れ目までを1つの結果として返却する)
"transcript": "ハイ2 sp でございます内線番号を教えて下さいできるかという間なんですけれど少しお時間いただいても大丈夫ですか"

なるほど、こちらは、IVRの後に、私の会話がスキップされて、サポートの会話が中途半端にくっついています。
IVRの解析結果は、通常時の結果も含めて良くなっているようです。

これは、解釈が難しい結果になってしまいました。
自己学習しているというよりは、定期的にプログラムが更新されているのかも知れないですね。

可能であれば、バージョンアップの履歴とつき合わせてみようと思います。

次回は、音声ファイルの音量を変えてみるなど、また別な切り口で解析してみようと思います。

2016年7月8日金曜日

Google Cloud Speech API日記(10日目)

諸事情あって本日は、解析結果のみの報告となります。
明日以降は、引き続き解析結果の報告及び、各オプションの解析を続けてまいります。
特記事項としては、continuousの結果が改悪してしまっております。

[ 音声ファイル ]
※以前、紹介した60秒の音声から無音の箇所や、リング音の一部を除去して30秒に収めたものです。
(IVR)はい、オプトエスピーでございます。内線番号を押してください。
ピッ、
プルルル(呼び出し音1回)
(私)はい、もしもし、おまたせしました。オプトエスピー上原でございます。
(サポート)えー、セールスフォースドットコムサポート担当の西田と申しますが。
(私)はい、お世話になっております。
(サポート)お世話になっております。
(サポート)えー、お電話でご質問を頂きました(あっ、はいはい)売上予測のデータを外部出力することができるか(うん)という件なんですけれども(ええ)、今この件で少しお時間頂いても大丈夫ですか。
(私)はい、大丈夫です。

[ 解析結果 ]
・通常時(最低限必要な、エンコード、サンプリング周波数、言語コードのみ指定)
"transcript": "ハイ|ハイ 2|ツー,ニ,フタ,フツ,ブタ sp|エスピー で|デ ござい|ゴザイ ます|マス 内線|ナイセン 番号|バンゴー を|オ 教え|オシエ て|テ ください|クダサイ"

・continuous(多分、文の切れ目までを1つの結果として返却する)
"transcript": "ハイ2 sp でございます来店番号を教えてください"

2016年7月7日木曜日

Google Cloud Speech API日記(11日目)

本日は、オプションのspeechContextについて掘り下げてみます。
まず、speechContextは、解析前に、解析エンジンにヒントを教えるものです。
要するに、この音声には、こんな単語が含まれていますを教えるイメージです。
※昨日と同じオプションで解析した場合は、結果が変わらなかったため、割愛します。

[ 音声ファイル ]
※以前、紹介した60秒の音声から無音の箇所や、リング音の一部を除去して30秒に収めたものです。
(IVR)はい、オプトエスピーでございます。内線番号を押してください。
ピッ、
プルルル(呼び出し音1回)
(私)はい、もしもし、おまたせしました。オプトエスピー上原でございます。
(サポート)えー、セールスフォースドットコムサポート担当の西田と申しますが。
(私)はい、お世話になっております。
(サポート)えー、お電話でご質問を頂きました(あっ、はいはい)売上予測のデータを外部出力することができるか(うん)という件なんですけれども(ええ)、今この件で少しお時間頂いても大丈夫ですか。
(私)はい、大丈夫です。

では、早速結果を見ていきます。
前提として、continuousを常に指定しています。

No.指定ワード結果備考
1なしハイ2 sp でございます来店番号を教えてください
2内線番号ハイ2 sp でございます内線番号を教えてくださいきっちり結果に反映
3内線番号、オプトエスピーはいオプトエスピーでございます内線番号を教えてくださいきっちり結果に反映
4なしハイ2 sp でございます来店番号を教えてください学習効果を期待しましたが、改善せず
5内線番号、オプトエスピー、押して下さいはいオプトエスピーでございます内線番号を教えてください文脈も認識しているようで反映されず

この結果で、面白いのは、4と5だと思います。
4は、まぁすぐには、学習してくれないよねということがわかりました。
5については、備考に記載した通り、文脈を認識しているようで、断固として、教えてくださいを変えないです。(ここに人間っぽさを感じませんか?)

最後に皆さん気になっていると思いますが、何で最初のIVR以外解析されないの?
というところですが、私なりに解釈すると、音声の波形が変わる(話している人が変わる)と雑音と認識するのか、それ以降は解析しないようです。
<実際の波形>

明日以降は、この仮説を検証してみようと思います。

2016年7月5日火曜日

Google Cloud Speech API日記(9日目)

昨日の宣言通り、会話が途中で途切れないような音声にチューニングした上での解析結果になります。
初日のため、まだ解析結果には改善の余地はありそうですが、オプションにcontinuousを指定したときの解析結果は、かなりのものではないでしょうか。
※ただし、かなりの会話が削られているところ及び、文の切れ目を認識できてないところは気になります。

やはり、中途半端な音声ファイルは解析結果に影響がでるようです。
数日後の解析結果も期待できそうです。

[ 新音声ファイル ]
※以前、紹介した60秒の音声から無音の箇所や、リング音の一部を除去して30秒に収めたものです。
(IVR)はい、オプトエスピーでございます。内線番号を押してください。
ピッ、
プルルル(呼び出し音1回)
(私)はい、もしもし、おまたせしました。オプトエスピー上原でございます。
(サポート)えー、セールスフォースドットコムサポート担当の西田と申しますが。
(私)はい、お世話になっております。
(サポート)お世話になっております。
(サポート)えー、お電話でご質問を頂きました(あっ、はいはい)売上予測のデータを外部出力することができるか(うん)という件なんですけれども(ええ)、今この件で少しお時間頂いても大丈夫ですか。
(私)はい、大丈夫です。

[ 解析結果 ]
・通常時(最低限必要な、エンコード、サンプリング周波数、言語コードのみ指定)
"transcript": "ハイ|ハイ 2|ツー,ニ,フタ,フツ,ブタ sp|エスピー で|デ ござい|ゴザイ ます|マス 内線|ナイセン 番号|バンゴー を|オ 教え|オシエ て|テ ください|クダサイ"

・continuous(多分、文の切れ目までを1つの結果として返却する)
"transcript": "ハイ2 sp でございます内線番号を教えて下さいできるかという間なんですけれど少しお時間いただいても大丈夫ですか"

2016年7月4日月曜日

ネットワークプログラミングクックブック

0. fork,exec,pipeについて(面白そうなので一読)  

0. Interprocess Communication (IPC)

1. selectシステムコールが分かっていなかった

2. ノンブロッキングI/O
  1. ノンブロッキング I/O について調べてみた 
  2. ノンブロッキングI/Oと非同期I/Oの違いを理解する(select、poll、epollの実装サンプルが参考になりそう)
3. ファイルディスクリプタ監視システムコール
  1. select
  2. poll
  3. epoll
4. ソケット入門(1)

5. AF_INET、PF_INETの違い
  1. PFは「ProtocolFamily」の略で、socket関数へ送るもの。AFは「AddressFamily」の略で、connectで使うアドレス指定。Internetではアドレス指定がひとつしかない、つまり同値。
  2. C言語のソケットプログラミング 
6. setsockopt-設定するオプションが一番まとまっているサイト

7. TCPを使う(サーバ、SO_REUSEADDR) 再起動時bindエラー回避 

Google Cloud Speech API日記(6~8日目)

continuous(多分、文の切れ目までを1つの結果として返却する)を指定したときの結果に変化がありました。
また、この変化が興味深い結果となりました。
具体的には、1度改善された結果が翌日元に戻るというものです。
この結果の意味するところ、会話が途中で切れるような音声ファイルだと結果も不安定になるようです。
そのため、明日以降、会話が途中で切れないような音声ファイルにチューニングした上で検証を続けようと思います。

[ 音声ファイル]
(IVR)はい、オプトエスピーでございます。内線番号を押してください。
ピッ、ポッ、パッ
プルルル(呼び出し音5回)
(私)はい、もしもし、おまたせしました。オプトエスピー上原でございま
※30秒で強制的に音声を切っているため中途半端な状態になっています。

[ 解析結果 ]
返却結果のtranscript(音声解析結果)以外に変化はなかったので、そこだけ抽出して結果として残しております。
<2016/07/02>
・通常時(最低限必要な、エンコード、サンプリング周波数、言語コードのみ指定)
"transcript": "ハイ|ハイ 2|ツー,ニ,フタ,フツ,ブタ sp|エスピー で|デ ござい|ゴザイ ます|マス 内線|ナイセン 番号|バンゴー を|オ 教え|オシエ て|テ ください|クダサイ まし|マシ た|タ"
⇒改善なしです。

・continuous(多分、文の切れ目までを1つの結果として返却する)
 "transcript": "はいオプト sp でございます内線番号を教えてください"
 "transcript": "もしもしまたしましたお手数上原でございま"
⇒まだ、数箇所誤認識はありますが、内線番号及び上原を正しく認識しており、かなりの改善がみられました。

<2016/07/03>
・通常時(最低限必要な、エンコード、サンプリング周波数、言語コードのみ指定)
"transcript": "ハイ|ハイ 2|ツー,ニ,フタ,フツ,ブタ sp|エスピー で|デ ござい|ゴザイ ます|マス 内線|ナイセン 番号|バンゴー を|オ 教え|オシエ て|テ ください|クダサイ まし|マシ た|タ"
⇒改善なしです。

・continuous(多分、文の切れ目までを1つの結果として返却する)
"transcript": "アイオプトエスピーでございます支店番号を教えてください"
"transcript": "明日でござい"
⇒なんと、結果が元に戻ってしまいました。

<2016/07/04>
・通常時(最低限必要な、エンコード、サンプリング周波数、言語コードのみ指定)
"transcript": "ハイ|ハイ 2|ツー,ニ,フタ,フツ,ブタ sp|エスピー で|デ ござい|ゴザイ ます|マス 内線|ナイセン 番号|バンゴー を|オ 教え|オシエ て|テ ください|クダサイ まし|マシ た|タ"
⇒改善なしです。

・continuous(多分、文の切れ目までを1つの結果として返却する)
"transcript": "アイオプトエスピーでございます支店番号を教えてください"
"transcript": "明日でござい"
⇒改善なしです。

2016年7月1日金曜日

Google Cloud Speech API日記(5日目)

解析結果は、昨日と変わらずです。本日は、オプションを指定して解析結果の変化を見ていこうと思います。
<2016/07/01>
・通常時(最低限必要な、エンコード、サンプリング周波数、言語コードのみ指定)
{
  "responses": [
    {
      "results": [
        {
          "alternatives": [
            {
              "transcript": "ハイ|ハイ 2|ツー,ニ,フタ,フツ,ブタ sp|エスピー で|デ ござい|ゴザイ ます|マス 内線|ナイセン 番号|バンゴー を|オ 教え|オシエ て|テ ください|クダサイ まし|マシ た|タ"
            }
          ],
          "isFinal": true
        }
      ]
    }
  ]
}

・maxAlternatives(仮説の最大数:結果をいくつまで返却するかだと思う)に0、5を指定
※結果が変わらなかったので、Responnseは割愛

・profanityFilter(汚い言葉をフィルタする)にtrueを指定
※当然、結果は変わらなかったので、Responseは割愛

・continuous(多分、文の切れ目までを1つの結果として返却する)
この結果は、少し面白かったです。
結果としては、指定しないより、意味が通っているように思われます。
ただ、指定前は解析できていた内線番号を支店番号と誤って解析しています。
上記より、文の切れ目を、意識させると解析結果がよくなるのかも知れません。
そのため、今回の音声解析がなかなか改善しないのは、途中で無理やり音声を切っているからかも。
もう少し様子をみて改善しないようであれば、途中で切れずかつ、30秒で収まる音声を作ることも検討します。
{
  "responses": [
    {
      "results": [
        {
          "alternatives": [
            {
              "transcript": "アイオプトエスピーでございます支店番号を教えてください",
              "confidence": 1
            }
          ],
          "isFinal": true
        }
      ]
    },
    {
      "results": [
        {
          "alternatives": [
            {
              "transcript": "明日でござい",
              "confidence": 1
            }
          ],
          "isFinal": true
        }
      ],
      "resultIndex": 1
    }
  ]
}

明日以降も、引き続き様々なオプションを試してみます。