0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

M2 Pro・16GBのMacでBreeze TTS 2を動かす。仮想環境とMLXで英語音声を生成してみた

0
Posted at

eyecatch.jpg

短い英語の文章を、手元の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では、この手順でそこまで確認できました。

参考資料

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?