Pepper SDK入門(30) 値札感覚で外してはいけないテキスト音声合成のタグの話

#はじめに
今回はタイトルにもある通り、テキスト音声合成の話です。
テキスト音声合成、つまりText To Speechエンジンの使用には、特殊なタグが必要になります！つけっぱなしにしないといけないタイプのタグです📛

#テキスト音声合成とは
通常、発話のイントネーションや間の調整などは漢字やひらがな、カタカナの組み合わせで行います。
その書き方については公式のページがあるので[こちら](https://doc.robot.softbank.jp/pepper_biz/manual/index/topics_detail13/id=256)を参照してください。
それとは別の特殊な書き方である、中間言語について紹介することが本記事の狙いです。
中間言語では、Pepperの発話内容をカタカナで表記します。以下で、発話調整に使用可能なタグとその機能を見ていきましょう。
まずは基本となる、文頭記号と文末記号のタグをまとめます↓
・ \<S\>…文の先頭
・ \<F\>…ふつうの文末
・ \<R\>…疑問形の文末
・ \<H\>…上昇調の文末
・ \<N\>…名詞や代名詞で終わる文末
・ \<A\>…急激に終了する文末
・ \<C\>…文が途中で終了している文末

具体的な使用例は記事の後半にありますので、このまま様々なタグを見ていきましょう🌱💭

#アクセント区切り記号で棒読みを卒業する🌸
バーティカルライン(パイプ)はアクセント句の区切りです。
アクセント句は、アクセントを作る最小の単位です。アクセント句には、アクセント上昇か下降の記号をそれぞれ1個だけ使えます。
|の後の数字は0、1、2の三段階を使うことが可能で、これはアクセント区切り記号前後の相対的なピッチの関係です。それぞれピッチの下降、同程度のピッチ、ピッチの上昇の意味です。
数字を省略した場合は|0と同義になります。
<img width="160px" alt="presentation_elevator_pitch_man.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/574697/6ae429af-9eef-e3b9-c020-88fed67bb27e.png">
これはエレベーターピッチを行う動物です。

#フレーズ区切り記号で抑揚を知る
ダラーの記号はフレーズの区切りになります。
アクセント句は1語でありフレーズにはいくつかのアクセント句があるため、アクセント句の区切りでもあります。
\$の後ろの数字は0、1、2の三段階を使うことが可能で、これはフレーズ区切り記号前後のピッチの関係になっています。それぞれピッチの下降、同程度のピッチ、ピッチの上昇の意味です。
数字を省略した場合は$1と同義になります。
<img width="160px" alt="baseball_pitching_machine.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/574697/63db5069-a2ce-260e-abdf-78a0943eb2a2.png">
これは雪だるまの頭部を投げてきたピッチングマシンです。
より細かい単位での声の高さの調整はvctで行ってください。50〜400の範囲で調整可能で、指定しない場合は135になります。下記は使用例です。

```
\vct=145\ 雪だるま海だるま剥きだるま
```

#ポーズ記号でタイム⏹
アンダーバーの記号はアクセント区切り記号かフレーズ区切り記号の後ろに使うと、一時停止を挿入します。ダリが描いたようなほぼ液状時計は登場しません。
アクセント区切り記号の後ろに使うと、フレーズ区切り記号の後ろに使うより一時停止時間が短くなります。
複数連続で使うと、その分だけ一時停止時間は長くなります。
_0、_1、_2で一時停止の長さは異なりそれぞれ一瞬、短め、長めです。数字を省略した場合は_1と同義になります。
<img width="160px" alt="bug_mijinko_noro.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/574697/d067bb5c-809b-29b0-1907-4da4fac49c85.png">$\tiny{時間停止中のノロ(ミジンコ)の様子}$
ミリ秒単位でのより細かい指定はpauで、話速の調整はrspdで行ってください。rspdは50〜200まで指定可能で、指定しない場合は105になります。
下記は使用例です。

```
\pau=1000\ 4分33秒の演奏、今どこら辺？
```
```
\rspd=200\   踊り踊るなら踊りの道理を習って踊りの道理通りに踊りを踊れ
```

通常時の発話に使用されるのは、vct=130、rspd=110あたりです🏹
pau、vct、rspdのいずれも、中間言語のタグとの合わせ技が可能ですよ！🍎🐍

#アクセント上昇記号とアクセント下降記号で乱高下(しない)
^と!の記号はカナの間に使う記号で、それぞれアクセントを上げる位置、下げる位置になります。
どちらも1つのアクセント句の中に1つだけ使えます。アクセント記号をトランポリン状態にするのはやめてあげましょう🚨

#テキスト音声合成してみる🤖🗯
QiChatbotとTopicファイルを利用する場合、中間言語のタグは^rawStartと^rawEndで囲うと機能します。
Sayアクションは先頭に中間言語のタグがある場合のみ中間言語とみなして、Speechエンジンが自動で処理をしてくれるようです。 エンジンはengineであって円陣ではありません。
<img width="160px" alt="1619500886462.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/574697/0e261e42-21a8-83ff-8fe0-61a1b0dc7500.png">
こうじゃないです。

^rawStartと^rawEndの間にあるテキストは、QiChatbotやTopicの特殊記号などに該当しても反応せず、テキストの内容がそのままSpeechエンジンへ送られます📩
例としては、

```
u:(もしもし) ^rawStart  <S>オ^キャクサ!マーーッ$2_2ヨ!カッタラ$2_2ボ!クト|0ダ^ウジングシマセ!ンカ|0ア^アア<R> ^rawEnd
```
こんな感じです。
<img width="160px" alt="_c_choju31_0038_s512_choju31_0038_5.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/574697/8b4eb9ac-241f-a763-059c-94dc9d633b43.png">
調整ありバージョンと調整なしバージョンの比較です！
https://youtu.be/f4h9OzQ_eN0

#あとがき
今回も[PepperSDKforAndroid](https://android.aldebaran.com/sdk/doc/pepper-sdk/ch4_api/conversation/reference/tts_tags.html)を参考に書かせていただきました。

次回からはPepper SDK入門とは別に、QiChat MANIAXと題してQiChat Syntax勉強シリーズを始めます！シンタックスやケンテックス[^1]やケンタッキー[^2]の話が出るかもしれないし、出ないかもしれません。

それでは〜🔔🎈
[^1]: 腕時計のブランド。ブルーインパルス60周年記念モデルが欲しい。
[^2]: 鳥をよくフライしているお店🐓サイドメニューのビスケットがおいしい。