見出し画像

SSMLで合成音声をマークアップする #WWDC23

WWDC23の"Extend Speech Synthesis with personal and custom voices"がかなり面白かった。

AVFoundationに音声合成APIである AVSpeechSynthesizer / AVSpeechUtterance が追加されて久しいが、今回いろいろとアップデートがあったようだ。

音声合成プロバイダやパーソナルボイスの利用といったところはまた別記事に書くとして本記事ではSSMLについて書く。

SSMLとは

SSMLはSpeech Synthesis Markup Languageの略で、様々なタグや属性を持つXML形式を用いて音声をマークアップする言語のこと。W3Cによって標準化されている。

これらのタグを用いて、速度やピッチ等を制御することができる。

<speak>
    Hello
    <break time="1s"/>
    <prosody rate="200%">nice to meet you!</prosody>
</speak>

多くの音声合成ソフトの標準入力となっているとのこと。

AVSpeechUtteranceの新API

iOS 16(※ iOS 17の新APIではない)でAVSpeechUtterance に `init(ssmlRepresentation:)` というイニシャライザが追加され、iOSの合成音声をマークアップに従って制御できるようになった。

init?(ssmlRepresentation string: String)

引数にSSMLの文字列を渡すだけ。

(参考までに、AVSpeechSynthesizerの似たようなアップデートとして、5年ほど前にこういうのもあった↓)

実装例

"Hello… nice to meet you!" をSSMLによりマークアップし、AVSpeechSynthesizerで読み上げるコードは以下の通り:

let ssml = """
    <speak>
        Hello
        <break time="1s" />
        <prosody rate="200%">nice to meet you!</prosody>
    </speak>
"""

let utterance = AVSpeechUtterance(ssmlRepresentation: ssml)!

synthesizer.speak(utterance)

このサンプルのSSMLでは以下のことをやっている

  • "Hello"の後にbreakタグで1秒の間を入れる

  • "nice to meet you!" に prosodyタグを追加し、rate を200%にすることでスピードアップ

サンプルコード

通常の読み上げと、SSMLを用いた読み上げの比較サンプル:

ここから先は

0字 / 1ファイル
WWDC23だけでなく、WWDC22についても書いていきます。

WWDC 2023やiOS 17についてセッションやサンプルを見つつ勉強したことを記事にしていくマガジンです。また昨年キャッチアップをお休…

最後まで読んでいただきありがとうございます!もし参考になる部分があれば、スキを押していただけると励みになります。 Twitterもフォローしていただけたら嬉しいです。 https://twitter.com/shu223/