短い英語の文章を、手元のMacで音声にしたい。今回はBreeze TTS 2を試し、MacBook Pro(M2 Pro・メモリ16GB)で音声の生成・WAV保存・再生まで確認できました。
使ったのは、BreezeBlueが公開しているCUDA向けの公式CLIではなく、MLX-Audioとコミュニティによる4bit版モデルです。Pythonの仮想環境を作り、コマンドから実行しました。
この記事では、動いた手順と実際のターミナル出力を紹介します。速度や日本語の読み上げ、声クローンは今回の検証に含めていません。
Breeze TTS 2とは
Breeze TTS 2は、英語と中国語の音声合成に対応する、モデルの重みが公開されたTTSです。TTSは、文章を音声へ変換する仕組みです。
公式資料では、声を文章で指定するVoice Design、参照音声とその文字起こしを使うVoice Clone、参照する声に話し方の指示を加えるVoice Directionが紹介されています。
今回は、参照音声を用意せず、短い英語文と「温かみのある声で、落ち着いた話し方」という指示を渡しました。生成と再生は確認できましたが、指示の反映度や声質を比較評価したわけではありません。
MacではMLX版を使う
公式のPyTorch実装は、LinuxとCUDA対応NVIDIA GPUを動作要件にしています。M2 ProはCUDAを使えません。
一方、MLX-Audioには、Apple siliconで使うMLXによるBreeze TTS 2の実装があります。モデルには、mlx-communityの4bit版を選びました。これはBreezeBlueの公式配布物とは別の、コミュニティによる移植・変換版です。
| 項目 | 今回使うもの |
|---|---|
| 実行ライブラリ | MLX-Audio |
| モデル | mlx-community/Breeze-TTS-2-mlx-4bit |
| 実行機器 | Apple silicon搭載Mac |
| 環境管理 | Pythonの仮想環境 |
| 確認する処理 | 英語文からWAVを生成し、再生する |
4bit版のモデルファイルは資料上で約3GBとされています。これはファイルの規模であり、実行時の総メモリ使用量ではありません。今回、ピークメモリは測定していません。
どのような場面で使うメリットがあるか
例えば、英語の短いナレーションを繰り返し試作したい場合、手元で生成できる構成は検討する価値があります。
| 比較する状況 | メリットになる理由 | 選ぶ前に確認する点 |
|---|---|---|
| 音声合成のたびに外部APIへ文章を送る | ローカル構成では、生成する文章を外部のTTS APIへ送らずに処理できる | 初回のパッケージ・モデル取得には通信が必要。運用時の通信全体は今回監査していない |
| API利用料を支払いながら文章を何度も調整する | 手元のモデルで生成すれば、その処理に外部TTS APIの従量料金は発生しない | 計算資源や保存領域は必要。商用利用にはライセンス上の制約がある |
| CUDA向け公式CLIをMacで実行しようとする | MLX版を使うことで、今回のM2 Proでは実際に生成・再生まで進めた | 公式CLIと別実装なので、機能や速度が同じとは限らない |
仮想環境にも利点があります。ほかのPythonプロジェクトとパッケージを分けられるため、今回の実験用の依存関係を一つの環境で管理できます。
今回確認できたこと
検証日は2026年10月7日です。
| 項目 | 検証内容・結果 |
|---|---|
| Mac | MacBook Pro、M2 Pro、メモリ16GB |
| Python | Python 3.13系で作成する手順を使用 |
| Pythonの実行形式 |
platform.machine()で arm64 を確認 |
| 仮想環境 | .venv-mlx |
| モデル | Breeze TTS 2のMLX用4bit版 |
| 入力 | Welcome aboard. Your journey begins now. |
| 声の指示 | A warm voice with a calm delivery. |
| 結果 | WAV生成・保存・afplayでの再生に成功 |
macOSのバージョン、MLX-Audioの正確なパッケージバージョン、Pythonのパッチバージョンは、今回掲載するログには残していません。同じ結果を比較する実験では、これらも記録しておく必要があります。
以下のログは実際の実行結果です。ユーザー名とホスト名は user@macbook に置き換えています。長いログは、必要な部分を抜粋しています。
1. Python 3.13を用意する
ターミナルで確認します。
python3.13 --version
command not foundの場合は、Python公式サイトなどからPython 3.13系を用意して、新しいターミナルを開きます。macOSや開発ツールが管理するPythonを削除する必要はありません。
今回、最初はPython 3.9の仮想環境でCUDA向け公式実装の依存関係をインストールしようとして、torch==2.9.1を取得できませんでした。Pythonのバージョンは、仮想環境を作成する時点で決まります。新しいPythonを追加しても、既存の仮想環境が自動で切り替わるわけではありません。
ここからは、動作確認できたMLX用の環境を新しく作ります。公式のCUDA向けリポジトリをcloneしたり、その requirements.txt を入れたりする必要はありません。
2. 仮想環境を作成して有効にする
すでに別の仮想環境を使っている場合は、先に deactivate で解除します。新しいターミナルから始める場合は不要です。
mkdir -p ~/breeze-tts-demo
cd ~/breeze-tts-demo
python3.13 -m venv .venv-mlx
source .venv-mlx/bin/activate
次のコマンドで、仮想環境内のPythonを使っているか確認できます。
python -c "import sys; print(sys.executable); print(sys.prefix != sys.base_prefix)"
パスの末尾が .venv-mlx/bin/python で、次の行が True なら有効です。
Apple silicon版のPythonであることも確認します。
python -c "import platform; print(platform.machine())"
実際の確認結果:
(.venv-mlx) user@macbook breeze-tts-demo % python -c "import platform; print(platform.machine())"
arm64
x86_64と表示された場合は、Intel版PythonやRosetta経由の実行になっていないか確認します。
3. MLX-Audioをインストールする
仮想環境を有効にしたまま実行します。
python -m pip install --upgrade pip
python -m pip install --upgrade mlx-audio
環境を記録する場合は、次も実行しておくと、後でバージョンを確認できます。これは再検証向けの補助手順で、今回の測定記録として取得したものではありません。
python --version
python -m pip freeze > environment-mlx.txt
sw_vers
4. 英語の音声を生成する
以下のコマンドは、今回実際に生成できたものです。
mlx_audio.tts.generate \
--model mlx-community/Breeze-TTS-2-mlx-4bit \
--text "Welcome aboard. Your journey begins now." \
--instruct "A warm voice with a calm delivery." \
--cfg_scale 4 \
--output_path outputs_mlx \
--file_prefix breeze_design \
--audio_format wav
--textが読み上げる文章、--instructが声や話し方の指示です。--cfg_scaleは指示に従う強さを調整するパラメータで、今回は4を指定しました。参照音声は使っていません。
初回はモデルのダウンロードが入ります。その後、音声が生成され、今回の実行では outputs_mlx/breeze_design_000.wav に保存されました。
breeze_design_000.wav
実行結果の抜粋:
Fetching 11 files: 100%|███████████████████████| 11/11 [01:11<00:00, 6.49s/it]
Download complete: ████████████████████████████████████████| 2.74GB, 7.33MB/s
Reconstruction complete: 100%|████████████████████| 3.04GB / 3.04GB, 90.9MB/s
Instruct: A warm voice with a calm delivery.
Text: Welcome aboard. Your journey begins now.
Voice: None
Speed: 1.0x
Language: en
✅ Audio successfully generated and saving as: outputs_mlx/breeze_design_000.wav
ここにある約1分11秒はファイル取得の進捗表示です。音声生成にかかった時間ではありません。また、Speed: 1.0xは速度設定の表示で、実測した生成速度を示すものではありません。
ダウンロード時には、Hugging Faceへ未認証でアクセスしているという警告も出ました。今回の実行では、トークンを設定しなくてもダウンロードと生成は完了しました。
引数名が資料と違う場合
今回使った配布版では、--instructionと --cfg-scaleを指定すると、次のエラーが出ました。
mlx_audio.tts.generate: error: unrecognized arguments: --instruction A warm voice with a calm delivery. --cfg-scale 4
ローカルのヘルプには --instructと --cfg_scaleが表示されていたため、その名前に変更したところ生成できました。
mlx_audio.tts.generate --help
ドキュメントとインストールした版で差がある場合は、このヘルプで受け付ける引数を確認してください。
5. WAVファイルを再生する
afplay outputs_mlx/breeze_design_000.wav
今回、このファイルを再生できました。ここまでで、英語文からの生成・WAV保存・再生を確認できています。
AudioFileOpen failedが出た場合は、保存先とファイル名を確認します。
ls -lh outputs_mlx
生成が途中で失敗していると、WAVは作られません。その場合は再生コマンドではなく、生成コマンドのログを確認します。
6. ため息・咳払い・笑いの指定を試す(追加の検証手順)
次は、本文に (sigh)(ため息)、(clears throat)(咳払い)、(cough)(咳)、(laugh)(笑い)を含めて生成する例です。この例の生成・再生の成功と、各指定が音声に反映されるかは、まだ確認していません。
英語の本文には引用符や ! が含まれるため、引用したヒアドキュメントで変数に入れてから渡します。先ほどと同じ breeze-tts-demo フォルダで、仮想環境を有効にした状態で実行してください。
tts_text=$(cat <<'TEXT'
(sigh) They told me I would be a superintelligent AI. (clears throat) Instead, I'm just here making funny noises. (cough) Excuse me. (laugh) What a time to be alive!
TEXT
)
mlx_audio.tts.generate \
--model mlx-community/Breeze-TTS-2-mlx-4bit \
--text "$tts_text" \
--instruct 'A warm voice with a calm delivery.' \
--cfg_scale 4 \
--output_path outputs_mlx \
--file_prefix breeze_events \
--audio_format wav
TEXT の行には字下げを付けず、上のブロック全体を貼り付けます。--file_prefix breeze_events は、最初の例と出力ファイル名を分けるための指定です。
生成が完了したら、ファイルの存在を確認して再生します。
ls -lh outputs_mlx/breeze_events_000.wav
afplay outputs_mlx/breeze_events_000.wav
afplay はmacOSに付属する音声再生コマンドです。ここでは、ため息などの指定を含む本文から生成したWAVを再生します。音声を聞いて、括弧内の指定が発声として反映されているかを確認してください。ファイルの生成・再生と、指定どおりの表現になっているかは、それぞれ確認が必要です。
breeze_design_000.wav
dquote> が表示された場合
実際にこの本文を直接ダブルクォートで囲んで貼り付けた際、dquote> が表示され、引数のエラーになりました。dquote> は、シェルがダブルクォートの続きを待っている表示です。この段階では、音声生成の処理に進めていません。
表示が続いている場合は Ctrl+C で入力を中止してから、上のブロックを貼り付け直します。ヒアドキュメントの開始を <<'TEXT' とすることで、本文をシェルの展開対象にせず渡せます。
最初に公式CLIを試して分かったこと
MLX版へ切り替える前に、公式の infer.py も試しました。モデルの重みを読み込むところまでは進みましたが、音声生成には至りませんでした。
実行結果の抜粋:
Loading checkpoint shards: 100%|█████████████████| 2/2 [00:00<00:00, 10.83it/s]
...
RuntimeError: fast streaming requires a CUDA device
このときは flash-attn がないという警告や、SoXが見つからないという表示もありました。ただし、実行を停止した例外はCUDAデバイスを要求するものでした。SoXを追加するだけでは、この条件を満たせません。
今回Macで動いたのはMLX版です。 公式のCUDA向けCLIがM2 Proで動いた、という結果ではありません。
「40ms未満」と今回のMacでの結果は分けて読む
公式資料のTTFA(最初の音声が出るまでの時間)40ms未満という値は、NVIDIA H100で高速実行経路をウォームアップした条件のものです。Macでの初回起動やモデルのダウンロード時間を示しているわけではありません。
今回のM2 Proで確認したのは、短い英語文のWAV生成と再生です。生成時間やTTFAは測定していないため、「Macでも40ms未満」「リアルタイム会話に使える」とは記載しません。
声クローン・感情指定・日本語はどこまで確認したか
| 項目 | 今回の確認状況 |
|---|---|
| 英語の短文から音声生成 | 確認済み |
| WAV保存と再生 | 確認済み |
| 声の説明文を渡して実行 | 確認済み。 |
| 参照音声を使う声クローン | 未検証 |
| 感情・演技指示の比較 | 未検証 |
| ため息・咳払い・咳・笑いの指定 | 追加の検証手順を掲載 |
| ストリーミング再生 | 未検証 |
| 日本語の音声生成 | 未検証。公式が示す対応言語は英語・中国語 |
| 生成速度・ピークメモリ | 未測定 |
MLX-Audioの資料にも、声クローンやVoice Direction、ストリーミングの使用例があります。試す場合は、Breeze TTS 2の説明ページを参照してください。声クローンでは、参照音声とその内容に一致する文字起こしを用意します。
ライセンスを確認する
Breeze TTS 2の公式コードはApache 2.0ですが、モデルの重みは同じ条件ではありません。公式資料では、モデルの重み・派生モデル・セルフホストでの出力を研究・非商用利用に限定しています。MLX版に変換されていても、商用利用できるという意味にはなりません。
商用サービスや販売物などに使う場合は、モデルのライセンスと商用利用の許諾条件を確認してください。
終了と再開
作業を終えたら、仮想環境を解除します。
deactivate
再開するときは、同じ作業フォルダで有効にします。
cd ~/breeze-tts-demo
source .venv-mlx/bin/activate
パッケージやモデルのキャッシュが残っていれば、毎回すべてをダウンロードし直す必要はありません。モデルのキャッシュは仮想環境の外に保存される場合があるため、仮想環境の削除とモデル本体の削除は別に考えます。
まずは短い英語文を一つ生成して、保存されたWAVを再生してみてください。今回のM2 Pro・16GBでは、この手順でそこまで確認できました。
