ONNX 模型库
返回模型

说明文档

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 种独特声音: kavyaagastyamaitrivinaya - 每种都有独特的声音特征。
  • 多语言支持: 原生印地语和英语能力,支持混合语场景。
  • 超快推理: 在 H100-80GB GPU 上延迟低于 80ms。
  • 高质量音频: 使用 SNAC 神经编解码器输出 24kHz 音频。
  • 生产就绪: 针对实际部署优化,支持 4 位量化。

如何开始使用该模型

安装

要使用 Veena,您需要安装 transformerstorchtorchaudiosnacbitsandbytes 库。

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

text-to-speech onnxruntime-genai
↓ 0 ♥ 0

创建时间: 2025-06-30 07:46:19+00:00

更新时间: 2025-06-30 07:47:53+00:00

在 Hugging Face 上查看

文件 (8)

.gitattributes
README.md
genai_config.json
model.onnx ONNX
model.onnx.data
special_tokens_map.json
tokenizer.json
tokenizer_config.json