ONNX 模型库
返回模型

说明文档

🔊 SALAMA-TTS — 斯瓦希里语文本转语音模型

开发者: AI4NNOVATION

版本: v1.0
许可证: Apache 2.0
模型类型: 文本转语音 (TTS)
基础模型: facebook/mms-tts-swh (微调版)


🌍 概述

SALAMA-TTSSALAMA 框架语音合成模块,该框架是一个面向非洲语言的完整端到端 语音到语音 AI 系统
它能从文本生成 自然、高质量的斯瓦希里语语音,并可与 SALAMA-LLMSALAMA-STT 无缝集成,用于对话式语音助手。

该模型基于 Meta 的 MMS (大规模多语言语音) TTS 架构,使用 VITS 框架,针对斯瓦希里语的自然韵律、语调和节奏进行了微调。


🧱 模型架构

SALAMA-TTS 基于 VITS 架构 构建,结合了 变分自编码器 (VAE)GAN 的优势,实现逼真且富有表现力的语音合成。

参数
基础模型 facebook/mms-tts-swh
微调方式 8位量化,LoRA 微调
优化器 AdamW
学习率 2e-5
训练轮数 20
采样率 16kHz
框架 Transformers + Datasets + PyTorch
语言 斯瓦希里语 (sw)

📚 数据集

数据集 描述 用途
common_voice_17_0 Mozilla 斯瓦希里语语音数据集 基础训练
自定义斯瓦希里语语音语料库 本地录制的句子和对话 微调自然度
评估数据集 Common Voice 斯瓦希里语 (测试集) 评估

🧠 模型能力

  • 斯瓦希里语文本转换为自然语音
  • 处理 正式和对话式 两种语调
  • 长篇语音具有高清晰度和韵律感
  • SALAMA-LLM 响应无缝集成
  • 输出格式:16-bit PCM WAV

📊 评估指标

指标 分数 描述
MOS (平均意见分) 4.05 / 5.0 人工评分的自然度
WER (生成 → STT) 0.21 通过重新转录合成音频进行评估

MOS 由 12 位斯瓦希里语母语者在清晰度、语调和发音方面进行评估。


⚙️ 使用示例 (Python)

# Requirements:
# pip install onnxruntime librosa soundfile transformers numpy
# If you want GPU inference: pip install onnxruntime-gpu (and ensure CUDA toolkit is available)

import os
import numpy as np
import onnxruntime
from transformers import AutoTokenizer
import soundfile as sf

TTS_ONNX_MODEL_PATH = "swahili_tts.onnx"   # path to your .onnx file
TTS_TOKENIZER_ID = "facebook/mms-tts-swh"  # or whichever tokenizer you used
OUTPUT_SAMPLE_RATE = 16000
OUT_DIR = "tts_outputs"
os.makedirs(OUT_DIR, exist_ok=True)

def create_onnx_session(onnx_path: str):
    """Create an ONNX Runtime session using GPU if available, otherwise CPU."""
    providers = ["CPUExecutionProvider"]
    try:
        # prefer CUDA if available
        providers = ["CUDAExecutionProvider", "CPUExecutionProvider"]
        sess = onnxruntime.InferenceSession(onnx_path, providers=providers)
        print("Using CUDAExecutionProvider for ONNX Runtime.")
    except Exception:
        sess = onnxruntime.InferenceSession(onnx_path, providers=["CPUExecutionProvider"])
        print("CUDA not available — using CPUExecutionProvider for ONNX Runtime.")
    return sess

def generate_speech_from_onnx(text: str,
                              onnx_session: onnxruntime.InferenceSession,
                              tokenizer: AutoTokenizer,
                              out_path: str = None) -> str:
    """
    Synthesize speech from text using an ONNX TTS model.
    Returns path to WAV file (16kHz, int16).
    """
    if not text:
        raise ValueError("Empty text provided.")

    # Tokenize to numpy inputs (match what the ONNX model expects)
    # NOTE: many TTS tokenizers return {"input_ids": np.array(...)} — adapt if your tokenizer differs
    inputs = tokenizer(text, return_tensors="np", padding=True)
    # Identify ONNX input name (assume first input)
    input_name = onnx_session.get_inputs()[0].name

    # Prepare ort_inputs dict using names expected by ONNX model
    ort_inputs = {input_name: inputs["input_ids"].astype(np.int64)}

    # Run ONNX inference
    ort_outs = onnx_session.run(None, ort_inputs)

    # The model should return a raw waveform or float array convertible to waveform.
    # In many single-file TTS ONNX exports the first output is the waveform
    audio_array = ort_outs[0]

    # Flatten in case it's multi-dim and ensure 1-D waveform
    audio_waveform = audio_array.flatten()

    # If float waveform in -1..1, convert to int16; else try to coerce to int16
    if np.issubdtype(audio_waveform.dtype, np.floating):
        # clip then convert
        audio_clip = np.clip(audio_waveform, -1.0, 1.0)
        audio_int16 = (audio_clip * 32767.0).astype(np.int16)
    else:
        # if it's already int16-like, cast (safeguard)
        audio_int16 = audio_waveform.astype(np.int16)

    # Compose output filename
    if out_path is None:
        out_path = os.path.join(OUT_DIR, f"salama_tts_{abs(hash(text)) & 0xFFFF_FFFF}.wav")

    # Save with soundfile (16kHz)
    sf.write(out_path, audio_int16, samplerate=OUTPUT_SAMPLE_RATE, subtype="PCM_16")
    return out_path

if __name__ == "__main__":
    # Example usage
    sess = create_onnx_session(TTS_ONNX_MODEL_PATH)
    tokenizer = AutoTokenizer.from_pretrained(TTS_TOKENIZER_ID)

    example_text = "Karibu kwenye mfumo wa SALAMA unaozalisha sauti asilia ya Kiswahili."
    out_wav = generate_speech_from_onnx(example_text, sess, tokenizer)
    print("Saved synthesized audio to:", out_wav)

示例输出:

音频播放: "Karibu kwenye mfumo wa SALAMA unaozalisha sauti asilia ya Kiswahili."


⚡ 主要特性

  • 🗣️ 自然的斯瓦希里语语音生成
  • 🌍 适应非洲语言的声调变化
  • 🔉 高清晰度和节奏感
  • ⚙️ 使用 FP16 精度实现快速推理
  • 🔗 兼容 SALAMA-STT 和 SALAMA-LLM

EYEDOL/SALAMA_TTS

作者 EYEDOL

text-to-speech transformers
↓ 0 ♥ 1

创建时间: 2025-11-06 07:06:51+00:00

更新时间: 2025-11-06 07:27:19+00:00

在 Hugging Face 上查看

文件 (3)

.gitattributes
README.md
swahili_tts.onnx ONNX