Alexaの喋り方を変えてみた（速さ/高さ/音量、数値指定）

Alexaの喋り方を変えてみました。（開発者コンソールのテストツールで確認）
速さ/高さ/音量を、数値で細かく指定ができるのですが、速さはともかく、高さ・音量の数値ってなんだっけ？、とちょっと思ってしまったので、書き残します。
数値で指定しなくても、x-slowとかx-lowとかx-softとか定義済みの値を使って大まかに指定することもできますが、それには（ほとんど）触れません。

公式ドキュメントはこちら
https://developer.amazon.com/ja/docs/custom-skills/speech-synthesis-markup-language-ssml-reference.html#prosody

#速さ
速さは%で指定します。
一定時間内に発話する量の比率と思われるので、これは直感的に分かりやすい。

```
<speak>
    <prosody rate="20%">おっそ－い</prosody>.
    <prosody rate="200%">はやい</prosody>.
    <prosody rate="1000%">はやすぎ</prosody>.
</speak>
```

最小値20%とのこと。ここまで遅くすると、話し始め、話し終わりに機械音まで聞こえてきます。
最大値は書いていませんでしたが、1000%はエラーになりませんでした。もう、何も聞こえない。

#高さ
高さも%で指定します。周波数の指定と思われます。

```
<speak>
    <prosody pitch="-25%">あああ。</prosody>.
    <prosody pitch="-20.5402679231%">あああ。</prosody>.
    <prosody pitch="-15.8153463768%">あああ。</prosody>.
    <prosody pitch="-10.8094663748%">あああ。</prosody>.
    <prosody pitch="-5.5059212579%">あああ。</prosody>.
    <prosody pitch="+0.1129890628%">あああ。</prosody>.
    <prosody pitch="+6.066017178%">あああ。</prosody>.
    <prosody pitch="+12.3730307658%">あああ。</prosody>.
    <prosody pitch="+19.0550788976%">あああ。</prosody>.
    <prosody pitch="+26.1344622881%">あああ。</prosody>.
    <prosody pitch="+33.6348077211%">あああ。</prosody>.
    <prosody pitch="+41.5811469023%">あああ。</prosody>.
    <prosody pitch="+50%">あああ。</prosody>.
</speak>
```

たしか、1オクターブ上がるというのは、周波数が2倍になる、ということだったはず。
最小値は-33.3%、最大値は+50%、ということで、1オクターブとちょっとの範囲を指定できます。

1オクターブ（周波数2倍）の間には半音が12個なので、半音あたりの周波数は（周波数比が一定=平均律、として）2の1/12乗で約1.059463094倍。
上のソースは1.059463094倍ずつ上げて、半音ずつ1オクターブを発話するソースです。

| 半音  | 周波数           |
|:------|----------------:|
| +1個  | +5.9463094359%  |
| +2個  | +12.2462048309% |
| +3個  | +18.9207115003% |
| +4個  | +25.9921049895% |
| +5個  | +33.483985417% |
| +6個  | +41.4213562373% |
| +7個  | +49.8307076877% |
| +8個  | +58.7401051968% |
| +9個  | +68.1792830507% |
| +10個 | +78.1797436281% |
| +11個 | +88.7748625363% |
| +12個 | +100% |

もっとも、0%の音程はAlexaの発話次第で決まり、それを相対的にいじるだけですので、Aの音を出したい！　みたいに絶対的な高さを指定することはできなさそうです。上のソースでも、「あああ。」でない言葉にすれば音程は変わります。2018/8/18現在、「あああ。」の-25%,+50%はAの音くらいに聞こえるけれど、Alexaのエンジンが更新されたらそれも変わるかもしれません。

#音量
音量はdB（デシベル）で指定します。よくわかりません。

