# 発話制御：SSMLの利用

音声合成マークアップ言語（Speech Synthesis Markup Language / SSML）を利用すると、デジタルヒューマンの声色や発声をより細かく制御することができます。

SSMLはXMLベースのマークアップ言語であり、これにより開発者はデジタルヒューマンのTTS（Text-to-Speech）を使用して、入力テキストを合成音声に変換する方法を指定できます。

プレーンテキストと比較して、SSMLでは開発者が音声合成出力のピッチ、読み方、読み上げ速度、音量などを微調整できます。通常の句読点は自動的に処理されますが、ピリオドの後の一時停止や疑問符で終わる文のイントネーションなど、正しい使用法にも対応しています。

すべてのTTSプロバイダが全てのSSMLをサポートしているわけではなく、ほとんどのプロバイダはSSML仕様で定義されている一部のタグのみをサポートしています。設定する際にはTTSプロバイダのSSMLガイドラインに従ってください。

## SSML

SSMLは引き続き完全にサポートされています。SynAnimおよびSSMLの使用の最も簡単な例：

```xml
<speak><uneeq:emotion_joy_normal />Hello!</speak>
```

以下は、AzureのSSMLをそのニューラルボイスの一つと共に使用した、より複雑な例です。複数のuneeq:タグを使用できること、またそれらは"voice"タグ内に配置されるが、"prosody"のように"voice"タグ内に含めることができる他の要素の外側に配置されることに注意してください。

```xml
<!-- Azure Speech Serviceで使用するSSMLコード - 音声合成のためのマークアップ言語 -->
<speak xmlns="http://www.w3.org/2001/10/synthesis" 
       xmlns:mstts="http://www.w3.org/2001/mstts" 
       xmlns:emo="http://www.w3.org/2009/10/emotionml" 
       version="1.0" xml:lang="en-US">
  
  <!-- セクション1: 挨拶と手を振る動作 -->
  <voice name="en-US-JennyMultilingualNeural">
    <uneeq:action_wavingcalm/><!-- アクション: 穏やかに手を振る動作を実行 -->
    Hey!<!-- 「やあ！」という挨拶 -->
  </voice>
  
  <!-- セクション2: 喜びの感情で歓迎の言葉 -->
  <voice name="en-US-JennyMultilingualNeural">
    <uneeq:emotion_joy_normal /><!-- 感情: 通常レベルの喜びを表現 -->
      <prosody rate="+5.00%" pitch="+2.00%" contour="(0%,-0%)">
        <!-- 音声調整: 話速を5%速く、ピッチを2%高く、イントネーションは平坦 -->
        <lang xml:lang="en-US">It's great to see you.</lang><!-- 「お会いできて嬉しいです」 -->
      </prosody>
  </voice>
  
  <!-- セクション3: 期待感を持った自己紹介 -->
  <voice name="en-US-JennyMultilingualNeural">
    <uneeq:emotion_anticipation_normal /><!-- 感情: 通常レベルの期待感を表現 -->
      <prosody rate="+5.00%" pitch="+2.00%" contour="(0%,-0%)">
        <!-- 音声調整: 話速を5%速く、ピッチを2%高く、イントネーションは平坦 -->
        <lang xml:lang="en-US">I'm Sophie.</lang><!-- 「私はソフィーです」 -->
      </prosody>
  </voice>
  
  <!-- セクション4: 強い喜びの感情で役割説明 -->
  <voice name="en-US-JennyMultilingualNeural">
    <uneeq:emotion_joy_strong/><!-- 感情: 強い喜びの感情を表現 -->
    I'm here to help out with some recommendations.<!-- 「いくつかのおすすめ情報をご案内します」 -->
  </voice>
  
  <!-- セクション5: 通常の喜びの感情で質問 -->
  <voice name="en-US-JennyMultilingualNeural">
    <uneeq:emotion_joy_normal /><!-- 感情: 通常レベルの喜びを表現 -->
      <prosody rate="+5.00%" pitch="+2.00%" contour="(70%, -0%) (80%,-30%) (100%,+50%)">
        <!-- 音声調整: 話速を5%速く、ピッチを2%高く、複雑なイントネーションパターンを適用
             - 文の70%地点では通常のピッチ
             - 文の80%地点ではピッチを30%下げる
             - 文の終わり(100%)ではピッチを50%上げる（質問のイントネーション） -->
        <lang xml:lang="en-US">How can I help today?</lang><!-- 「今日はどのようにお手伝いできますか？」 -->
    </prosody>
  </voice>
</speak>
```

### **各社のSSML仕様ページ**

