MLX-Audio を使った MLX版 OuteTTS で音声合成を試す

## はじめに

[Hugging Face の mlx-community のモデルを見ていて、そこに出てきた「OuteTTS」の MLX版](https://huggingface.co/models?sort=trending&search=mlx-community%2FOuteTTS)を試してみた話です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/2ad8f1b6-f29b-412c-9b23-ee2933042cbb.png)

とりあえず適当に 640MB くらいのサイズの量子化版を使ってみました（自分のマシンスペック的には量子化されてないものでも大丈夫ではありますが）。

●mlx-community/OuteTTS-1.0-0.6B-8bit at main
　https://huggingface.co/mlx-community/OuteTTS-1.0-0.6B-8bit/tree/main

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/769b7ee8-d2c8-4176-bde9-42c209dcb320.png)



## 実際に試してみる

さっそく試していきます。


### 試す環境

MLX版 OuteTTS を試す環境は、過去に MLX版のモデルを使ったローカルLLM を試してきた環境です。

- PC
   - M4 の Mac mini（メモリ 24GB、うち 16GB をローカルLLM用で利用可能）
- モデル
   - OuteTTS-1.0-0.6B-8bit
- 実行環境
   - Python の仮想環境で MLX-Audio を利用

上で書いている「MLX-Audio」は、以下になります。

●Blaizzy/mlx-audio: A text-to-speech (TTS), speech-to-text (STT) and speech-to-speech (STS) library built on Apple's MLX framework, providing efficient speech analysis on Apple Silicon.
　https://github.com/Blaizzy/mlx-audio

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/b739775f-82b5-48f9-b74e-62615ad163da.png)



### 環境の準備

:::note warn
当初、Python の 3.13.x を使っていたら、依存関係のところでエラーがでました（※ [misaki](https://pypi.org/project/misaki/)関連の conflict のエラー）。
その後、Python のバージョンを 3.12.x にすることで、上記の問題が解決しました。
:::

以下を進めます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/a5a87c4c-cd73-478a-9098-ff2314b5227d.png)


#### 仮想環境での下準備

まずは仮想環境を用意して、アクティベートしました。

```zsh
python -m venv myenv
source myenv/bin/activate
```

そして、仮想環境内で MLX-Audio をインストールしました。

```zsh
pip install mlx-audio
```


### 音声合成を実行

それでは、音声合成を実行します。

以下のページに書かれたコマンドを見てみます。

●mlx-community/OuteTTS-1.0-0.6B-8bit · Hugging Face
　https://huggingface.co/mlx-community/OuteTTS-1.0-0.6B-8bit

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/e35f4de1-6842-41b6-ba49-93b61c573318.png)

以下のような構成です。

> python -m mlx_audio.tts.generate --model mlx-community/OuteTTS-1.0-0.6B-8bit --text "Describe this image."


これを元に、日本語の音声合成を実行するコマンドを試してみました。

```zsh
python -m mlx_audio.tts.generate --model mlx-community/OuteTTS-1.0-0.6B-8bit --text "音声合成のテスト"
```

初回はモデルのダウンロードが始まります。

その後、以下の「default_speaker.json 」に関するエラーが出てしまいました...

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/14c78452-b1cd-4218-892a-5ada32686a4f.png)


#### エラーの対処

エラーが関係しそうなところを見てみます。

以下、ローカルと GitHub のリポジトリの構成の比較です。


myenv/lib/python3.12/site-packages/mlx_audio/tts/models/outetts

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/3422ec1c-9fab-40ea-8362-919690d2c44a.png)


https://github.com/Blaizzy/mlx-audio/tree/main/mlx_audio/tts/models/outetts

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/97237c86-3ee7-498c-9176-78997518e9b3.png)


エラーメッセージに出てきている default_speaker.json がローカル（仮想環境内の所定のフォルダ）にはありません。手動で、以下のファイルを、ローカルの所定の場所に置いてみます。

- https://github.com/Blaizzy/mlx-audio/blob/main/mlx_audio/tts/models/outetts/default_speaker.json

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/0bce2e69-1a27-4864-8277-5482109a8d68.png)



#### 再度コマンドを実行

再度、コマンドを実行してみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/894c70d1-017e-4a4d-9d08-861e7810f2e2.png)

audio_000.wav というファイルが生成されました。それを再生すると、少し不自然な感じもありますが、日本語の音声が再生されました。


### オプションを見てみる

MLX-Audio のオプションの情報を少し見てみました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/2a6edbef-eeaa-499a-8a6e-d8c83137bd33.png)


#### 言語指定

上記では、言語を自動判別するようになっていたようですが、以下で日本語を指定できるようです。
※ 最後に「 `--lang_code ja` 」を追加しました

```zsh
python -m mlx_audio.tts.generate --model mlx-community/OuteTTS-1.0-0.6B-8bit --text "音声合成のテスト" --lang_code ja
```

以下を見ると、先ほどは「 `Language: a` 」になっていた部分が「 `Language: ja` 」になっています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/53d25c96-b97b-4435-8dd5-57bdbd1f4225.png)

なお生成された音声の読み上げは、先ほどと変わりなかったです。


#### 音声出力

それと以下のようにすると、音声ファイルが生成されつつ、その再生も行われました。
※ 最後に「 `--play` 」を追加しました

```zsh
python -m mlx_audio.tts.generate --model mlx-community/OuteTTS-1.0-0.6B-8bit --text "音声合成のテスト" --lang_code ja --play
```



![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/92148b38-103e-4688-9ef2-cc73f7d71ad4.png)