Hume TADA

Voice & Multimodal 💻 Jupyter Notebook ⚖️ Other 🟡 Quiet lately
1.0k stars

TADA is a unified speech-language model that synchronizes speech and text into a single stream via 1:1 alignment, enabling high-fidelity speech synthesis with reduced computational overhead. It solves inefficiencies in traditional TTS models by dynamically determining duration and prosody per text token, eliminating fixed frame rates and transcript hallucination. It is for developers building text-to-speech and speech continuation applications.

✨ Key features

  • 1:1 token alignment between text and speech vectors
  • Dynamic duration synthesis per text token
  • Dual-stream generation of text and speech
  • Efficient: ~0.12x RTF on H100 with cached prompts
  • Multilingual support with language-specific aligners
  • Prompt caching to skip encoder on future runs

🎯 Use cases

  • Text-to-speech synthesis with natural prosody
  • Speech continuation from a reference audio prompt
  • Multilingual speech synthesis (e.g., Japanese, Spanish)
  • Building expressive voice assistants or audiobook generators

📦 Installation

🧰 Requirements: Requires access to Meta Llama 3.2 models (accept license on Hugging Face), Python environment with PyTorch and CUDA for GPU inference.

pip install hume-tada

Build from source

git clone https://github.com/HumeAI/tada.git
cd tada
pip install -e .

🚀 Usage

import torch
import torchaudio

from tada.modules.encoder import Encoder, EncoderOutput
from tada.modules.tada import TadaForCausalLM

device = "cuda"

# Encoder is loaded separately (not inside the model)
encoder = Encoder.from_pretrained("HumeAI/tada-codec", subfolder="encoder").to(device)
model = TadaForCausalLM.from_pretrained("HumeAI/tada-3b-ml", torch_dtype=torch.bfloat16).to(device)

audio, sample_rate = torchaudio.load("samples/ljspeech.wav")
audio = audio.to(device)
prompt_text = "The examination and testimony of the experts, enabled the commission to conclude that five shots may have been fired."
prompt = encoder(
    audio, text=[prompt_text], sample_rate=sample_rate
)

# Optional: save prompt to skip encoder on future runs
# prompt.save("prompt_cache.pt")
# prompt = EncoderOutput.load("prompt_cache.pt", device=device)

output = model.generate(
    prompt=prompt,
    text="Please call Stella. Ask her to bring these things with her from the store.",
)

⚠️ Good to know

The built-in ASR for prompt alignment is English-only; for non-English prompts, you must provide the transcript to maintain alignment quality.

❓ FAQ

What are the model sizes available?

TADA-1B (based on Llama 3.2 1B) and TADA-3B-ML (based on Llama 3.2 3B) are available on Hugging Face.

How do I use a language other than English?

Pass the language parameter when loading the encoder, e.g., language='ja' for Japanese. Supported languages include ar, ch, de, es, fr, it, ja, pl, pt.

Can I cache the encoder output to speed up inference?

Yes, use EncoderOutput.save() and EncoderOutput.load() to save and reuse prompts, avoiding re-encoding.

What are the licensing terms?

Model weights are under the Llama 3.2 Community License, and the code is under MIT. You must accept the Llama license to use the models.

📊 Repository

Stars★ 1,011
Forks🍴 112
Open issues🐛 19
Last commit🕒 May 11, 2026
Created📅 Mar 2026
Language💻 Jupyter Notebook
License⚖️ Other

🤖 Overview, features, install steps and FAQ were generated from the project's README on Sep 4, 2026. Always check the original source before running commands.