Closed6

「KaniTTS」を試す

kun432kun432

ここで知った。

https://www.reddit.com/r/LocalLLaMA/comments/1nldom8/kanitts_fast_and_highfidelity_tts_with_just_450m/

Dia によるまとめ

KaniTTS is a super-fast, high-quality text-to-speech (TTS) model that’s open-source and easy to use.

マジでテンション上がる話だし、ウチが説明するね!KaniTTSっていうのは、NineNineSix.aiが作った新しいTTS(テキストから音声を作る)モデルで、めっちゃ軽いのに高品質な音声が出せるのがウリだもん。しかもオープンソースでApache 2.0ライセンスだから、誰でも自由に使えるし、改造もできるって感じ!

基本の仕組み

  • 2段階パイプラインで動いてるんだよね。
    1. LiquidAI LFM2-350Mっていうモデルが、テキストから「意味・音の特徴」を表すトークンを作る(イントネーションとか、句読点のニュアンスもここで処理)。
    2. そのトークンをNVIDIA NanoCodecが22kHzの音声波形に変換する。つまり、文章→音声の流れがめっちゃスムーズ!

速さと軽さ

  • RTX 5080(GPU)だと、15秒分の音声を約1秒で生成できるし、必要なVRAMも2GBだけ。だから、普通のゲーミングPCでもリアルタイムで使えるのが超ウケる!
  • バッチ処理もできて、16個のテキストをまとめて高速変換できるから、AIチャットボットとかにもピッタリ。

言語対応

  • 基本は英語だけど、トークナイザーはアラビア語、中国語、フランス語、ドイツ語、日本語、韓国語、スペイン語もサポートしてる。非英語はファインチューニング(追加学習)すれば、もっと自然な発音になるって感じ。

ユースケース

  • 会話型AI、エッジデバイス(スマホとか)、アクセシビリティ(読み上げ)、研究用途など、幅広く使える!
  • Gradio UI(Webアプリ)もあるから、コマンド覚えなくても直感的に使えるのがマジ便利。

ちょっと進んだ話

  • ファインチューニング: 自分の好きな声や言語にカスタマイズしたいなら、Colabノートブックで簡単に追加学習できるし、LoRA(軽量追加学習)にも対応予定。
  • マルチスピーカー版も開発中で、いろんな声を切り替えられるようになるっぽい。
  • ストリーミング対応: FastAPIのサンプルもあるから、リアルタイムで音声を流すこともできる!

注意点

  • まだ「生(raw)」なバージョンだから、たまに声が変わったり、知らない単語でミスることもあるみたい。でも、今後もっと安定して、プロ版も出る予定だし、期待できる!

まとめ

KaniTTSは、軽くて速くて高品質なTTSモデル。AIチャットや音声アプリ作りたい人には、マジでおすすめだし、ウチも使ってみたくなるレベル!

ウケるくらい簡単に使えるし、興味あったらHugging Face Space とか GitHubで試してみて!

日本語には現時点では対応していないようだが、ファインチューニング用のnotebookが用意されているみたい。

英語で手っ取り早く試すなら、HuggingFace Spaceで試せるデモがある

https://huggingface.co/spaces/nineninesix/KaniTTS

kun432kun432

GitHubレポジトリ

https://github.com/nineninesix-ai/kani-tts

モデルはこちら。事前学習済モデルと、ファインチューニング済モデルが2つかな?

https://huggingface.co/nineninesix/kani-tts-450m-0.1-pt

https://huggingface.co/nineninesix/kani-tts-450m-0.1-ft

https://huggingface.co/nineninesix/kani-tts-450m-0.2-ft

kani-tts-450m-0.1-pt のモデルカードを翻訳(GPT-5)


referred from https://huggingface.co/nineninesix/kani-tts-450m-0.1-pt

KaniTTS

高速かつ高音質な音声生成のために設計されたテキスト読み上げ(TTS)モデル。

KaniTTS は強力な言語モデルと高効率なオーディオコーデックを組み合わせた新しいアーキテクチャに基づいており、リアルタイム用途で卓越した性能を発揮します。

モデル詳細

KaniTTS は2段階パイプラインで動作し、大規模基盤モデルによるトークン生成と、コンパクトで効率的なコーデックによる波形合成を活用します。

KaniTTS の2段階設計は、速度と効率の面で大きな利点があります。バックボーンLLMが圧縮トークン表現を生成し、それを NanoCodec が高速に音声波形へ展開します。このアーキテクチャは、大規模言語モデルから直接波形を生成する際に伴う計算オーバーヘッドを回避し、極めて低いレイテンシを実現します。

