見出し画像

[iOS 17] 音声合成に自分の声を利用する #WWDC23

iOS 17では、自分の声(パーソナルボイス)を利用した音声読み上げ(音声合成)が可能になりました。

これについて触れられているWWDC23のセッションは"Extend Speech Synthesis with personal and custom voices"です。

本記事ではパーソナルボイスの利用方法について書いていきます。末尾にサンプルコードも添付します。


Personal Voice (パーソナルボイス)

iOS 17ではPersonal Voiceという新機能が追加されました。自分が話したいテキストをタイプして自分の声で読み上げてもらうことができるようになります。

これは開発者向けに限定した話ではなく、「アクセシビリティ」の一機能として提供されるものです。

なお、現段階ではPersonal Voiceは英語のみサポートされています。

システムで言語設定を英語にした後に、
[Settings] -> [Accessibility] -> [Personal Voice]
から、自身のパーソナルボイス作成を行うことができます。

"Extend Speech Synthesis with personal and custom voices"より

なお、セキュリティにもしっかり配慮されており、パーソナルボイスは基本的にオンデバイスでのみ取り扱われます。生成もサーバーではなくデバイス上で行われます。

Your Personal Voice is generated on the device and not on a server. (パーソナルボイスは、サーバーではなく、デバイス上で生成されます。)

"Extend Speech Synthesis with personal and custom voices"より

パーソナルボイスをアプリで利用するための最小実装

今回、iOS / macOS / watchOSで利用可能な音声合成APIである AVSpeechSynthesizer でこのパーソナルボイスの利用が可能となりました。

利用するには、`requestPersonalVoiceAuthorization` という新メソッドを利用します。

let status = await AVSpeechSynthesizer.requestPersonalVoiceAuthorization()
guard status == .authorized else { fatalError() }
personalVoice = AVSpeechSynthesisVoice.speechVoices().filter { $0.voiceTraits.contains(.isPersonalVoice) }.first

新しい部分としてはこれだけです。

あとは従来通り、AVSpeechUtterance の voice プロパティに取得したパーソナルボイスの AVSpeechSynthesisVoice オブジェクトをセットし、AVSpeechSynthesizer で speak するだけです。

utterance.voice = personalVoice
synthesizer.speak(utterance)

なお、requestPersonalVoiceAuthorization メソッドには非async版もあります。

AVSpeechSynthesizer.requestPersonalVoiceAuthorization() { status in
    guard status == .authorized else { fatalError() }
    self.personalVoice = AVSpeechSynthesisVoice.speechVoices().filter { $0.voiceTraits.contains(.isPersonalVoice) }.first
}

"Personal voice usage is not allowed in apps" エラーの対処法

そもそもこのエラーが出る前に requestPersonalVoiceAuthorization を実装したときに反射的に Info.plist に "Privacy - xxxx" 系のキーを追加しに行ったのですが、どうやらパーソナルボイス利用に関してはその必要はないようです。

しかし実行すると requestPersonalVoiceAuthorization() のところでパーミッションを求めるダイアログは現れず、

Personal voice usage is not allowed in apps

というエラーがコンソールに出力されます。返ってくる status ももちろん .authorized ではありません。

調べたところ、

[Settings] -> [Accessibility] -> [Personal Voice]
にて、"Allow Apps to Request to Use"をオンにする必要がありました。

これで無事パーソナルボイスへのアクセス許可を求めるダイアログが出てくるようになります。

サンプル

  • 事前にPersonal Voiceの生成を行ってください

  • 上述したとおり、"Allow Apps to Request to Use"をオンにしてください

なお、2023年6月15日 AM7:00 現在、手元でまだPersonal Voiceの生成が終わっておらず、完全な動作確認ができていません。完了したらまた更新します..

(追記)本サンプルを実行した動画はこちら:

ここから先は

0字
WWDC23だけでなく、WWDC22についても書いていきます。

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

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