TTSの価値を見直そう

いまや珍しい存在ではなくなった「音声合成(スピーチシンセサイザー)機能」。Siriなど音声アシスタント機能が登場してからというもの、PCやスマートフォンが"話す"ことは当たり前になったが、ここに至るまでは紆余曲折の歴史と言っていい。Mac OS Xにおける経緯については、7年前の記事(リンク)を御参照いただきたい。

ざっくりいうと、音声合成機能は「昔からあるにはあるが大半の人には縁が薄い存在」だったが、もっと見直されていいと考えている。Siriなど音声アシスタントの普及もあるが、バーチャルYouTuberというTTS(Text To Speech)に大きく依存したコンテンツが登場するなど、TTSの需要が増しているからだ。その点、macOSの日本語TTS(声は「Kyoko」と「Otoya」)は実用性という点でイイ線をいっているのではないだろうか。

第38回で取りあげているが(リンク)、TTSのCUIフロントエンドたる「say」は、標準入力経由でインプットした文字列を扱えるので、刻々と変わる要素も扱いやすい。

Web API/サービスを活用するという手もある。6年前に使い方を紹介したときは日付と(キー入力した)四則演算の結果を読み上げさせただけだが、指定した都市の現在の天気を読み上げるなど、いまや工夫次第でいろいろできてしまう時代だ(実行例1)。読み上げさせるコンテンツはいろいろあるのだから、TTSの使い手側としては"よりネイティブスピーカーに近い声"にする努力のほうが重要になると思うが、いかがだろう?

実行例1:現在の東京の天気を読み上げる

$ say '現在の東京の天気は' `curl -s ja.wttr.in/Tokyo?0 | sed -n 3p | cut -c 31-` 'です'
  • かなり以前からMacはTTSに対応しているが、最近そのニーズが増している?

  • 世界各地の現在の天気/天気予報をHTTPで出力するサービス「wttr.in」を利用すれば、天気に関する情報をMacに読み上げさせることができる

言葉に「間」を持たせたい

現在のmacOSのTTSは、声の種類により機能が異なる。ある声は音程を上下させることができるが、できない声もあるし、音素(phoneme)を指定できる声もあればそうでない声もある。残念ながら、日本語の声(KyokoとOtoya)には音程を付けることも音素を指定することもできないため、イントネーションを細かく指定することは難しい。

言葉と言葉の「間」も重要だ。sayコマンドは、句読点は自然な感じで表現してくれるのだが、俳句のようなコンテンツとなるとそうもいかない。そんなときは「slnc」タグを利用し、sayコマンドに与える引数に「[[slnc 100]]」のようにミリ秒単位で指定してみよう。

たとえば、尾崎放哉が詠んだ「咳をしても一人」は、そのまま「say "咳をしても一人"」とすると機械的で無味乾燥な印象だが、「say "咳をしても[[slnc 800]]一人"」と「一人」の前に0.8秒ほど間を空けると、俄然味わい深くなる。ちなみに、読み上げる声はOtoyaがお勧め。Otoyaの声色は、ナレーターとしても活躍中の声優・大塚芳忠さんに少し似ているので、スタートレックTNGのデータ少佐が頑張って"それらしく"詠んでいるように聞こえること請け合いだ。

$ say -v Otoya "咳をしても[[slnc 800]]一人"

アルファベット1文字だけ伸ばしたい

Alexなど英語の声は、pmodタグを使うとピッチ(音程)を変化させられるため、読み上げる文の一部に強弱を持たせることができるが、KyokoとOtoyaはpmodタグに対応していないようで音程に変化がない。日本語ではイントネーションを変化させるのが難しいのだ。

しかし、「rate」タグを使うと音を伸ばすことができる。このタグを使用した以降の文字は、ミリ秒単位で音が伸びるので、音程は変化しないまでもメリハリを持たせられるのだ。前述のslncタグと組み合わせれば、イントネーションの調整とまではいかないものの、より自然な日本語に近づけることができる。

ピッチコントロールできないOtoya/Kyokoだが、このrateタグを使うことで歌わせることもできる。たとえば、タグなしの「そうさYMCA」はグルーブ感の欠片もないが、slncタグで間を設けつつ「Y」の音を90に伸ばし(1分あたりに発する音の回数、数字が小さいほど音が伸びる)、その後に続く「MCA」を200と短め(初期値は175)に設定すれば、だいぶそれらしく聞こえるようになる。まずは試していただきたい。

$ say -v Otoya "そうさ[[slnc 120]][[rate 90]]Y [[rate 200]] MCA"