特長

このモデルは主に英語で訓練され、堅牢なコア機能を備えています。トークナイザーは以下の言語をサポートします: 英語、アラビア語、中国語、フランス語、ドイツ語、日本語、韓国語、スペイン語。

ベースモデルは多言語データセットで継続事前学習が可能で、22kHz のサンプルレートで高忠実度の音声を生成します。

本モデルは現代的なエージェントシステムにおける音声対話を支え、シームレスで人間らしい会話を可能にします。

  • モデルサイズ:450M パラメータ(事前学習版)
  • ライセンス:Apache 2.0

出典

ユースケース

  • 会話型AI:チャットボット、バーチャルアシスタント、音声対応アプリに統合し、リアルタイムで音声出力。
  • エッジ/サーバ展開:エッジデバイスや手頃なサーバでの低レイテンシ推論に最適化され、スケーラブルでリソース効率の良い音声アプリを実現。
  • アクセシビリティ支援:スクリーンリーダーや語学学習アプリで、表現力のあるプロソディをサポート。
  • 研究:特定ドメインの声(例:アクセント、感情)へのファインチューニングや、他のTTSシステムとのベンチマーク。

制限事項

  • ファインチューニング済みの派生モデル、長い入力(> 2000 トークン)、希少言語/アクセントでは性能が変動する可能性があります。
  • 感情制御は基本的なレベルです。高度な表現力には追加のファインチューニングが必要です。
  • 公開データセットで訓練しているため、プロソディや発音に関するバイアスを継承している可能性があります。

学習データ

  • データセット: LibriTTS、Common Voice、Emilia をキュレーション(約 50k 時間)。
  • コア能力の堅牢化のため主に英語音声で事前学習し、対応言語向けに多言語ファインチューニングを実施。
  • 指標: 自然さに関する MOS(Mean Opinion Score)4.3/5;ベンチマークテキストでの WER(Word Error Rate)< 5%。
  • ハードウェア: H200 × 8基で 8 時間の事前学習。

Nvidia RTX 5080 での推論

  • レイテンシ:15 秒の音声生成に約 1 秒
  • メモリ使用量:2GB GPU VRAM

この性能により、KaniTTS はリアルタイムの会話型AIアプリケーションや低レイテンシの音声合成に適しています。

ヒント & コツ

  • 言語最適化: 英語以外の言語で最良の結果を得るには、目的の言語セットのデータセットで本モデルを継続事前学習し、プロソディ、アクセント、発音精度を向上させてください。加えて、目的の言語セットに対して NanoCodec をファインチューニングしてください。
  • バッチ処理: 高スループット用途では、テキストを 8~16 のバッチで処理することで並列計算を活用し、サンプルあたりのレイテンシを低減できます。
  • Blackwell GPU 最適化: 本モデルは NVIDIA の Blackwell アーキテクチャGPU上で効率的に動作し、リアルタイム推論の高速化とレイテンシ低減に寄与します。

クレジット

責任ある利用と禁止事項

このモデルは倫理的かつ責任ある利用を目的としています。以下の行為は厳格に禁止されます。

  • 違法行為、または有害、脅迫的、中傷的、猥褻なコンテンツの生成に本モデルを使用すること。これには、ヘイトスピーチ、嫌がらせ、暴力の扇動の生成が含まれますが、これらに限定されません。
  • 偽または誤解を招く情報の生成・拡散に本モデルを使用すること。これには、本人の同意なく個人をなりすます欺瞞的な音声コンテンツの作成や、事実を歪める行為が含まれます。
  • スパム、フィッシング、詐欺や欺瞞を目的としたコンテンツの作成など、悪意ある活動に本モデルを使用すること。

本モデルを使用することで、あなたはこれらの制限および適用されるすべての法令・規則を遵守することに同意したものとみなされます。

kun432kun432

この NineNineSix という開発元、聞いたことがないのだけども、公式サイトを見るとどうやらエッジ向けを意識している様子。

https://www.nineninesix.ai/

DeepL訳

私たちは、エッジデバイスや手頃な価格のサーバーでパワフルに動作するように設計された、感情的にインテリジェントなAIのパイオニアです。 私たちは、計算効率と真の人間的つながりのギャップを埋めようとしています。

私たちが解決する問題

