twilio
TwiML
Polly
SSML
TwilioDay 25

"アリス、今までどうもありがとう"

 キミと初めて出会ったのは4年前だったね。

 キミのことを知った瞬間、ボクはすぐに夢中になってしまった。

 でも出会った頃は、どうやって話し掛けたらよいか悩んだっけ。

 まるで、ついこの間の出来事のようだ。

 あの頃は、電話でキミと繋がれることに心が躍った。

 キミの声を聞くたびにドキドキしたよ。

 そして、永遠にこの関係が続くかと思っていた。

 そう、彼女 "Mizuki" が彗星の如くボクの前に現れるまでは…。

 キミに出会ったことは本当に感謝してる。

 何しろボクの常識を根底から変えたんだから。

 でも…。ごめんよ Alice、もうキミとは一緒にいられない…。

  Substitution.png


いったい何の話なのか

Twilioの音声合成エンジン用ボイスの品質と使い勝手が、大幅に向上したという話です。

2018年8月、アリスalice という標準の音声合成ボイスの後継として、ミズキ・ポリーPolly.Mizuki が突如登場しました。

僕はつい最近までこの事実を知らなかったため、サービスの改修に出遅れてしまいました…。

よって、この様な不幸が他の方々にも起こることのないよう 若干の怒りと 周知徹底の意味を込めて、当記事を執筆している次第です。

といいますか、単に僕が知らなかっただけなんですけどね。すみません。すみません。


アリス嬢と距離を置いた理由


  1. 声質(音質)がミズキ・ポリー嬢にかないません。


  2. アリス嬢は、金額を発声させたい時など、数の読み上げに難があります。

    そのため漢数字に変換してから読み上げないと、こちらの意図した通りにはなりません。

    ちなみに、ここまでアリス嬢に尽くしても「七 (ナナ)」のところを「シチ」とか発するので:anger:、更に矯正が必要でした…。



Alice.html

<?xml version="1.0" encoding="UTF-8"?>

