Snortts Indic V0
snorTTS-Indic-v0は、9種類のインド語の音声を生成できる多言語インド語音声合成(TTS)モデルです。
ダウンロード数 353
リリース時間 : 7/9/2025
モデル概要
このモデルは、ヒンディー語、タミル語、テルグ語、マラーティー語、カンナダ語、マラヤーラム語、パンジャーブ語、グジャラート語、ベンガル語を含む9種類のインド語の音声合成をサポートしています。音声クローン、コード切り替え、言語間音声クローン機能を備えています。
モデル特徴
多言語対応
9種類のインド語の音声合成をサポート
音声クローン
特定の話者の音声特徴をクローンできる
コード切り替え
同一の文で複数の言語を混合して使用することをサポート
言語間音声クローン
多言語音声移行機能を実現
モデル能力
音声合成
音声クローン
多言語混合音声生成
言語間音声移行
使用事例
音声アプリケーション
多言語音声アシスタント
インドの多言語ユーザーに音声対話サービスを提供
有声書籍制作
複数のインド語の有声コンテンツを生成
教育
言語学習ツール
学習者が複数のインド語の発音を練習するのを支援
🚀 snorTTS-Indic-v0
snorTTS-Indic-v0は、ヒンディー語、タミル語、テルグ語、マラーティー語、カンナダ語、マラヤーラム語、パンジャーブ語、グジャラート語、ベンガル語という9つのインド系言語で音声を生成できる多言語インド系テキスト・トゥ・スピーチ(TTS)モデルです。
👉 完全なブログ記事「Train a SoTA Multilingual Indic Text-to-Speech (TTS)」を読む ことで、このモデルの構築方法を学ぶことができます。
このプロジェクトで使用されたすべてのコード、データセット、モデル(ベースモデルとファインチューニングされたモデルの両方)は、誰でも利用し、拡張することができます。
✨ 主な機能
- TTS
- 声のクローニング
- コードスイッチング
- 多言語間の声のクローニング(多言語音声転送)
📚 ドキュメント
モデルの概要
項目 | 詳細 |
---|---|
アーキテクチャ | LLaMA-3.2-3B |
ベースモデル | canopylabs/3b-hi-pretrain-research_release |
オーディオコーデック | SNAC @ 24 kHz、3コードブック(12,288個の新しいトークン) |
言語 | ヒンディー語、グジャラート語、マラーティー語、パンジャーブ語、ベンガル語、テルグ語、カンナダ語、マラヤーラム語、タミル語 |
学習
学習とデータセットの詳細については、「Train a SoTA Multilingual Indic Text-to-Speech (TTS)」 を参照してください。
学習スクリプト (train_orepheus.py
) はこのリポジトリにあります。これはベースモデルをファインチューニングするための単一の自己完結型スクリプトです。
👉 学習に使用されたデータセット: snorbyte/indic-tts-sample-snac-encoded
推論
- Linux用の必要なライブラリをインストールします。
sudo apt update
sudo apt install -y sox libsox-dev
- Python 3.10を使用します。
- すでにtorchがインストールされている場合は、アンインストールします。unslothが管理します。
pip uninstall -y torch torchaudio
- 必要なパッケージをインストールします。
pip install unsloth loguru snac deepfilternet pydub soundfile librosa torchaudio
from unsloth import FastLanguageModel
from snac import SNAC
import soundfile as sf
import numpy as np
from loguru import logger
from df.enhance import init_df, enhance, save_audio
import torch
import librosa
import torchaudio
import os
#Name of the model
MODEL_NAME = 'snorbyte/snorTTS-Indic-v0'
MAX_SEQ_LENGTH = 4096
HUGGINGFACE_TOKEN = "" # ! Add your hugging face token
# Load the model and tokenizer.
model, tokenizer = FastLanguageModel.from_pretrained(
model_name=MODEL_NAME,
# load_in_4bit=True,
max_seq_length=MAX_SEQ_LENGTH,
token=HUGGINGFACE_TOKEN,
)
logger.success(f"Loaded model: {MODEL_NAME}")
# Load the end of speech token for the tokenizer.
tokeniser_length = 128256
end_of_speech_id = tokeniser_length + 2
pad_token_id = tokeniser_length + 7
audio_start_id = tokeniser_length + 10
pad_token = tokenizer.decode([pad_token_id])
logger.success("Load special tokens for the tokenizer.")
# Wrap Model for Inference
FastLanguageModel.for_inference(model)
logger.success(f"{MODEL_NAME} is ready for inference.")
# Set the padding token and padding side.
tokenizer.pad_token = pad_token
tokenizer.padding_side = "left"
logger.success("Set padding token and padding side for the tokenizer.")
# Load the SNAC model for audio decoding.
snac_model = SNAC.from_pretrained("hubertsiuzdak/snac_24khz")
logger.success("Loaded SNAC model for audio decoding.")
# Load DeepFilter for optional post processing
df_model, df_state, _ = init_df()
# Function to generate audio
def generate_audio(
row, model, tokenizer, user=False, temperature=0.4, top_p=0.9, repetition_penalty=1.05
):
try:
if user:
prompt = row["eval_text_user"]
else:
prompt = row["eval_text_no_user"]
inputs = tokenizer(prompt, add_special_tokens=False, return_tensors="pt")
max_tokens = MAX_SEQ_LENGTH - inputs.input_ids.shape[1]
output = model.generate(
input_ids=inputs.input_ids.to("cuda"),
attention_mask=inputs.attention_mask.to("cuda"),
max_new_tokens=max_tokens,
temperature=temperature,
top_p=top_p,
repetition_penalty=repetition_penalty,
eos_token_id=end_of_speech_id,
)
audio_ids = []
for id in output[0]:
if id >= audio_start_id:
audio_ids.append(id.item())
clean_audio_ids = []
for i in range((len(audio_ids) + 1) // 7):
for j in range(7):
clean_audio_ids += [audio_ids[7 * i + j] - audio_start_id]
codes = [[], [], []]
for i in range((len(clean_audio_ids) + 1) // 7):
codes[0].append(clean_audio_ids[7 * i])
codes[1].append(clean_audio_ids[7 * i + 1] - 4096)
codes[2].append(clean_audio_ids[7 * i + 2] - (2 * 4096))
codes[2].append(clean_audio_ids[7 * i + 3] - (3 * 4096))
codes[1].append(clean_audio_ids[7 * i + 4] - (4 * 4096))
codes[2].append(clean_audio_ids[7 * i + 5] - (5 * 4096))
codes[2].append(clean_audio_ids[7 * i + 6] - (6 * 4096))
codes = [
torch.tensor(codes[0]).unsqueeze(0),
torch.tensor(codes[1]).unsqueeze(0),
torch.tensor(codes[2]).unsqueeze(0),
]
try:
audio = snac_model.decode(codes)
except Exception as e:
logger.error(f"Error decoding audio: {e}")
return None
return audio.detach().squeeze().to("cpu").numpy()
except Exception as e:
logger.error(f"Error decoding audio: {e}")
return None
# Run inference.
# * Please refer to the training script to create prompt from SNAC tokens.
row = {
"eval_text_user": f"<custom_token_3><|begin_of_text|>kannada142: ಅಯ್ಯಯ್ಯೋ... Whitefield ಗೆ reach ಆಗೋಕೆ almost 10 hours ಆಯ್ತು you know... traffic was so terrible today <|eot_id|><custom_token_4><custom_token_5><custom_token_1>"
}
eval_sample = generate_audio(row, model, tokenizer, True)
if eval_sample is None:
logger.error("Failed to generate audio for evaluation sample.")
else:
logger.success("Audio Generated. Post Processing Started")
## post-processing settings
filename = "eval.wav"
speed = 1.05 #add speed up according to speaker
denoise = False #denoise if you want
output = eval_sample.astype(np.float32)
#speed up
if abs(speed - 1.0) > 1e-4:
output_t = torch.from_numpy(output).unsqueeze(0)
output_speed, _ = torchaudio.sox_effects.apply_effects_tensor(output_t, 24_000, effects=[["tempo", f"{speed}"]])
output = output_speed.squeeze(0).cpu().numpy()
#denoise
if denoise:
resampled_48k = librosa.resample(output, orig_sr=24_000, target_sr=48_000)
resampled_48k = torch.from_numpy(resampled_48k).unsqueeze(0)
output_48k = enhance(df_model, df_state, resampled_48k)
output_48k = output_48k.squeeze(0).cpu().numpy()
output = librosa.resample(output_48k, orig_sr=48_000, target_sr=24_000)
logger.success("Saving Final Output...")
#save
sf.write(filename, output, 24_000)
logger.success(f"Generated and saved evaluation sample audio as {filename}.")
プロンプト
標準プロンプト
{
"eval_text_no_user": f"<custom_token_3><|begin_of_text|>{utterance}<|eot_id|><custom_token_4><custom_token_5><custom_token_1>"
}
{
"eval_text_no_user": f"<custom_token_3><|begin_of_text|>நிச்சயமா. ரோம் ல் இரவு நேரம் ரொம்ப அழகா இருக்கு—piazzaகள் சுத்துறதுக்கு நல்ல நேரம்.<|eot_id|><custom_token_4><custom_token_5><custom_token_1>"
},
話者固有のプロンプト(推奨)
{
"eval_text_user": f"<custom_token_3><|begin_of_text|>{language}{speaker_id}: {utterance}<|eot_id|><custom_token_4><custom_token_5><custom_token_1>"
}
📝
utterance
は、話者の母国語、多言語、またはコードスイッチングされたテキストでも構いません。
{
"eval_text_user": f"<custom_token_3><|begin_of_text|>hindi159: चलते रहो इस सफर में बिना रुके, क्योंकि मंज़िलें खुद राह दिखाने लगती हैं <|eot_id|><custom_token_4><custom_token_5><custom_token_1>"
}
{
"eval_text_user": f"<custom_token_3><|begin_of_text|>bengali125: मुझे तो लगा वो आएगा, ஆனா அவன் வந்து full drama பண்ணிட்டான், আর শেষে আবার আমাকে দোষ দিচ্ছে <|eot_id|><custom_token_4><custom_token_5><custom_token_1>"
}
話者ID
言語 | 話者 | 推奨されるスピードアップ |
---|---|---|
ヒンディー語 | [159,49,43] | [1.05,1.1,1.1] |
タミル語 | [188,128,176] | [1.1,1.15,1.1] |
ベンガル語 | [125] | [1.1] |
マラヤーラム語 | [189,124] | [1.1,1.1] |
カンナダ語 | [142,138,131,59] | [1.05,1.1,1.1,1.1] |
テルグ語 | [69,133] | [1.1,1.1] |
パンジャーブ語 | [191,67,201] | [1.08,1.06,1.1] |
グジャラート語 | [62,190] | [1.15,1.25] |
マラーティー語 | [205,82,199,203] | [1.05,1.05,1.1,1.15] |
📄 ライセンス
このプロジェクトはApache-2.0ライセンスの下で公開されています。
お問い合わせ
👉 メール: founders@snorbyte.com
👉 ウェブサイト: https://snorbyte.com
引用
BibTeX形式での引用は以下の通りです。
@misc{indictextaudio2025,
title={snorTTS-Indic-v0: Multilingual Indic TTS},
author={snorbyte},
year={2025},
howpublished={\url{snorbyte/snorTTS-Indic-v0}},
note={Apache-2.0}
}
Kokoro 82M
Apache-2.0
Kokoroは8200万のパラメータを持つオープンソースのテキスト読み上げ(TTS)モデルで、軽量なアーキテクチャと高音質で知られ、高速かつコスト効率が高いという特徴があります。
音声合成 英語
K
hexgrad
2.0M
4,155
XTTS V2
その他
ⓍTTSは革新的な音声生成モデルで、わずか6秒の音声サンプルでクロスランゲージ音声クローンを実現し、17言語をサポートします。
音声合成
X
coqui
1.7M
2,630
F5 TTS
F5-TTSはストリームマッチングに基づく音声合成モデルで、流暢かつ忠実な音声合成に特化しており、特に童話の朗読などのシナリオに適しています。
音声合成
F
SWivid
851.49k
1,000
Bigvgan V2 22khz 80band 256x
MIT
BigVGANは大規模トレーニングに基づく汎用ニューラルボコーダーで、メルスペクトログラムから高品質なオーディオ波形を生成できます。
音声合成
B
nvidia
503.23k
16
Speecht5 Tts
MIT
LibriTTSデータセットでファインチューニングされたSpeechT5音声合成(テキスト読み上げ)モデルで、高品質なテキスト読み上げ変換をサポートします。
音声合成
Transformers

S
microsoft
113.83k
760
Dia 1.6B
Apache-2.0
DiaはNari Labsが開発した16億パラメータのテキスト音声合成モデルで、テキストから高度にリアルな対話を直接生成でき、感情やイントネーションの制御をサポートし、非言語コミュニケーション内容も生成可能です。
音声合成
Safetensors 英語
D
nari-labs
80.28k
1,380
Csm 1b
Apache-2.0
CSMはSesameが開発した10億パラメータ規模の音声生成モデルで、テキストと音声入力からRVQ音声エンコーディングを生成可能
音声合成
Safetensors 英語
C
sesame
65.03k
1,950
Kokoro 82M V1.1 Zh
Apache-2.0
Kokoroはオープンウェイトの小型ながら強力なテキスト読み上げ(TTS)モデルシリーズで、専門データセットから100名の中国語話者データを追加しました。
音声合成
K
hexgrad
51.56k
112
Indic Parler Tts
Apache-2.0
Indic Parler-TTS は Parler-TTS Mini の多言語インド語拡張版で、21言語をサポートし、複数のインド言語と英語を含みます。
音声合成
Transformers 複数言語対応

I
ai4bharat
43.59k
124
Bark
MIT
BarkはSunoによって作成されたTransformerベースのテキストからオーディオへのモデルで、非常にリアルな多言語音声、音楽、背景ノイズ、シンプルな音響効果を生成できます。
音声合成
Transformers 複数言語対応

B
suno
35.72k
1,326
おすすめAIモデル
Llama 3 Typhoon V1.5x 8b Instruct
タイ語専用に設計された80億パラメータの命令モデルで、GPT-3.5-turboに匹敵する性能を持ち、アプリケーションシナリオ、検索拡張生成、制限付き生成、推論タスクを最適化
大規模言語モデル
Transformers 複数言語対応

L
scb10x
3,269
16
Cadet Tiny
Openrail
Cadet-TinyはSODAデータセットでトレーニングされた超小型対話モデルで、エッジデバイス推論向けに設計されており、体積はCosmo-3Bモデルの約2%です。
対話システム
Transformers 英語

C
ToddGoldfarb
2,691
6
Roberta Base Chinese Extractive Qa
RoBERTaアーキテクチャに基づく中国語抽出型QAモデルで、与えられたテキストから回答を抽出するタスクに適しています。
質問応答システム 中国語
R
uer
2,694
98