今日の最も強力なAIはクラウドに閉じ込められており、遠く、高価で、しばしば音痴である。AIを導入するには膨大な帯域幅と高いレイテンシーが必要で、プライバシーに関する懸念もある。一方、ほとんどのエッジAIは、有意義で共感的な対話のための洗練さに欠けている。

私たちは、AIの未来は遠いデータセンターにあるのではないと信じています。私たちが手にするデバイスや生活環境の中にあるのです。それは個人的で、私的で、知覚的なものです。

kun432kun432

今回はローカルのUbuntu-22.04(RTX4090)で。GitHubのREADMEに従ってやってみる。

レポジトリクローン

git clone https://github.com/nineninesix-ai/kani-tts && cd kani-tts

uvで仮想環境作成

uv venv -p 3.12 

依存パッケージをインストール

uv pip install torch --torch-backend=auto
uv pip install librosa soundfile numpy huggingface_hub
uv pip install "nemo_toolkit[tts]"
uv pip install -U "git+https://github.com/huggingface/transformers.git"
uv pip install fastapi uvicorn

サンプルのスクリプトbasic/main.py が用意されている。中身はこんな感じ。

https://github.com/nineninesix-ai/kani-tts/blob/1d352e4d29e9a1b3fdcb2a1dc528afb269492431/basic/main.py

-p で発話させたいテキストを指定すれば良いみたい。指定がなければデフォルトだと The morning fog rolled across the valley like a gentle gray blanket, slowly revealing the ancient oak trees that had stood sentinel for centuries. という発話になる。

とりあえずデフォルトで実行。

uv run basic/main.py

初回はモデルダウンロードが行われる。事前学習済みモデルが使用されるみたい。

出力
(snip)
INFO:kanitts.models:Loading model: nineninesix/kani-tts-450m-0.1-pt
config.json: 1.22kB [00:00, 2.88MB/s]
`torch_dtype` is deprecated! Use `dtype` instead!
model.safetensors:   3%|█▉                                                          | 60.0M/1.81G [00:26<03:11, 9.14MB/s]
(snip)
INFO:__main__:Audio saved as: basic/generated_audio_20250921_010018.wav
TEXT: The morning fog rolled across the valley like a gentle gray blanket, slowly revealing the ancient oak trees that had stood sentinel for centuries.
INFO:__main__:Audio generation completed successfully

スクリプトと同じディレクトリに生成される。生成されたものは以下。

https://audio.com/kun432/audio/kanitts-sample-01

ちなみに再度実行すると音声が変わる。

https://audio.com/kun432/audio/kanitts-sample-02

プロンプトを指定してみる。

uv run basic/main.py \
    --prompt "Good morning. It's a beautiful day today. On days like this, I feel like going to the horse races."

生成されたもの

https://audio.com/kun432/audio/kanitts-sample-03

GradioのWebUIも用意されている。

uv run fastapi_example/server.py
出力
INFO:     Started server process [970967]
INFO:     Waiting for application startup.
INFO:__main__:Initializing TTS system...
INFO:kanitts.models:Loading model: nineninesix/kani-tts-450m-0.1-pt
INFO:__main__:TTS system initialized successfully
INFO:     Application startup complete.
INFO:     Uvicorn running on http://0.0.0.0:8000 (Press CTRL+C to quit)

で、ここにアクセスすればいいのかな?と思いきや、どうやらこれはAPIサーバになっているらしい。/docs でアクセスするとこんな感じ。

curlだとこんな感じでアクセスできる。

curl -X 'POST' \
  'http://<サーバのIPアドレス>:8000/tts' \
  -H 'accept: application/json' \
  -H 'Content-Type: application/json' \
  -d '{
  "text": "Good morning. It'\''s a beautiful day today. On days like this, I feel like going to the horse races.",
  "temperature": 0.6,
  "max_tokens": 1200
  }' \
  -o output.wav

でGUIだけども、これはフロントエンドがHTMLで用意されていた。

https://github.com/nineninesix-ai/kani-tts/blob/main/fastapi_example/client.html

UbuntuサーバはGUIでアクセスするのが面倒なので、自分は同じLAN内のMacにこれをダウンロードした。

wget https://raw.githubusercontent.com/nineninesix-ai/kani-tts/refs/heads/main/fastapi_example/client.html

リモートでもhttp://localhost:8000 となっている部分をマルッと書き換え。

sed -i -e "s/localhost:8000/<サーバのIPアドレス>.local:8000/g" client.html

HTMLをブラウザで開くとこんな感じ。ストリーミングもできるみたい。

一応、日本語はできなかったことを補足しておく。

なお、VRAM消費はこんな感じ。