<Response>
<Say language="ja-JP" voice="alice">
101010107円。<!--「千十千十七円」と読み上げてしまう(汗-->
一億百一万百七円。<!--「七(ナナ)」を「シチ」と読み上げてしまうので(怒-->
一億百一万百ナナ円。<!--最終的にはこの様に変換する必要が-->
</Say>
</Response>

:loud_sound: サンプル音声


ミズキ・ポリー嬢と仲良くなった理由


  1. アリス嬢のネガがほぼ難なく解決します。

    そして標準でのサポートのため、他の音声合成APIを組み合わせて使う必要がないというのが本当に大きい。

    ただし。 ミズキ・ポリー嬢とのお付き合いには多少のお小遣い(1円≒1000字)が必要ですので、そこはご注意を ^^;

    それにしても、これからTwilioを始める人がホント羨まし~ですな。


  2. 声質が向上しただけでも泣けるほど嬉しいというのに、更にはSSMLという合成音声に特化したマークアップまで使うことが出来るように!

    ちなみに、これはAmazonのAlexaにも使われていて、痒いところに手が届く仕様となっています。



Mizuki.html

<?xml version="1.0" encoding="UTF-8"?>

<Response>
<Say language="ja-JP" voice="Polly.Mizuki">
ミズキとアリス、どっちを取るの?
はっきりして!
</Say>
</Response>

:loud_sound: サンプル音声


SSMLについて

SSMLは、W3Cで勧告されている合成音声の生成用に標準的な手段を提供するマークアップ言語です。

このうちTwilioでは、本記事執筆の時点で10個のタグをサポートしている模様です。

 Amazon Polly at Twilio Docs

ではこの中から、実際に検証できた9個をピックアップしてみます。 Please follow me! :runner: :runner_tone5: :runner_tone1:


<emphasis> 単語を強調する

サンプルコード


emphasis.html

<Response>

<Say language="ja-JP" voice="Polly.Mizuki">
ミズキとアリス、
<emphasis level="reduced"><!--発声が柔らかくて速くなる-->
どっちを取るの?
</emphasis>
<emphasis level="strong"><!--読み上げが大きくて遅くなる-->
はっきりして!
</emphasis>
</Say>
</Response>




:loud_sound: サンプル音声


<p> 段落間に一時停止を追加する

サンプルコード


p.html

<?xml version="1.0" encoding="UTF-8"?>

<Response>
<Say language="ja-JP" voice="Polly.Mizuki">
<!--テキストの段落間に一時停止を追加-->
<p>ミズキとアリス、どっちを取るの?</p>
<p>はっきりして!</p>
</Say>
</Response>




:loud_sound: サンプル音声


<prosody> 音量、話す速度、ピッチを制御する

サンプルコード


prosody.html

<?xml version="1.0" encoding="UTF-8"?>

<Response>
<Say language="ja-JP" voice="Polly.Mizuki">
<prosody rate="130%"><!--早口で-->
ミズキとアリス、
<prosody pitch="+20%"><!--少々甲高い声で-->
どっちを取るの?
</prosody>
</prosody>
<prosody rate="70%" volume="loud"><!--ゆっくり、がなりたてられる-->
はっきりして!
</prosody>
</Say>
</Response>




ご覧の通り、タグのネスト構造も問題ありません。

:loud_sound: サンプル音声


<say-as> 特殊なタイプの単語の発声方法を制御する

サンプルコード


say-as.html

<Response>

<Say language="ja-JP" voice="Polly.Mizuki">
今日は、<say-as interpret-as="date">????1225</say-as> です。<!--年をマスクした上で日付を読み上げる-->
電話は、<say-as interpret-as="telephone">050-1234-5678</say-as> です。<!--電話番号を読み上げる-->
番号は、<say-as interpret-as="digits">05012345678</say-as> です。<!--一文字づつ読み上げる-->
数字は、<say-as interpret-as="number">05012345678</say-as> です。<!--数(番号)として読み上げる-->
あなたのカーチャンは、<say-as interpret-as="expletive">デーベソ</say-as> です。<!--ピー音に入れ換える-->
</Say>
</Response>




番号と数字の読み分けも超カンタン。

:loud_sound: サンプル音声


<sub> 頭字語や略語を別の発音にする

サンプルコード


sub.html

<Response>

<Say language="ja-JP" voice="Polly.Mizuki">
<sub alias="私">ミズキ</sub><!--"ミズキ"を"私"に入れ換える-->
とアリス、どっちを取るの?
はっきりして!
</Say>
</Response>




:loud_sound: サンプル音声


<w> 品詞を指定して発音を向上させる

サンプルコード


w.html

<Response>

<Say>
<!--"read"は不規則変化動詞のひとつ-->
<w role="amazon:VB">read</w>.<!--現在形-->
<w role="amazon:VBD">read</w>.<!--過去形(過去分詞)-->
</Say>
</Response>




例では、動詞の現在形と過去形(または過去分詞)を区別して発声します。

:loud_sound: サンプル音声


<phoneme> 発音記号を使う、 <break> 一時停止する、 <s> 短く一時停止する

サンプルコード


phoneme_break_s.html

<Response>

<Say language="ja-JP" voice="Polly.Mizuki">
<!--発音記号なし-->
<s>Hey, you!</s><!--短い一時停止-->
What did you say?
<break time="1s" /><!--1秒間の一時停止-->
<!--発音記号つき-->
<phoneme alphabet="ipa" ph="heɪ, ju!">Hey, you!</phoneme>
<break strength="strong" /><!--文の後と同じ長さの一時停止-->
<phoneme alphabet="ipa" ph="wʌt dɪd ju seɪ?">What did you say?</phoneme>
</Say>
</Response>




例では、「著者が頑張って発音している感」を表現しています (*^^)v

:loud_sound: サンプル音声


おまけ

サンプルコード


extra.html

<Response>

<Say language="sv-SE" voice="Polly.Astrid">
Astrid to Alice, docchi wo toruno?<!--アストリッドとアリス、どっちを取るの?-->
Hakkiri shite!<!--はっきりして!-->
</Say>
</Response>




:loud_sound: サンプル音声


まとめ

まとめます。

アリス嬢
ミズキ・ポリー嬢

メリット
安上がり
ストレスフリー

デメリット
細かい作り込みが必須
100字毎に0.12円のコスト

SSMLはスマートスピーカーの後押しもあって、今後メインストリームとなっていきそうな予感です。

それと。 文中ではミズキ・ポリー嬢のことを、さもシングルのように記していますが、

実はもうタクミ・ポリーくんPolly.Takumiというれっきとしたパートナーがおりますので、

ご利用の際は二人共々、どうぞよろしくお願いします <(_ _)>


参考

Twilio公式:

 Twilio に 新しい音声合成エンジンボイスを追加!- Amazon Polly 50種類

漢数字への変換:

 [C#]数字を漢数字に変換する

発音記号:

 サポートされている言語の音素およびビゼームテーブル

 英語IPA変換ウェブツール