说明文档
Veena - 印度语言文本转语音模型
Veena 是由 Maya Research 开发的、专为印度语言设计的最先进神经文本转语音(TTS)模型。基于 Llama 架构构建,Veena 能够以卓越的音质和超低延迟生成印地语和英语的自然、富有表现力的语音。
模型概述
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
4位推理的模型配置
quantization_config = BitsAndBytesConfig( load_in_4bit=True, bnb_4bit_quant_type="nf4", bnb_4bit_compute_dtype=torch.bfloat16, bnb_4bit_use_double_quant=True, )
加载模型和分词器
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)
初始化 SNAC 解码器
snac_model = SNAC.from_pretrained("hubertsiuzdak/snac_24khz").eval().cuda()
控制标记 ID(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
可用说话人
speakers = ["kavya", "agastya", "maitri", "vinaya"]
def generate_speech(text, speaker="kavya", temperature=0.4, top_p=0.9): """使用指定说话人声音从文本生成语音"""
# 准备带有说话人标记的输入
prompt = f\"<spk_{speaker}> {text}\"
prompt_tokens = tokenizer.encode(prompt, add_special_tokens=False)
# 构建完整序列:[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)
# 根据文本长度计算最大标记数
max_tokens = min(int(len(text) * 1.3) * 7 + 21, 700)
# 生成音频标记
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]
)
# 提取 SNAC 标记
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\")
# 解码音频
audio = decode_snac_tokens(snac_tokens, snac_model)
return audio
def decode_snac_tokens(snac_tokens, snac_model): """解交织并将 SNAC 标记解码为音频""" if not snac_tokens or len(snac_tokens) % 7 != 0: return None
# 将标记解交织为 3 个层级
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):
# 层级 0:粗粒度(1 个标记)
codes_lvl[0].append(snac_tokens[i] - llm_codebook_offsets[0])
# 层级 1:中粒度(2 个标记)
codes_lvl[1].append(snac_tokens[i+1] - llm_codebook_offsets[1])
codes_lvl[1].append(snac_tokens[i+4] - llm_codebook_offsets[4])
# 层级 2:细粒度(4 个标记)
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])
# 转换为张量供 SNAC 解码器使用
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)
# 使用 SNAC 解码
with torch.no_grad():
audio_hat = snac_model.decode(hierarchical_codes)
return audio_hat.squeeze().clamp(-1, 1).cpu().numpy()
--- 示例用法 ---
印地语
text_hindi = "आज मैंने एक नई तकनीक के बारे में सीखा जो कृत्रिम बुद्धिमत्ता का उपयोग करके मानव जैसी आवाज़ उत्पन्न कर सकती है।" audio = generate_speech(text_hindi, speaker="kavya") sf.write("output_hindi_kavya.wav", audio, 24000)
英语
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)
语码混用
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_maitrya>`、`<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 位)
* `optimizer_betas`:(0.9, 0.98)
* `optimizer_eps`:1e-5
* `learning_rate_peak`:1e-4
* `lr_scheduler`:余弦
* `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)}
}
致谢
我们感谢开源社区和所有使本项目成为可能的贡献者。特别感谢提供高质量录音用于训练的配音艺术家们。
Prince-1/Veena-Onnx
作者 Prince-1
创建时间: 2025-06-26 06:37:07+00:00
更新时间: 2025-06-26 07:30:58+00:00
在 Hugging Face 上查看