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


 キミと初めて出会ったのは4年前だったね。
 キミのことを知った瞬間、ボクはすぐに夢中になってしまった。
 でも出会った頃は、どうやって話し掛けたらよいか悩んだっけ。
 まるで、ついこの間の出来事のようだ。

 あの頃は、電話でキミと繋がれることに心が躍った。
 キミの声を聞くたびにドキドキしたよ。
 そして、永遠にこの関係が続くかと思っていた。
 そう、彼女 "Mizuki" が彗星の如くボクの前に現れるまでは…。

 キミに出会ったことは本当に感謝してる。
 何しろボクの常識を根底から変えたんだから。
 でも…。ごめんよ Alice、もうキミとは一緒にいられない…。

  

いったい何の話なのか

Twilioの音声合成エンジン用ボイスの品質と使い勝手が、大幅に向上したという話です。
2018年8月、アリスalice という標準の音声合成ボイスの後継として、ミズキ・ポリーPolly.Mizuki が突如登場しました。

僕はつい最近までこの事実を知らなかったため、サービスの改修に出遅れてしまいました…。
よって、この様な不幸が他の方々にも起こることのないよう 若干の怒りと 周知徹底の意味を込めて、当記事を執筆している次第です。
といいますか、単に僕が知らなかっただけなんですけどね。すみません。すみません。

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

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

  2. アリス嬢は、金額を発声させたい時など、数の読み上げに難があります。
    そのため漢数字に変換してから読み上げないと、こちらの意図した通りにはなりません。
    ちなみに、ここまでアリス嬢に尽くしても「七 (ナナ)」のところを「シチ」とか発するので、更に矯正が必要でした…。

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

サンプル音声

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

  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>

サンプル音声

SSMLについて

SSMLは、W3Cで勧告されている合成音声の生成用に標準的な手段を提供するマークアップ言語です。
このうちTwilioでは、本記事執筆の時点で10個のタグをサポートしている模様です。
 Amazon Polly at Twilio Docs
ではこの中から、実際に検証できた9個をピックアップしてみます。 Please follow me!

<emphasis> 単語を強調する

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


サンプル音声

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

サンプルコード
p.html
<?xml version="1.0" encoding="UTF-8"?>
<Response>
    <Say language="ja-JP" voice="Polly.Mizuki">
        <!--テキストの段落間に一時停止を追加-->
        <p>ミズキとアリス、どっちを取るの?</p>
        <p>はっきりして!</p>
    </Say>
</Response>


サンプル音声

<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>


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

サンプル音声

<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>


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

サンプル音声

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

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


サンプル音声

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

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


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

サンプル音声

<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

サンプル音声

おまけ

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


サンプル音声

まとめ

まとめます。

アリス嬢 ミズキ・ポリー嬢
メリット 安上がり ストレスフリー
デメリット 細かい作り込みが必須 100字毎に0.12円のコスト

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

それと。 文中ではミズキ・ポリー嬢のことを、さもシングルのように記していますが、
実はもうタクミ・ポリーくんPolly.Takumiというれっきとしたパートナーがおりますので、
ご利用の際は二人共々、どうぞよろしくお願いします <(_ _)>

(ツイッターフォローはこちら

参考

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

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

発音記号:
 サポートされている言語の音素およびビゼームテーブル
 英語IPA変換ウェブツール