kun432's blog

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

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

APL for Audioで音声にあわせてオーディオの再生時間を自動で調整する②

f:id:kun432:20210131175240p:plain

APL for Audioで、発話の長さに合わせてオーディオの再生時間が自動で調整される機能の第2回です。前回はオーディオの長さ>発話の長さでしたが、今回は逆にオーディオの長さが発話よりも短い場合についてご紹介します。

公式のブログはこちら。

前回の記事はこちら。

サンプルコード

今回のサンプルコードはこちら。発話は約20秒です。今回のオーディオにはサウンドライブラリを使って「雨が降る音」を流していますが、こちらが約5秒です。

{
  "type": "Alexa.Presentation.APLA.RenderDocument",
  "token": "token",
  "document": {
    "type": "APLA",
    "version": "0.91",
    "description": "APL for Audioのサンプルです。",
    "mainTemplate": {
      "parameters": [
        "payload"
      ],
      "item": {
        "type": "Mixer",
        "filter": [
          {
            "type": "FadeOut",
            "duration": 3000
          }
        ],
        "items": [
          {
            "type": "Speech",
            "contentType": "SSML",
            "content": "<speak><break time=\"1s\"/>お天気ニュースの時間です。兵庫県神戸市の明日の天気は、雨、降水確率は80%です。お出かけには傘を忘れないようにしてくださいね。以上、お天気ニュースでした。<break time=\"3s\"/></speak>"
          },
          {
            "type": "Audio",
            "source": "soundbank://soundlibrary/nature/amzn_sfx_rain_02"
          }
        ]
      }
    }
  }
}

Alexa開発者コンソールのAPLAエディタで再生してみるとわかりますが、雨の音は途中で止まってしまいますね。発話時間に合わせて伸ばしてほしいですよね。

Repeatフィルタ

DurationプロパティのtrimToParentは、発話に合わせてオーディオを「短く」してくれるもの、つまり発話時間>オーディオ時間の場合に使うものです。今回のように、発話時間<オーディオ時間の場合に「長く」してくれるわけではありません。

そこでRepeatフィルタを使います。以下のコードで上書きして再生してみてください。

{
  "type": "Alexa.Presentation.APLA.RenderDocument",
  "token": "token",
  "document": {
    "type": "APLA",
    "version": "0.91",
    "description": "APL for Audioのサンプルです。",
    "mainTemplate": {
      "parameters": [
        "payload"
      ],
      "item": {
        "type": "Mixer",
        "filter": [
          {
            "type": "FadeOut",
            "duration": 3000
          }
        ],
        "items": [
          {
            "type": "Speech",
            "contentType": "SSML",
            "content": "<speak><break time=\"1s\"/>お天気ニュースの時間です。兵庫県神戸市の明日の天気は、雨、降水確率は80%です。お出かけには傘を忘れないようにしてくださいね。以上、お天気ニュースでした。<break time=\"3s\"/></speak>"
          },
          {
            "type": "Audio",
            "source": "soundbank://soundlibrary/nature/amzn_sfx_rain_02",
            "filter": [
              {
                "type": "Repeat",
                "repeatCount": 1
              }
            ]
          }
        ]
      }
    }
  }
}

先程より少し雨の音が長く再生されるようになったのがわかるでしょうか?

Repeatフィルタを使うと、repeatCountで指定した回数だけ繰り返します。0を指定した場合でも1回は再生されるので、”追加”再生される回数と考えればわかりやすいかと思います。例えば、2を指定すると、最初の1回に加えて追加で2回、合計で3回再生されるという感じです。

このrepeatCount、-1という指定ができます。-1を指定すると、オーディオ再生が無限に繰り返されます。つまりAPL for Audioで再生可能な240秒間ループされることになります。

{
  "type": "Alexa.Presentation.APLA.RenderDocument",
  "token": "token",
  "document": {
    "type": "APLA",
    "version": "0.91",
    "description": "APL for Audioのサンプルです。",
    "mainTemplate": {
      "parameters": [
        "payload"
      ],
      "item": {
        "type": "Mixer",
        "filter": [
          {
            "type": "FadeOut",
            "duration": 3000
          }
        ],
        "items": [
          {
            "type": "Speech",
            "contentType": "SSML",
            "content": "<speak><break time=\"1s\"/>お天気ニュースの時間です。兵庫県神戸市の明日の天気は、雨、降水確率は80%です。お出かけには傘を忘れないようにしてくださいね。以上、お天気ニュースでした。<break time=\"3s\"/></speak>"
          },
          {
            "type": "Audio",
            "source": "soundbank://soundlibrary/nature/amzn_sfx_rain_02",
            "filter": [
              {
                "type": "Repeat",
                "repeatCount": -1
              }
            ]
          }
        ]
      }
    }
  }
}

こうすることで、つまり発話時間>オーディオ時間 になります。つまり、これでDurationプロパティのtrimToParentを組み合わせることができるということです。

{
  "type": "Alexa.Presentation.APLA.RenderDocument",
  "token": "token",
  "document": {
    "type": "APLA",
    "version": "0.91",
    "description": "APL for Audioのサンプルです。",
    "mainTemplate": {
      "parameters": [
        "payload"
      ],
      "item": {
        "type": "Mixer",
        "filter": [
          {
            "type": "FadeOut",
            "duration": 3000
          }
        ],
        "items": [
          {
            "type": "Speech",
            "contentType": "SSML",
            "content": "<speak><break time=\"1s\"/>お天気ニュースの時間です。兵庫県神戸市の明日の天気は、雨、降水確率は80%です。お出かけには傘を忘れないようにしてくださいね。以上、お天気ニュースでした。<break time=\"3s\"/></speak>"
          },
          {
            "type": "Audio",
            "source": "soundbank://soundlibrary/nature/amzn_sfx_rain_02",
            "duration": "trimToParent",
            "filter": [
              {
                "type": "Repeat",
                "repeatCount": -1
              }
            ]
          }
        ]
      }
    }
  }
}

発話時間にあわせて、オーディオがよしなにループされているのが確認できるかと思います。

まとめ

地味なアップデートですが、動的な発話にあわせてオーディオ再生時間をよしなに調整してくれるのはとても便利ですね。

個人的に、FadeIn/FadeOutフィルタや空白時間(breakタグやSilenceコンポーネント)あたりの使い方を工夫すればかなり自然な感じにできる気がしました。

ぜひお試しください。