说明文档
Veena - 印度语言文本转语音模型
Veena 是由 Maya Research 开发的、专为印度语言设计的最先进神经文本转语音 (TTS) 模型。Veena 基于 Llama 架构构建,能够以卓越的音质和超低延迟生成印地语和英语的自然、富有表现力的语音。
模型概述
Veena 是一个基于 Llama 架构的 30 亿参数自回归 Transformer 模型。它专为从印地语和英语文本(包括混合语场景)合成高质量语音而设计。该模型使用 SNAC 神经编解码器输出 24kHz 采样率的音频。
- 模型类型: 自回归 Transformer
- 基础架构: Llama (30 亿参数)
- 支持语言: 印地语、英语
- 音频编解码器: SNAC @ 24kHz
- 许可证: Apache 2.0
- 开发者: Maya Research
- 模型链接: https://huggingface.co/maya-research/veena
主要特性
- 4 种独特声音:
kavya、agastya、maitri和vinaya- 每种都有独特的声音特征。 - 多语言支持: 原生印地语和英语能力,支持混合语场景。
- 超快推理: 在 H100-80GB GPU 上延迟低于 80ms。
- 高质量音频: 使用 SNAC 神经编解码器输出 24kHz 音频。
- 生产就绪: 针对实际部署优化,支持 4 位量化。
如何开始使用该模型
安装
要使用 Veena,您需要安装 transformers、torch、torchaudio、snac 和 bitsandbytes 库。
pip install transformers torch torchaudio
pip install snac bitsandbytes # 用于音频解码和量化
基本用法
以下 Python 代码演示了如何使用 Veena 通过 4 位量化进行高效推理,从文本生成语音。
<!-- ```python import torch from transformers import AutoModelForCausalLM, AutoTokenizer, BitsAndBytesConfig from snac import SNAC import soundfile as sf
Model configuration for 4-bit inference
quantization_config = BitsAndBytesConfig( load_in_4bit=True, bnb_4bit_quant_type="nf4", bnb_4bit_compute_dtype=torch.bfloat16, bnb_4bit_use_double_quant=True, )
Load model and tokenizer
model = AutoModelForCausalLM.from_pretrained( "maya-research/veena-tts", quantization_config=quantization_config, device_map="auto", trust_remote_code=True, ) tokenizer = AutoTokenizer.from_pretrained("maya-research/veena-tts", trust_remote_code=True)
Initialize SNAC decoder
snac_model = SNAC.from_pretrained("hubertsiuzdak/snac_24khz").eval().cuda()
Control token IDs (fixed for Veena)
START_OF_SPEECH_TOKEN = 128257 END_OF_SPEECH_TOKEN = 128258 START_OF_HUMAN_TOKEN = 128259 END_OF_HUMAN_TOKEN = 128260 START_OF_AI_TOKEN = 128261 END_OF_AI_TOKEN = 128262 AUDIO_CODE_BASE_OFFSET = 128266 INFO: Setting token_id of bos to 128000 INFO: Setting token_id of eos to 128009 INFO: Setting token_id of pad to 128263
INFO: Setting max_context_limit to 4096
Available speakers
speakers = ["kavya", "agastya", "maitri", "vinaya"]
def generate_speech(text, speaker="kavya", temperature=0.4, top_p=0.9): """Generate speech from text using specified speaker voice"""
# Prepare input with speaker token
prompt = f\"<spk_{speaker}> {text}\"
prompt_tokens = tokenizer.encode(prompt, add_special_tokens=False)
# Construct full sequence: [HUMAN] <spk_speaker> text [/HUMAN] [AI] [SPEECH]
input_tokens = [
START_OF_HUMAN_TOKEN,
*prompt_tokens,
END_OF_HUMAN_TOKEN,
START_OF_AI_TOKEN,
START_OF_SPEECH_TOKEN
]
input_ids = torch.tensor([input_tokens], device=model.device)
# Calculate max tokens based on text length
max_tokens = min(int(len(text) * 1.3) * 7 + 21, 700)
# Generate audio tokens
with torch.no_grad():
output = model.generate(
input_ids,
max_new_tokens=max_tokens,
do_sample=True,
temperature=temperature,
top_p=top_p,
repetition_penalty=1.05,
pad_token_id=tokenizer.pad_token_id,
eos_token_id=[END_OF_SPEECH_TOKEN, END_OF_AI_TOKEN]
)
# Extract SNAC tokens
generated_ids = output[0][len(input_tokens):].tolist()
snac_tokens = [
token_id for token_id in generated_ids
if AUDIO_CODE_BASE_OFFSET <= token_id < (AUDIO_CODE_BASE_OFFSET + 7 * 4096)
]
if not snac_tokens:
raise ValueError(\"No audio tokens generated\")
# Decode audio
audio = decode_snac_tokens(snac_tokens, snac_model)
return audio
def decode_snac_tokens(snac_tokens, snac_model): """De-interleave and decode SNAC tokens to audio""" if not snac_tokens or len(snac_tokens) % 7 != 0: return None
# De-interleave tokens into 3 hierarchical levels
codes_lvl = [[] for _ in range(3)]
llm_codebook_offsets = [AUDIO_CODE_BASE_OFFSET + i * 4096 for i in range(7)]
for i in range(0, len(snac_tokens), 7):
# Level 0: Coarse (1 token)
codes_lvl[0].append(snac_tokens[i] - llm_codebook_offsets[0])
# Level 1: Medium (2 tokens)
codes_lvl[1].append(snac_tokens[i+1] - llm_codebook_offsets[1])
codes_lvl[1].append(snac_tokens[i+4] - llm_codebook_offsets[4])
# Level 2: Fine (4 tokens)
codes_lvl[2].append(snac_tokens[i+2] - llm_codebook_offsets[2])
codes_lvl[2].append(snac_tokens[i+3] - llm_codebook_offsets[3])
codes_lvl[2].append(snac_tokens[i+5] - llm_codebook_offsets[5])
codes_lvl[2].append(snac_tokens[i+6] - llm_codebook_offsets[6])
# Convert to tensors for SNAC decoder
hierarchical_codes = []
for lvl_codes in codes_lvl:
tensor = torch.tensor(lvl_codes, dtype=torch.int32, device=snac_model.device).unsqueeze(0)
if torch.any((tensor < 0) | (tensor > 4095)):
raise ValueError(\"Invalid SNAC token values\")
hierarchical_codes.append(tensor)
# Decode with SNAC
with torch.no_grad():
audio_hat = snac_model.decode(hierarchical_codes)
return audio_hat.squeeze().clamp(-1, 1).cpu().numpy()
--- Example Usage ---
Hindi
text_hindi = "आज मैंने एक नई तकनीक के बारे में सीखा जो कृत्रिम बुद्धिमत्ता का उपयोग करके मानव जैसी आवाज़ उत्पन्न कर सकती है।" audio = generate_speech(text_hindi, speaker="kavya") sf.write("output_hindi_kavya.wav", audio, 24000)
English
text_english = "Today I learned about a new technology that uses artificial intelligence to generate human-like voices." audio = generate_speech(text_english, speaker="agastya") sf.write("output_english_agastya.wav", audio, 24000)
Code-mixed
text_mixed = "मैं तो पूरा presentation prepare कर चुका हूं! कल रात को ही मैंने पूरा code base चेक किया।" audio = generate_speech(text_mixed, speaker="maitri") sf.write("output_mixed_maitri.wav", audio, 24000)
## 用途
Veena 非常适合需要为印度语言提供高质量、低延迟语音合成的各种应用,包括:
* **无障碍服务:** 为视障用户提供屏幕阅读器和语音辅助功能。
* **客户服务:** IVR 系统、语音机器人和自动播报。
* **内容创作:** 视频配音、电子学习材料和有声读物。
* **汽车行业:** 车载导航和信息娱乐系统。
* **边缘设备:** 支持语音的智能设备和物联网应用。
## 技术规格
### 架构
Veena 采用 30 亿参数的基于 Transformer 的架构,具有多项关键创新:
* **基础架构:** Llama 风格自回归 Transformer(30 亿参数)
* **音频编解码器:** SNAC (24kHz),用于高质量音频令牌生成
* **说话人条件:** 特殊说话人令牌(`<spk_kavya>`、`<spk_agastya>`、`<spk_maitry>`、`<spk_vinaya>`)
* **参数高效训练:** 采用 LoRA 适配,对注意力模块和 FFN 模块使用不同的秩。
* **上下文长度:** 2048 个令牌
### 训练
#### 训练基础设施
* **硬件:** 8× NVIDIA H100 80GB GPU
* **分布式训练:** DDP 与优化通信
* **精度:** BF16 混合精度训练与梯度检查点
* **内存优化:** 4 位量化,使用 NF4 + 双重量化
#### 训练配置
* **LoRA 配置:**
* `lora_rank_attention`: 192
* `lora_rank_ffn`: 96
* `lora_alpha`: 2× 秩(注意力为 384,FFN 为 192)
* `lora_dropout`: 0.05
* `target_modules`: `[\"q_proj\", \"k_proj\", \"v_proj\", \"o_proj\", \"gate_proj\", \"up_proj\", \"down_proj\"]`
* `modules_to_save`: `[\"embed_tokens\"]`
* **优化器配置:**
* `optimizer`: AdamW (8-bit)
* `optimizer_betas`: (0.9, 0.98)
* `optimizer_eps`: 1e-5
* `learning_rate_peak`: 1e-4
* `lr_scheduler`: cosine
* `warmup_ratio`: 0.02
* **批次配置:**
* `micro_batch_size`: 8
* `gradient_accumulation_steps`: 4
* `effective_batch_size`: 256
#### 训练数据
Veena 在**专有的高质量数据集**上进行训练,这些数据集专为印度语言 TTS 精心策划。
* **数据量:** 每位说话人 15,000+ 条话语(总计 60,000+ 条)
* **语言:** 原生印地语和英语话语,支持混合语场景
* **说话人多样性:** 4 位具有独特特征的专业配音艺术家
* **音频质量:** 24kHz 采样率的录音室级录音
* **内容多样性:** 对话、叙述、表现力和信息性风格
**注意:** 训练数据集是专有的,不公开提供。
## 性能基准
| 指标 | 数值 |
| --------------------- | ------------------------- |
| 延迟 (H100-80GB) | \<80ms |
| 延迟 (A100-40GB) | \~120ms |
| 延迟 (RTX 4090) | \~200ms |
| 实时因子 | 0.05x |
| 吞吐量 | \~170k tokens/s (8×H100) |
| 音频质量 (MOS) | 4.2/5.0 |
| 说话人相似度 | 92% |
| 清晰度 | 98% |
## 风险、限制和偏见
* **语言支持:** 目前仅支持印地语和英语。不保证在其他印度语言上的性能。
* **说话人多样性:** 仅限于 4 种说话人声音,可能无法代表印度口音和方言的全部多样性。
* **硬件要求:** 需要GPU进行实时或接近实时的推理。CPU 性能将显著较慢。
* **输入长度:** 模型最大输入长度限制为 2048 个令牌。
* **偏见:** 模型的性能和声音特征反映了专有训练数据的特点。它可能表现出数据中存在的偏见。
## 未来更新
我们正在积极扩展 Veena 的能力:
* 支持泰米尔语、泰卢固语、孟加拉语、马拉地语和其他印度语言。
* 具有地区口音的额外说话人声音。
* 情感和韵律控制令牌。
* 流式推理支持。
* 用于边缘部署的 CPU 优化。
## 引用
如果您在研究或应用中使用 Veena,请引用:
```bibtex
@misc{veena2025,
title={Veena: Open Source Text-to-Speech for Indian Languages},
author={Maya Research Team},
year={2025},
publisher={HuggingFace},
url={[https://huggingface.co/maya-research/veena-tts](https://huggingface.co/maya-research/veena-tts)}
}
致谢
我们感谢开源社区和所有使该项目成为可能的贡献者。特别感谢为训练提供高质量录音的配音艺术家们。
onnx-community/Veena-Onnx
作者 onnx-community
创建时间: 2025-06-30 07:46:19+00:00
更新时间: 2025-06-30 07:47:53+00:00
在 Hugging Face 上查看