iOS
avfoundation
自然言語処理
人工知能
Swift

iOSの音声合成の発話を自在にカスタマイズする - AVSpeechUtteranceとNSAttributedString

WWDC18で、「AVSpeechSynthesizer: Making iOS Talk」というタイトルのセッションがあり、

Screen Shot 2018-06-09 at 18.11.55.png

AVSpeechUtteranceNSAttributedStringを指定するイニシャライザの使い方が解説されていました。

init(attributedString string: NSAttributedString)

長らく使い方が謎だった機能

このメソッドはiOS 10で追加されたものなのですが、2016年当時、あれやこれやのAttributeを指定してみて読み上げ音声が変わるかどうかを試したのですが、何も音声に変化がなく、それから約2年間、ずっと使い方が謎なままでした。

AVSpeechSynthesisIPANotationAttribute

WWDC18の「AVSpeechSynthesizer: Making iOS Talk」ではこのようなコードが示されています。

let attributedString = NSMutableAttributedString(string: "Hello iPhone")
attributedString.addAttribute(.accessibilitySpeechIPANotation, value: "ˈa͡ɪ.ˈfo͡ʊn", range:
NSRange(location: 6, length: 6)))
let utterance = AVSpeechUtterance(attributedString: attributedString)

この.accessibilitySpeechIPANotationAVSpeechUtteranceNSAttributedStringに指定できる属性のキーのようで、ドキュメントは以下にあります。

が、このドキュメント、何も書かれていません

Screen Shot 2018-06-09 at 17.57.42.png

なので、このWWDC18のセッションが超有用なわけです。スライドp17に次のように利用可能な言語、利用例が書かれています。

- Available—en-US, en-AU, en-GB, de-DE, es-ES, es-MX, fr-CA, fr-FR, it-IT, ja-JP
- Example—iPhone = ˈa͡ɪ.ˈfo͡ʊn

ja-JPということで日本語も対応しています。

IPA notationとは

IPAとはなんぞやとググってみると、「International Phonetic Alphabet」の略で、

The International Phonetic Alphabet (IPA) is an alphabetic system of phonetic notation based primarily on the Latin alphabet.

(https://en.wikipedia.org/wiki/International_Phonetic_Alphabet)

とのことです。「読み」を言語に依らず標準的に記述するための表記法、と私は解釈しました。

どう嬉しいのか

この記法のノーテーションをAVSpeechUtteranceの発話文字列の属性として渡してやることで、「読み」を自在にカスタマイズ可能になる、といえます。

固有名詞などはなかなか期待通りに読んでくれないので、このカスタマイズができるというのは大変有用なのではないでしょうか。

そもそも自前で多言語対応の音声合成エンジンを開発することは容易ではなく、多くのサードパーティ製は多言語でなかったり有償だったり品質がいまいちだったりしますし、標準のものがこういうカスタマイズ制を持っているということを知っていることはとても重要だと個人的には思います。

IPA notationをどのように取得するか

先程紹介したスライドに"iPhone"の発音をIPAではˈa͡ɪ.ˈfo͡ʊnと記述するとありましたが、この記述はどうやって作成するのでしょうか?

iOSに既にその機能があります。

[Settings] > [General] > [Accessibility] > [Speech] > [Pronunciations]

と設定を深く辿っていくと、そのメニューがあります。ここで表記に対して実際の発音を自分で入力し、IPA notationを生成することができます。

サンプルのダウンロード

iOS 10からの機能なので、Swift 4.1, Xcode 9.4, iOS 10で動作するようにコードを書くと、こんな感じです。

attributedStr.addAttribute(NSAttributedStringKey(rawValue: AVSpeechSynthesisIPANotationAttribute), value: "tən.tən.mi", range: range)
let utterance = AVSpeechUtterance(attributedString: attributedStr)

すぐにビルドして試せるサンプルコードがこちらにあります。

関連記事