Zenn
🐕

(macOS)AVSpeechSynthesizerの読み上げ速度として設定可能な範囲は声の種類により異なる

に公開

はじめに

macOSについての話題です。お急ぎの方のため結論から。

  • AVSpeechSynthesizerの読み上げ音声はAVSpeechUtteranceで調整できます。
  • AVSpeechUtteranceにはrateプロパティがあり、読み上げの速度を設定できます。
  • rateの値として設定可能な範囲は以下の定数として宣言されています。
    • 最小値: let AVSpeechUtteranceMinimumSpeechRate = 0.0
    • 最大値: let AVSpeechUtteranceMaximumSpeechRate = 1.0
    • ほとんどの音声は0.0から1.0の範囲で速度が設定できると考えて差し支えありません。
  • しかし、音声によっては最大値の1.0より大きい値を設定できたり、最大値が1.0未満の場合があります。
    • 例: en-US Alex (Enhanced) の読み上げ速度は1.0より大きな値を設定できる。
    • 例: ja-JP Granmaの読み上げ速度は0.5が最大値であり、それ以上の値を設定しても無視される。
  • また、macOSのバージョンごとに読み上げ速度として設定可能な範囲が異なる場合があります。
    • en-US Samanthaの例:
      • macOS 12 Monterey以前: 0.0から0.89
      • macOS 13 Ventura以降: 0.0から1.0
  • 読み上げの速度として設定可能な範囲はドキュメント化されていません。利用する音声個別に動作を試すしかありません。

サンプルアプリ

AVSpeechSynthesizerの挙動を確認するためのサンプルアプリを作成しました。macOS 12 Monterey以上のmacOSで動作します。

https://github.com/moutend/MacAVSpeechSynthesizerDemo

読み上げ音声の比較

サンプルファイルを用意したので聴き比べてみてください。以下、ファイル名は<macOSのバージョン> AVSpeechSynthesizer <言語> <話者> <読み上げ速度>です。

(余談1)macOS 12 Montereyでの挙動

記事の冒頭で説明した、読み上げ速度の最大値が1.0ではない音声がある件についての補足です。

最大値が1.0ではない音声の場合、設定可能な最大値より大きな値を指定すると、その値は無視されます。

例えば、現在の読み上げ速度が0.5の状態で1.0を指定します。このとき、読み上げ速度は変化せず0.5のまま維持されます。

(余談2)macOS 13 Ventura以降のAVSpeechSynthesizerインスタンス作成時の挙動

読み上げ速度とは直接関係しませんが、AVSpeechSynthesizerインスタンス作成時の挙動が異なります。

  • macOS 12 Monterey以前: インスタンス作成直後にspeak()メソッドを実行しても即座に音声が読み上げされる。
  • macOS 13 Ventura以降: インスタンス作成直後にspeak()メソッドを実行すると1秒ほど待たされた後に音声が読み上げされる。その後はspeak()メソッドを実行すると即座に音声が読み上げされる。

この挙動はmacOS 13 Venturaにて音声合成エンジンがSpeech ManagerからAudio unit v3 Extension方式に変更されたのが原因です。

なおSpeech ManagerはmacOS 13 Venturaで廃止されたため、読み上げ音声の初期待ち時間を回避する方法はありません。反応の機敏さを重視するアプリを開発するなら、アプリ起動時に何か適当な音声を再生してホットスタンバイな状態にさせるしかなさそうです。

(余談3)sayコマンドの-r, --rateフラグについて

macOS 13 Venturaから音声合成エンジンの方式が変更されたことに伴い、AVSpeechSynthesizerと同様にsayコマンドの-r, --rateフラグによる読み上げ速度も若干変化しています。

ただし、sayコマンドの--rateフラグは1分間あたりに読み上げる単語数で読み上げの速度を指定する形になっています。AVSpeechUtteranceのrateプロパティとは異なり元から0.0 ... 1.0の範囲で正規化されていたわけではないので不都合はないかもしれません。

なお、macOS 13 Ventura以降のsayコマンドもAVSpeechSynthesizerと同様に初期化の待ち時間が発生します。say Helloのように、その場で読み上げた場合と、sayのみ実行してPTYの読み取り状態にした後に「Hello」を入力して音声を読み上げると待ち時間のさが確認できます。

(余談4)音質の違い

macOS 12 Monterey / iOS 15以前とmacOS 13 Ventura / iOS 16以降でAVSpeechSynthesizerの読み上げ音声の音質が異なります。

例えば日本語音声の場合、macOS 12以前のKyoko DefaultがmacOS 13 Ventural以降のKyoko Enhanced相当になります。つまり古いOSでは標準扱いだったものが高音質扱いになり、実質的に音質が低下しています。

これは単なる名前変更ではなく、音声合成エンジンが異なります。macOS 13以降のKyoko Enhanced音声は高音域に圧縮音声のようなざらつきを感じます。

なお、macOSに搭載されている日本語音声のKyokoはNuance Vocalizerからライセンスされた音声です。なぜAudio Unit v3 Extension対応で音質が劣化したのかは不明です。

参考資料

  1. AVSpeechSynthesizer – Apple Developer Documentation
  2. AVSpeechSynthesisVoice – Apple Developer Documentation
  3. AVSpeechUtterance – Apple Developer Documentation

Discussion

ログインするとコメントできます