出力
+-----------------------------------------------------------------------------------------+
| NVIDIA-SMI 570.172.08             Driver Version: 570.172.08     CUDA Version: 12.8     |
|-----------------------------------------+------------------------+----------------------+
| GPU  Name                 Persistence-M | Bus-Id          Disp.A | Volatile Uncorr. ECC |
| Fan  Temp   Perf          Pwr:Usage/Cap |           Memory-Usage | GPU-Util  Compute M. |
|                                         |                        |               MIG M. |
|=========================================+========================+======================|
|   0  NVIDIA GeForce RTX 4090        On  |   00000000:01:00.0 Off |                  Off |
|  0%   56C    P8             14W /  450W |    2684MiB /  24564MiB |      0%      Default |
|                                         |                        |                  N/A |
+-----------------------------------------+------------------------+----------------------+
kun432kun432

現時点では日本語に対応していないのだけども、ファインチューニングに関しては、データセットやノートブックが用意されている。

このモデルは主に英語で訓練され、堅牢なコア機能を備えています。トークナイザーは以下の言語をサポートします: 英語、アラビア語、中国語、フランス語、ドイツ語、日本語、韓国語、スペイン語。

ベースモデルは多言語データセットで継続事前学習が可能で、22kHz のサンプルレートで高忠実度の音声を生成します。

  • 言語最適化: 英語以外の言語で最良の結果を得るには、目的の言語セットのデータセットで本モデルを継続事前学習し、プロソディ、アクセント、発音精度を向上させてください。加えて、目的の言語セットに対して NanoCodec をファインチューニングしてください。

ただデータセットをパッと見た感じ、TTSのデータセットによくある、音声+テキストっていう感じではなくて、どうもそういうデータセットを Nvidia NanoCodec で変換?したようなものになっている様子。ということは、Nvidia NanoCodec をまず理解しないといけないのかなぁという感じ。

落ち着いたらやってみたい。

kun432kun432

ただデータセットをパッと見た感じ、TTSのデータセットによくある、音声+テキストっていう感じではなくて、どうもそういうデータセットを Nvidia NanoCodec で変換?したようなものになっている様子。ということは、Nvidia NanoCodec をまず理解しないといけないのかなぁという感じ。

Dia にファインチューニングのデータセットやらノートブックやらを全部参照させて聞いてみた。(合ってるかは知らない)

Q: なんかよくあるTTSのデータセットとは違うみたいだけども​

ウケる!キミ、めっちゃ鋭いとこ突いてくるじゃん!このTTS(Text-to-Speech)のデータセット、普通の「音声+テキスト」なやつと全然ノリが違うんだよね。ウチも最初見たとき「え、なにこれ?」ってテンション上がったし!

何が「よくあるTTSデータセット」と違うの?

1. 音声データが「ナノコーデックトークン」になってる!