```
<speak>
    <prosody volume="+4.0823996531dB">1.6倍</prosody>.
    <prosody volume="+3.5218251811dB">1.5倍</prosody>.
    <prosody volume="+2.9225607136dB">1.4倍</prosody>.
    <prosody volume="+1.583624921dB">1.2倍</prosody>.
    <prosody volume="+0dB">1倍</prosody>.
    <prosody volume="-1.9382002602dB">0.8倍</prosody>.
    <prosody volume="-4.4369749923dB">0.6倍</prosody>.
    <prosody volume="-6.0205999133dB">0.5倍</prosody>.
    <prosody volume="-7.9588001734dB">0.4倍</prosody>.
    <prosody volume="-13.9794000867dB">0.2倍</prosody>.
    <prosody volume="-20dB">0.1倍</prosody>.
    <prosody volume="-26.0205999133dB">0.05倍</prosody>.
    <prosody volume="-33.9794000867dB">0.02倍</prosody>.
    <prosody volume="-40dB">0.01倍</prosody>.
</speak>
```

dBってなんだっけ・・・とざっくり調べた結果、
B（ベル） → 10進数での桁数の差を表すような単位。1Bなら1桁差、すなわち10倍。2Bなら100倍。
dB → d（デシ）は1/10、ということで、Bの1/10の単位。なので、10dBなら1Bと同じ、すなわち10倍。20dBなら100倍。
（対数とか使って数式で表せるはずなのですが、数学忘れました＞＜）

ここで、Alexa公式ドキュメントには、「+6dB では、現在の振幅がおよそ2倍になります。」と書いてあります。
6dBは、0.6Bなので、10^0.6=3.98...倍のはず、なんか合いません。

どうも、dBってアンプの出力なんかで使うらしいのですが、これは電力であって、直接振幅（多分電圧）を表してはいないようなのです。
抵抗が同じで電圧がk倍になれば電流もk倍で、電力はk^2倍、ということで、dB（の表す倍率）でn倍なら、振幅は√n倍？　+6dBなら、振幅は10^(0.6/2)=1.9952...　合ってそうです。

まとめて、+xdBのとき、振幅（多分、）は10^(x/20)倍。
仮定して辻褄合ってるか確認しただけで正確な定義に基づいているかは分からないのですが、それっぽい物が分かりました。

最大値およそ+4.08dBとのことで、振幅1.6倍ほど。
最小値はありませんが、-50dBほどで（私の環境では）何も聞こえません。
定義済みの値"silent"もあります。

| 振幅  | dB              |
|:------|----------------:|
| 1.6倍  | +4.0823996531dB |
| 1.5倍  | +3.5218251811dB |
| 1.4倍  | +2.9225607136dB |
| 1.2倍  | +1.583624921dB |
| 1倍    | 0dB |
| 0.8倍  | -1.9382002602dB |
| 0.6倍  | -4.4369749923dB |
| 0.5倍  | -6.0205999133dB |
| 0.4倍  | -7.9588001734dB |
| 0.2倍  | -13.9794000867dB |
| 0.1倍  | -20dB |
| 0.05倍  | -26.0205999133dB |
| 0.02倍  | -33.9794000867dB |
| 0.01倍  | -40dB |

ところで、人間の耳？脳？は、振幅に比例して強さを感じるのだろうか？　公式ドキュメントに振幅でx倍って文があったので振幅に合わせてみたのですが、やっぱりよく分からん。。。

#余談
なんでこんなことやってみたのかと言うと、2つあって、どちらも老人ホームでレクリエーションやってて思ったことなのですが、
1. 歌う機会がちょこちょこあるので、歌い出しの音程を取る機能（ピッチパイプ的なもの）を作れないかな～、と思ったのでした。が、絶対音程は指定できないので、やるなら録音して音声データ流した方が良いという結論に。良い録音環境が無い。。。~~むしろピッチパイプ持っていけ~~
2. 早口言葉をよくやるのですが、公式の早口言葉は高齢者とやるには難しすぎるし、言いっぱなしで何も反応してくれなくてつまらないので、別途スキル作ろうかなぁ、速さどうやって調整するんだ？　ということでした。こちらは検討中。　~~Alexaが私の代わりにやってくれないかな。~~
まぁ、そもそも老人ホームにEcho置いてないです。はい。
音量は、同じprosodyタグだったのでおまけです。これが一番難しかった。。。