kun432's blog

Alexaなどスマートスピーカーの話題中心に、Voiceflowの日本語情報を発信してます。たまにAWSやkubernetesなど。

〜スマートスピーカーやVoiceflowの記事は右メニューのカテゴリからどうぞ。〜

#VUIchallenge #021 - Stories & SSML

f:id:kun432:20210711001052p:plain

#VUIchallengeの第21回です。テーマは「Stories & SSML」。

過去の#VUIchallengeの記事はこちら

お題

The challenge

Using TTS voice only, what SSML tags would you use for an interactive story? Create and test some examples on the developer console or with any online SSML editor.

Jesús' Tips

Warning! Some tags might not sound as you expect and your expectations might not be met. Test them carefully and make sure they make the effect you need for your story.

DeepLによる日本語訳

課題

TTS音声のみを使用して、インタラクティブなストーリーにどのようなSSMLタグを使用しますか?開発者コンソールやオンラインのSSMLエディタで例を作ってテストしてみてください。

Jesúsのヒント

注意!いくつかのタグは、あなたが期待しているようには聞こえないかもしれませんし、あなたの期待に応えられないかもしれません。慎重にテストして、あなたのストーリーに必要な効果があるかどうか確認してください。

前提

今回はSSMLですね。SSMLも過去のチャレンジで何度か出てきています。

過去のチャレンジのときは、人間が聞き取りやすくする、もしくはあえて聞き取りにくくすることでゲーム性を高める、ということで、あくまでも「話し方」を調節するものでした。

今回は「インタラクティブなストーリー」で、というところがミソです。つまり、端的に言ってしまうと、ストーリーに「臨場感」などの効果を与えるための使い方ということですね。

以前に「インタラクティブな物語スキルをVoiceflowで作ろう」という、まさに同じテーマでハンズオンを行ったことがあります。

今回は上記のハンズオンで使った、物語づくりにおけるSSMLの使い方をいくつかご紹介したいと思います。

ハンズオンの資料は以下で公開しています。Voiceflowの画面構成が変わってしまっていますので、読み替えて頂く必要があります。 また、ハンズオンの中でサンプルプロジェクトへのリンクも用意しています。Voiceflowアカウントをお持ちの方は、インポートしてAlexa開発者コンソールにアップロードして、実際に動かしていただくことが可能です。(ちょっと古いですが、多分今でも動くはず・・・) 上記以外にロングバージョンのサンプルもあります。ハンズオン資料の一番最後の付録をごらんください。

デザイン

キャラクターの会話

物語の中には複数のキャラクターが登場するものがあります。上記のハンズオンでは「シンデレラ」をテーマにしていました。シンデレラだと以下のようなキャラクターが登場します。

  • ナレーター
  • シンデレラ
  • まま母
  • いじわるなお姉さん その1
  • いじわるなお姉さん その2
  • 魔法使いのおばあさん
  • 王子様

こういったキャラクターが複数存在する場合、同じ声の種類だけだと誰が喋っているのかわかりにくくなります。SSMLを使うと声質・発話の音程・発話のスピードを変えることができるので、キャラクターごとに設定を変えることで複数の異なるキャラクターが喋っているような感じが再現できます。

f:id:kun432:20210816010544p:plain

ここで使っているタグは、voiceタグ、prosodyタグの2種類です。いくつか見てみましょう。

SSMLは、プラットフォームによって実装が異なります。どのプラットフォームでも同じように使えるもの、複数のプラットフォームで使えるが微妙にパラメータなどが異なるもの、特定のプラットフォームでしか使えないもの、などがあります。このあたりの違いについては各プラットフォームのSSMLリファレンスを参照してください。今回は、AlexaのSSMLを使います。

voiceタグ

Alexaのみになりますが、Voiceタグを使うと、Amazon Pollyで用意されている声質に変えることができます。言語ごとに複数の声質が用意されており、日本語の場合は、"Mizuki"(女性の声)、"Takumi"(男性の声)が利用可能です。

まず、voiceタグを指定しない場合は標準の"Alexa"の声になります。ナレーター的なものは標準の声を使うと良いでしょう。

<speak>
    むかしむかし、あるところにシンデレラというとても美しくて優しい娘がいました。
</speak>

ではvoiceタグを使ってみましょう。女性の声を継母の声にしてみました。

<speak>
    <voice name="Mizuki">シンデレラ、あんたも仕事が終われば、舞踏会に来てもいいわ、ただそのボロボロの服でも来れるなら、だけどね。あっはっは。</voice>
</speak>

次は男性の声。こちらは王子様の声にしてます。

<speak>
    <voice name="Takumi">美しいお嬢さん、ぼくと、踊っていただけませんか?</voice>
</speak>

voiceタグについてのドキュメントはこちら。

ちなみに、langタグと組み合わせると、日本語以外の言語も発話させることができます。

prosodyタグ

以前のチャレンジでもやりましたね。prosodyタグを使うと、発話のスピードを変えることができますが、それだけでなく、発話の音程を変えることができます。pitchで音程、rateでスピードを指定できます。

いじわるなお姉さんその1は、声が高くて早口な感じ。

<speak>
    <voice name="Mizuki"><prosody pitch="x-high" rate="fast">シンデレラ、さっさと掃除を終わらせなさいよ。</prosody></voice>
</speak>

いじわるなお姉さんその2は、声が低くてゆっくりしゃべる感じです。