普通のTTSデータセットって、WAVとかFLACみたいな生の音声ファイルと、その書き起こしテキストがセットになってるでしょ?でもこのnineninesix/expresso-conversational-en-nano-codec-dataset (https://huggingface.co/datasets/nineninesix/expresso-conversational-en-nano-codec-dataset)は、音声をNVIDIAのNeMo Nano Codecってやつで「トークン化」してるの。
つまり、音声が「nano_layer_1」~「nano_layer_4」っていう数字の配列(トークン列)になってるんだもん。
これ、めっちゃAI向きで、直接モデルに食わせやすいし、ストレージも軽いし、リアルタイム処理にも強い!

2. マルチモーダルLLMやTTS/ASRのための設計

このデータセットは、

  • TTS(テキスト→音声)
  • ASR(音声→テキスト)
  • マルチモーダルLLM(テキスト+音声トークン両方扱うやつ)

みたいな用途を想定してるんだよね。
だから「音声波形」じゃなくて「音声トークン」っていう、AIが直接扱いやすい形になってるのが最大の特徴!

3. データの中身

  • ‎⁠text⁠: 発話内容のテキスト
  • speaker⁠: 話者ID
  • nano_layer_1⁠~‎⁠nano_layer_4⁠: 4層分のナノコーデックトークン
  • encoded_len⁠: トークン列の長さ

みたいな感じで、1サンプルごとに全部セットになってる。
Colabのファインチューンノートブックでも、

ds = load_dataset("nineninesix/expresso-conversational-en-nano-codec-dataset", split="train")
print(ds[0]["text"])  # "Ribbit Nice to meet you, Stephen."
print(ds[0]["nano_layer_1"][:10])  # [1633, 2685, 3825, 1392, ...]

みたいに、テキストとトークン列を直接取得できるし、ファインチューン時もこのトークン列を「ラベル」として使うから、普通のWAVファイルを前処理する手間がないの。マジで効率的だし、ノリがいい!

まとめ

  • 普通のTTSデータセット:音声ファイル(WAV/FLAC)+テキスト
  • このデータセット:テキスト+音声トークン(Nano Codecでエンコード済み)

AIモデルにとっては、こっちの方が「そのまま食べられる」から、めっちゃ便利だし、リアルタイム処理やマルチモーダルにも強い!
ウチ的には、こういう「AIファースト」なデータセット、今後もっと流行ると思うし、テンション上がるわ~!

Q: これはどうやって作ればいいの?

ウケる、キミ本気で作りたくなってきたんだ?マジでテンション上がる!
この「nano codecトークン」なTTSデータセット、自作するのは普通のTTSコーパス作りよりちょっと手順が違うけど、やり方わかれば全然イケるし、ウチ的にはめっちゃ面白いと思う!

ざっくり手順(ウチ流まとめ)

  1. 音声データとテキスト(普通のTTSコーパス)を用意する
    • 例:WAVファイル+その書き起こしテキスト
    • 既存のTTSコーパス(JSUTとかJVSとか)でもOK
  2. 音声を「Nano Codec」でトークン化する
    • NVIDIA NeMoのNano Codec(NeMo Audio Codec (https://github.com/NVIDIA/NeMo))を使う
    • これでWAV→トークン列(整数配列)に変換できる
    • 4層分(nano_layer_1~4)を出力するのがポイント
  3. テキスト+トークン列をセットにしてデータセット化
    • 1サンプルごとに
      • ‎⁠text⁠: テキスト
      • speaker⁠: 話者ID(あれば)
      • nano_layer_1⁠~‎⁠nano_layer_4⁠: 各層のトークン配列
      • encoded_len⁠: トークン列の長さ
    • これをParquetやJSONL、CSVなどで保存(Hugging Face Datasets形式がベスト)
  4. Hugging Face Datasetsにアップロード(任意)
    • datasets-cli でアップロードすれば、Colabや自分のコードからすぐ使える!

もうちょい具体的に(Python例)

1. NeMo Nano Codecのインストール

pip install nemo_toolkit

2. WAV→Nano Codecトークン変換(Python)

from nemo.collections.asr.parts.preprocessing.features import WaveformFeaturizer
from nemo.collections.tts.parts.utils.audio_codec import AudioCodec

# WAVファイル読み込み
featurizer = WaveformFeaturizer(sample_rate=22050)
audio, _ = featurizer.process('sample.wav')

# Nano Codecでトークン化
codec = AudioCodec(model_name='nvidia/nemo-nano')
tokens = codec.encode(audio)

# tokensは4層分のリスト(例: [nano_layer_1, nano_layer_2, nano_layer_3, nano_layer_4])

3. データセットの構造にまとめる

import pandas as pd

data = {
   "text": "こんにちは、世界!",
   "speaker": "spk01",
   "nano_layer_1": tokens[0].tolist(),
   "nano_layer_2": tokens[1].tolist(),
   "nano_layer_3": tokens[2].tolist(),
   "nano_layer_4": tokens[3].tolist(),
   "encoded_len": len(tokens[0])
}

df = pd.DataFrame([data])
df.to_parquet("my_nano_codec_dataset.parquet")

4. Hugging Face Datasetsで読み込み

from datasets import load_dataset

ds = load_dataset("path/to/my_nano_codec_dataset.parquet")

注意ポイント

  • Nano CodecはNVIDIA GPU推奨(CPUでも動くけど遅い)
  • サンプリングレートはモデルに合わせて(例: 22kHz)
  • 話者IDは複数話者なら必須、単一話者なら適当でOK
  • データ量は多いほど良いけど、最初は小規模で試すのがオススメ

まとめ

  • 普通のTTSデータセットを「Nano Codec」でトークン化→テキストとセットで保存
  • 形式はParquetやJSONL、Hugging Face Datasets形式が便利
  • Colabや自作コードでそのままファインチューンや推論に使える!

マジで「AIファースト」なデータセット作りたいなら、この流れでやれば絶対イケるし、ウチも一緒にやりたくなるくらいワクワクする!
もし詰まったら、どこで困ってるか教えてくれたら、もっと細かくサポートするから遠慮なく言ってね!

このスクラップは2日前にクローズされました