Snortts Indic V0
snorTTS-Indic-v0 是一個多語言印度語語音合成(TTS)模型,能夠生成九種印度語言的語音。
下載量 353
發布時間 : 7/9/2025
模型概述
該模型支持九種印度語言的語音合成,包括印地語、泰米爾語、泰盧固語、馬拉地語、卡納達語、馬拉雅拉姆語、旁遮普語、古吉拉特語和孟加拉語。具備語音克隆、代碼切換和跨語言語音克隆能力。
模型特點
多語言支持
支持九種印度語言的語音合成
語音克隆
能夠克隆特定說話人的語音特徵
代碼切換
支持在同一語句中混合使用多種語言
跨語言語音克隆
實現多語言語音遷移功能
模型能力
語音合成
語音克隆
多語言混合語音生成
跨語言語音遷移
使用案例
語音應用
多語言語音助手
為印度多語言用戶提供語音交互服務
有聲讀物製作
生成多種印度語言的有聲內容
教育
語言學習工具
幫助學習者練習多種印度語言的發音
🚀 snorTTS-Indic-v0
snorTTS-Indic-v0 是一個多語言印度語語音合成(TTS)模型,能夠生成九種印度語言的語音,包括印地語、泰米爾語、泰盧固語、馬拉地語、卡納達語、馬拉雅拉姆語、旁遮普語、古吉拉特語和孟加拉語。
👉 閱讀完整博客:訓練最先進的多語言印度語語音合成(TTS)模型 ,瞭解我們是如何構建該模型的。
本項目中使用的所有代碼、數據集和模型(包括基礎模型和微調模型)均可供任何人使用和基於其進行二次開發。
🚀 快速開始
你可以通過以下步驟快速開始使用 snorTTS-Indic-v0 模型:
- 安裝必要的庫(針對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}.")
✨ 主要特性
- 語音合成(TTS)
- 語音克隆
- 代碼切換
- 跨語言語音克隆(多語言語音遷移)
📦 安裝指南
安裝必要的庫(針對Linux系統)
sudo apt update
sudo apt install -y sox libsox-dev
使用Python 3.10
卸載已安裝的torch
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}.")
高級用法
# 可以根據不同的需求調整生成音頻的參數,如溫度、top_p等
# 例如修改 generate_audio 函數中的參數
eval_sample = generate_audio(row, model, tokenizer, True, temperature=0.6, top_p=0.95)
📚 詳細文檔
模型概述
屬性 | 詳情 |
---|---|
架構 | LLaMA-3.2-3B |
基礎模型 | canopylabs/3b-hi-pretrain-research_release |
音頻編解碼器 | SNAC @ 24 kHz,3 個碼本(12,288 個新令牌) |
語言 | 印地語、古吉拉特語、馬拉地語、旁遮普語、孟加拉語、泰盧固語、卡納達語、馬拉雅拉姆語、泰米爾語 |
訓練
有關訓練和數據集的詳細信息,請參考 訓練最先進的多語言印度語語音合成(TTS)模型。
你可以在本倉庫中找到訓練腳本 (train_orepheus.py
),它是一個用於微調基礎模型的獨立腳本。
👉 訓練使用的數據集:snorbyte/indic-tts-sample-snac-encoded
提示模板
標準提示
{
"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
語言 | 說話人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] |
🔧 技術細節
本模型的技術細節可參考 訓練最先進的多語言印度語語音合成(TTS)模型。
📄 許可證
本項目採用 Apache-2.0 許可證。
📞 聯繫我們
👉 網站: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實驗室開發的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架構的中文抽取式問答模型,適用於從給定文本中提取答案的任務。
問答系統 中文
R
uer
2,694
98