WWDC18で、「AVSpeechSynthesizer: Making iOS Talk」というタイトルのセッションがあり、
AVSpeechUtterance
のNSAttributedString
を指定するイニシャライザの使い方が解説されていました。
init(attributedString string: NSAttributedString)
長らく使い方が謎だった機能
このメソッドはiOS 10で追加されたものなのですが、2016年当時、あれやこれやのAttributeを指定してみて読み上げ音声が変わるかどうかを試したのですが、何も音声に変化がなく、それから約2年間、ずっと使い方が謎なままでした。
iOS 10からAVSpeechUtteranceにNSAttributedStringを渡せるようになってて、これはきっと発声の抑揚とかを制御する用だ!って思ってboldにしたりしてみたけど何も変わらない。。何用なんだろう? https://t.co/FnSkiCYwyR
— Shuichi Tsutsumi (@shu223) 2016年9月11日
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)
この.accessibilitySpeechIPANotation
がAVSpeechUtterance
のNSAttributedString
に指定できる属性のキーのようで、ドキュメントは以下にあります。
が、このドキュメント、何も書かれていません。
なので、この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)
すぐにビルドして試せるサンプルコードがこちらにあります。