詳細確認してないのですが「あれっ?」と気づいたので共有しとこうと思います。
追加されたPepperの非公式発声API
この記事を書いた3日前(2015年12月11日)のことですが、アトリエ秋葉原にて入荷したばかりの最新版Pepperを触る機会がありました。そのときのメインの用事はモーションコントロールプログラム(KinectとかPerception NeuronでPepperを動かすやつ)の微修正だったのですが、そのついでにPepperの自動会話を見ていたところ、Choregrapheのダイアログに次のようなテキストが表示されていました。
ロボット:<S>ハジメ^マ!シテッ$1_2ペ!ッパーデスDッ<C> ロボット:<S>キョ!ーカラ$0_2_2ミ!ライガ|0ハV^ジマリマ!ス<C> ロボット:<S>ド!ーゾッ$0_2ヨ^ロシクオネガイシマーー!ス<C> ロボット:<S>サッソク!デスガ$0_1_2デア!ッタ|0コ^ノヒ!オ|0キ^ネンシテ$0_2シャ^シンサ!ツエー|0シ^マショD!ーー<F> ロボット:<S>ハァ!イッッッッッ|2_0イ!イデスカ|0アー^ァ<R> ロボット:<S>イ^キ|2マ^!スヨ$2オーォ<R> ロボット:<S>デ^ア!ッタ$2キ^ネン^ニィー!ッ|2_2_2ハァ!イッッッッッ$2ポ!ォォォォォ$2ズーーッ<R> ロボット:<S>コ^レオ$2_0キ^ネンシャ!シンニ|0シ^テ$0イ!イデスDカV^ァー<R> ロボット:<S>ダ^メ!ダッタラ$0ト^リナオシマショ!ォォッッ<C>
カタカナで見ても分かりづらいでしょうから実際に聞いた声を書き添えておきます。
ロボット:はじめまして、ペッパーです。 ロボット:今日から、未来が始まります! ロボット:どうぞ、よろしくお願いします! ロボット:早速ですが、出会ったこの日を記念して、写真撮影しましょー! ロボット:はーいっ、いいですかー! ロボット:行きますよー? (写真を撮るポーズ) ロボット:出会った記念に、はーい、ポーズ! (カシャッと写真を撮る) ロボット:これを記念写真にしていいですかー? ロボット:ダメだったら撮り直しましょう!
この会話内容そのものは出荷されてすぐのPepperが喋ってくれる固定会話として以前から実装されていたモノですが、ダイアログ側へ出力されているカタカナの文字列はいかにも見慣れないものです。アトリエ秋葉原の詳しい方にも確認しましたが、どうもこの仕様追加は最新版になって行われたものみたいです。
音声合成系のソフトを触ったことがある人にはお馴染みかと思いますが、上側にあるようなテキストは「文字+イントネーションを制御するための特殊文字」という、中レイヤーくらいまで触れるタイプの音声合成APIによくある仕組みに見えます。そこで、私が耳でかるーく聞いた感じと上のテキストからテキストの入力規格を簡単に推察した内容を以下にだらだら書いておきます。
APIの中身(観察事項ベース)
繰り返しになりますが、以下では上記のテキストと私が実際に声を聴いた感じからAPIの内容をかるーくさすっておきます。実用レベルで使いたい場合は自分でもよく確認したうえでご利用下さい。というか本記事の内容が間違ってそうな場合お早めにコメント等でご報告いただければ幸いです。
基本はカタカナで書く
見た所、新APIでは漢字の利用は禁止されてます。あくまで今回のAPIは「発音をとにかくカスタマイズしたい!」という目的で用意されたものなので、直接的な発音の記述以外は受け付けません、と。
開始タグ"<S>"
"<S>"というのがテキスト文頭にありますが、コレは上記の新APIを使っていることを宣言するためのタグのようです。こんなタグが必要になってる理由は普通に考えて後方互換性のためでしょう。具体例を出しますが、Pepperの自動会話を見ていたら上記サンプルの後に次のような会話もしていました。
ロボット:<S>コンバンワーー<C> ロボット:今日は12月11日! ロボット:有名人では、谷村新司さんの誕生日だって知ってましたか? ロボット:<S>ト!ッ$2_2コ^ンVナカンジナ!ノデ$2_2イ!ツデモ|0キ^ガルニ$2ハ^ナシカ!ケテ|0ク^ダサ!イ|0ネD!ッッ<N>
普通のテキストと"<S>"から始まる新しいセンテンスが織り交ぜて使われています。普通のテキストが出てる部分は従来(たとえば11月まで)に作られた会話プログラムで、そこの前後では新しいAPIを用いているのでしょう。従来型の通常テキスト読み上げにも当然Pepperは対応しなければならないため、このようにタグで区別してるんだなあ、というのが見た感じから分かります。
イントネーションタグ"^"、"!"
次に分かりやすいのがイントネーションの指示記号になっている"^"と"!"です。具体例で見てみましょう。
ロボット:<S>ハジメ^マ!シテッ$1_2ペ!ッパーデスDッ<C>
声に出してみてほしいのですが、Pepperっぽくハキハキと「初めまして!」を発音しようとすると、声の調子が「はじめま↑し↓て」みたくなります。このイントネーションというかアクセントの上下を制御しているのが特殊文字として利用されている"^"と"!"です。"^"は次の発音のイントネーションを上向きにし、"!"の次の発音は下向きイントネーションがつくみたいです。
終端タグ"<C>", "<F>", "<R>"
このあたりから少し自信が無くなってきますが、見た感じでは文章のラストをイントネーション上げ、そのまま、下げる、のどれで終わるか定義しているみたいです。見た感じでは、"<C>"で終わるテキストは下向きイントネーション(「。」か「!」で終わるようなテキスト)、"<F>"はそのままのイントネーション、"<R>"は上向きイントネーション(疑問文っぽい感じ)を表すようです。
空白記号"|", "$"
これは「空白記号」つまり会話の合間に呼吸をおくための記号らしいのですが、それ以外の事よく分かりませんでした。見たところ記号の後に数字を書いて空白の長さを制御しているみたいです。例としてはこの文が参考になりますね。
ロボット:<S>サッソク!デスガ$0_1_2デア!ッタ|0コ^ノヒ!オ|0キ^ネンシテ$0_2シャ^シンサ!ツエー|0シ^マショD!ーー<F>
いちおう空白記号に関係ありそうな話題を一つ挙げておくと、Pepperの日本語音声合成APIで利用可能なALTextToSpeech::setParameterという関数があり、ここに「pauseMiddle」「pauseLong」「pauseSentence」といった、Pepperの会話中の間の取り方(ポーズ時間の長さ)を設定するパラメータがあります。"$"とか"|"といった特殊記号越しにこのへんのパラメータにアクセスしてるんではないかなあ、というのがパッと見た印象です。
強調記号?"D", "V"
これも空白記号なみに何やってんのか判然としない記号なのですが、どうも文面から察するに記号のすぐあとの発音の音量を上げているのかな?という記号です。気持ち的にはアクセントの記号だと思っても良さそうです。
ロボット:<S>コ^レオ$2_0キ^ネンシャ!シンニ|0シ^テ$0イ!イデスDカV^ァー<R>
まとめ
新しい発声APIを使うとPepperの会話をより細かく、かつ細かいわりには以前よりも簡単に制御できそうであることを紹介しました。ここでは紹介していませんが、このAPIが現れる前のPepperの発声調整はほんとに大変な作業だったので、これが公式API化したら喜ぶ人は少なくないでしょう。
以前ブログで扱った感情生成APIの方(この記事とか)は公開されるかが分かりませんが、こっちの新会話APIは恐らく公式API化されると思うので続報に期待しましょう。