| Azure Text to Speech  | <https://docs.microsoft.com/ja-jp/azure/cognitive-services/speech-service/speech-synthesis-markup?tabs=csharp> | SynAnim対応 |
| --------------------- | -------------------------------------------------------------------------------------------------------------- | --------- |
| Amazon Poly           | <https://docs.aws.amazon.com/ja_jp/polly/latest/dg/supportedtags.html>                                         | SynAnim対応 |
| Google Text-to-Speech | <https://cloud.google.com/text-to-speech/docs/ssml>                                                            |           |
| NAVER CLOVA Voice     | 未対応                                                                                                            |           |
| Watson Text to Speech | <https://cloud.ibm.com/docs/text-to-speech?topic=text-to-speech-ssml>                                          |           |
| CoeFont               | 未対応                                                                                                            |           |
| AITalk                | <https://www.ai-j.jp/manual/business/webapi/5/modules/Ssml.html>                                               |           |
| ReadSpeaker           | 一部対応（管理画面ログイン後にドキュメントがあります）                                                                                    |           |
| FutureVoice Crayon    | 付属資料に記載                                                                                                        | SynAnim対応 |

SSMLを使用している場合は、タグの中にビヘイビアタグが含まれていることを確認する必要があります。

```html
<speak>
 <uneeq:emotion_joy_normal />Good morning! What can I help you with today?
</speak>
```

<uneeq:behavior>タグと、TTSプロバイダがサポートしているSSMLタグと組み合わせることで、デジタルヒューマンの行動や発話に複数の効果を適用することができます。

### **Google TTSを使用する場合**

Google TTSを使用している場合、<uneeq:behavior>タグが他のSSMLタグの中に入れ子になっていないことを確認してください。さらに、<uneeq:behavior>タグは、タグの後ろに入れることが必要です。

```html
Google TTSを使ったSSMLの正しい使い方

<speak>
  <uneeq:emotion_surprise_normal />
  <prosody rate="high" pitch="+2st">This is how I speak when I’m excited!</prosody>
  <uneeq:emotion_joy_normal />
  <s>This is how I speak when I’m happy.</s>
</speak>
```

```html
Google TTSを使ったSSMLの間違った使い方

<speak>
    <s>
        <uneeq:emotion_surprise_normal />This is how I speak when I’m excited!
    </s>
    <s>
        <uneeq:emotion_joy_normal />This is how I speak when I’m happy.
    </s>
</speak>
```

### Azure TTSを使用する場合

SynAnimを動かすためにはAzure TTSを利用する必要があります。Azure TTSを利用する婆は下記の様に設定するとSSMLが利用できます。

```jsx
# 発話速度（話速）を半分にして、途中に650msの中断を入れる場合
<speak version="1.0" xmlns="http://www.w3.org/2001/10/synthesis" xmlns:mstts="https://www.w3.org/2001/mstts" xml:lang="ja-JP">
    <voice name="ja-JP-NanamiNeural">
        <prosody rate="-50%">This is
            <break time="650ms" />すごいですね！
        </prosody>
    </voice>
</speak>
```

```jsx
# 発話速度（話速）を10%上げて、カメラを顔にズームする場合
<speak version="1.0" xmlns="http://www.w3.org/2001/10/synthesis" xmlns:mstts="https://www.w3.org/2001/mstts" xml:lang="ja-JP">
    <voice name="ja-JP-NanamiNeural">
        <prosody rate="10%"><uneeq:custom_event name="camera_close_up" />いつもデジタルヒューマンコーヒーショップのご利用ありがとうございます。</prosody>
    </voice>
</speak>
```

```jsx
# 話者のStyleを変更する場合
<speak xmlns="http://www.w3.org/2001/10/synthesis" xmlns:mstts="http://www.w3.org/2001/mstts" xmlns:emo="http://www.w3.org/2009/10/emotionml" version="1.0" xml:lang="ja-JP">
    <voice name="ja-JP-NanamiNeural">
        <s />
            <mstts:express-as style="cheerful">uttrance_str（ここに発話するテキストが入る）</mstts:express-as>
        <s />
    </voice>
</speak>
```

### **その他のTTSプロバイダー**

Google TTSを使ったSSMLとは違った使い方が必要な場合があります。

```html
正しい使い方 例1
<speak>
  <amazon:domain name="conversational">
    <uneeq:emotion_surprise_normal />This is how I speak when I’m excited!
    <uneeq:emotion_joy_normal />This is how I speak when I’m happy
  </amazon:domain>
</speak>
```

```html
正しい使い方 例2
<speak>
    <s>
        <uneeq:emotion_surprise_normal />This is how I speak when I’m excited!
    </s>
    <s>
        <uneeq:emotion_joy_normal />This is how I speak when I’m happy.
    </s>
</speak>
```


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.digitalhumans.jp/ops/control/speech-control-ssml.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
