macOSでPersonal VoiceをPopClipから使う

macOS Sequoiaの「Personal Voice」は、自分の声を10文のテキスト読み上げだけでAIモデル化し、テキスト読み上げに使える機能だ。しかし、いざサードパーティアプリで使おうとすると壁にぶつかる。

使えるのは、AVSpeechSynthesizer APIを呼ぶアプリだけ。

macOSには二つのTTS APIがある。

一つはNSSpeechSynthesizer。calibreの読み上げなど、多くのサードパーティアプリが使っている旧APIだ。

もう一つはAVSpeechSynthesizer。Apple Books、Spoken Content(アクセシビリティの読み上げ機能)、Shortcutsの「Speak」アクション、そして現在のsayコマンドが使う新APIで、Personal Voiceにアクセスできるのはこちらだ。


問題:権限の壁

Personal Voiceを使うには、アプリごとに明示的な権限が必要だ。System Settings → Accessibility → Personal Voiceの「Allow applications to use your Personal Voice」に、許可されたアプリの一覧が表示される。

だがこの一覧には、手動でアプリを追加する方法がない。

アプリがAVSpeechSynthesizerを通じてPersonal Voiceをリクエストしたとき、初めてシステムが権限ダイアログを表示し、許可するとリストに追加される。つまり、アプリ側が対応していなければ、権限を与えようがない。


解決策:権限リクエストを自分で作る

このStack Overflowの回答にヒントがあった。

Objective-Cで数行のプログラムを書けば、任意のアプリのコンテキストからPersonal Voiceの権限リクエストを発火できる。

#import <AVFoundation/AVFoundation.h>
int main(){
    [AVSpeechSynthesizer
        requestPersonalVoiceAuthorizationWithCompletionHandler:
        ^(AVSpeechSynthesisPersonalVoiceAuthorizationStatus status){
            NSLog(@"Authorization status: %ld", (long)status);
            exit(0);
        }];
    [[NSRunLoop currentRunLoop] run];
    return 0;
}

コンパイル:

clang -framework AVFoundation -framework Foundation request_pv_auth.m -o request_pv_auth

TerminalでPersonal Voiceを使いたければ、Terminalから直接このバイナリを実行する。権限ダイアログが表示され、許可すれば以降sayコマンドでもPersonal Voiceが使える。


PopClipとの組み合わせ

ここからが本題だ。

PopClipにはテキスト読み上げの「Say」拡張がある。内部ではsayコマンドを呼んでいるだけだが、PopClipのシェルスクリプトはPopClip自身のプロセスとして実行される。つまり、権限の付与先はTerminalではなくPopClipになる。

やることは簡単だ。

ステップ1: 一回だけ権限を取得するためのPopClip拡張を作る。

以下のテキストを任意のテキストエディタにコピーし、全選択する。PopClipが自動的にインストールを提案する。これがPopClipの素晴らしいところだ——YAMLテキストを選択するだけで拡張がインストールできる。

# popclip
name: Request PV Auth
icon: 🔐
interpreter: zsh
shell script: ~/.local/bin/request_pv_auth

ステップ2: 適当なテキストを選択してこの拡張を実行する。権限ダイアログが表示されるので許可する。

ステップ3: 通常のSay拡張のVoice欄にPersonal Voiceの名前を入力する。名前はSystem Settings → Accessibility → Personal Voiceで確認できる。

以上。一回限りの権限取得拡張は、もう用済みだ。削除してもいい。


Shortcutsでも同じ手法が使える

同じ権限リクエストバイナリは、Shortcutsの「Run Shell Script」アクションからも実行できる。一度~/.local/bin/request_pv_authを実行すれば、Shortcuts自体にPersonal Voiceの権限が付与され、以降は「Speak」アクションでPersonal Voiceが選択可能になる。実験済み。

PopClipもShortcutsも、原理は同じだ。権限はプロセスの親アプリに対して付与される。シェルスクリプトをどのアプリから実行するかで、権限の付与先が変わる。


補足:音声ファイルへの保存

ネット上では「Personal Voiceは音声ファイルに書き出せない」という情報が見つかるが、実際にはsay -v "Personal Voice名" -o output.aiff "テキスト"で普通に保存できる。


補足:対応言語と安定性

2026年3月時点で、Personal Voiceが対応しているのは英語・中国語(普通話)・スペイン語のみ。日本語はまだ対応していない。Apple Intelligenceの日本語対応は進んでいるので、Personal Voiceの日本語対応も時間の問題だと思われるが、現時点では使えない。

また、Personal Voiceはすべての文章を安定して読み上げられるわけではない。特定の文や単語で突然音声が生成されないことがある。10文程度の少量データから作られたモデルなので、カバーしきれない発音パターンがあるのは仕方がない。


まとめ

Personal Voiceは、アクセシビリティのために生まれた機能だが、日常のテキスト読み上げにも十分使える。PopClipとの組み合わせで、ブラウザでもエディタでも、選択したテキストを自分の声で読み上げさせることができる。

必要なのは、5行のObjective-Cと、1回のクリックだけだ。


本記事のPersonal Voice権限リクエストの手法は、Stack Overflow(Ask Different)のこの回答に基づいています。

いいなと思ったら応援しよう!