<speak>
    <voice name="Mizuki"><prosody pitch="x-low" rate="slow">シンデレラ、掃除が終わったら次は洗濯よ、怠けないでやるのよ。</prosody></voice>
</speak>

こんな感じで、voiceタグとprosodyタグを組み合わせると、複数のキャラクターの声を使い分けることができます。ついでに、シンデレラと魔法使いのおばあさんの声はこんな感じです。

シンデレラ

<speak>
    <prosody pitch="x-high">ああ、わたしも舞踏会に行きたいわ。でもこんなボロボロの服じゃとても王子さまに、お会いできないわ、しくしく</prosody>
</speak>

魔法使いのおばあさん

<speak>
    <prosody pitch="x-low" rate="slow">泣くのはおよし、シンデレラ。お前はいつも仕事をがんばるとても良い子じゃ、ごほうびにわたしが魔法で舞踏会へ行かせてあげるとしよう。</prosody>
</speak>

ただ、聞いてもらうと分かる通り、少しイントネーションがおかしかったり、いかにも合成音声な感じがしますよね。発話の内容や句読点の位置などによっても変わってきますが、SSML、特にprosodyタグを使うとこういうことが起きやすい気がします。なので、必ず実際に発話させてみて確認したほうがよいですね。

prosodyタグのドキュメントはこちら。

効果音

効果音を入れると楽しい感じにできるというのも以前ご紹介しました。

これは物語スキルでももちろん有効です。効果音や音楽などのサウンドを使う場合はaudioタグを使います。

<speak>
    <prosody pitch="x-low" rate="slow">ちちんぷいぷい、えいっ。</prosody>
    そういって、魔法使いのおばあさんは魔法の杖を一振りしました。<audio src="soundbank://soundlibrary/magic_spells/magic_spells_07\"/>
</speak>

魔法をかけた音を出してみました。音が出るとちょっと物語っぽい感じがして楽しいですよね。

ちなみに、上の例では、Alexa Skills Kitサウンドライブラリを使っています。Alexaスキルでのみ利用可能ですが、約2500以上の音源を自由に使うことができます。

もちろん自分で用意したオーディオファイルを使うこともできます。その場合はインターネット上でアクセスできる場所にファイルを配置しておく必要があります。

audioタグのドキュメントはこちら。

BGM

audioタグを使った効果音はとても良いのですが、BGM的に「音楽と発話を同時に行う」ということができません。SSMLのaudioタグでは再生するオーディオファイルを指定することしかできないので、SSMLだけでこれを実現するには、BGMの上に発話の載せたオーディオファイルを自分で用意しておいて再生させる必要があります。ただ、そうなると、ユーザの発話をもとに動的に発話内容を変えるというようなことをやる場合、そのパターンの数だけ、オーディオファイルを予め用意しておく必要があります。

Alexaの場合、APL for Audioを使うと、ユーザの対話に応じて発話内容を変えつつBGMも同時に鳴らすということをコードで記述できます。SSMLだけでは実現できないのでコードは割愛します。実際に動かしてみたサンプルはこちらです。

SHW様のフリー音源を使用させていただきました。

ちなみに、Googleの場合は、SSMLだけでできます。mediaタグとparタグを使います。

</speak>
日本昔ばなしスキルです。今日のお話は、桃太郎。<break time="1s"/>
<par>
  <media xml:id="bgm" end="obaasan_story.end+2s" fadeOutDur="2s">
    <audio src="https://dl.dropboxusercontent.com/s/xxxxxxxxxx/momotaro.mp3" 
     soundLevel="-20dB"/>
  </media>
  <media xml:id="intro" begin="0.7s">
    <speak>むかーしむかし、あるところに、おじいさんとおばあさんが住んでいました。毎日、</speak>
  </media>
  <media xml:id="ojiisan_story" begin="intro.end+0.2s">
    <speak>おじいさんは、山に芝刈りに、</speak>
  </media>
  <media xml:id="ojiisan_sound" begin="ojiisan_story.end-0.5s">
    <audio src="https://dl.dropboxusercontent.com/s/xxxxxxxxxx/shibakari.mp3"   
     repeatCount="2"/>
  </media>
  <media xml:id="obaasan_story" begin="ojiisan_story.end+0.5s">
    <speak>おばあさんは、川に洗濯に、いっていました。</speak>
  </media>
  <media xml:id="obaasan_sound" begin="obaasan_story.end-2.0s" fadeOutDur="2s">
    <audio src="https://dl.dropboxusercontent.com/s/xxxxxxxxxx/sentaku.mp3" clipEnd="3s"/>
  </media>
</par>
</speak>

発話とオーディオの同時再生やAPL for Audioについては、過去の記事でも記載しています。よろしければそちらをご覧ください。

まとめ

インタクティブなストーリーを作る場合、いかにその物語に没入できるか、というところはとても重要です。

現状の音声アプリはどちらかというと、ユーザのアシスタントとして、音声で命令を受けてタスクをこなす、という前提が強いと思っています。そのため、ストーリーテリングのような表現力が求められるものは正直厳しい面がありますが、音声によるインタラクティブ性はとても間口の広いものだと思いますし、SSMLやオーディオファイルを使うことでカバーできる部分もあると思います。いろいろ工夫すれば楽しいものができるのではないでしょうか。

ただし、ヒントにもあるように、ここは実際に聞いてみないとわからない部分が大きいので、その点には注意が必要ですね。