Speech Models: STT & TTS
|
This content was generated with the assistance of AI and should be verified against the official documentation of each tool and framework before being relied on in production. This section’s bibliography lists the reference material consulted while preparing these pages. |
This page was written against transformers 5.17.0, faster-whisper 1.2.1 with CTranslate2 4.8.2, kokoro 0.9.4 and
Piper 1.8.0 (the OHF-Voice/piper1-gpl repository), and every model row was checked against the Hub API and the model
card on 2026-09-30. Speech is the part of the Hub where the licence column matters most: open code does not mean open
weights, some checkpoints are gated behind an access form, and several text-to-speech models can clone a voice from a
few seconds of audio, which is a misuse risk you carry as the deployer. Where a cell could not be confirmed from the card
or the Hub metadata it says "see card" rather than a guess. This page is about models and how to run them; wiring
them into a real-time, interruptible conversation is the job of the Voice Agents sub-section, starting with Voice Architectures.
Reading the catalogue
The two tables below use the same columns, so models can be compared at a glance:
-
Licence is the licence declared in the card metadata at the time of checking. A permissive licence on the weights does not cover the training data, a base model the checkpoint was fine-tuned from, or the engine you run it with, so the notes under each table call those out. The general rules for reading a licence are in Choosing Models & Licences.
-
Size is the parameter count stated on the card, or, when the card gives none, the tensor element count reported by the Hub API for the checkpoint (marked "Hub API"). Memory needs follow from the size and the precision; see Hardware Sizing for the arithmetic.
-
Streaming means the model or its reference runtime is designed to emit or consume audio or text incrementally. "Offline" means it transcribes or synthesises a complete utterance at a time; you can still approximate streaming by chunking the input, at the cost of accuracy or latency.
-
Runtimes lists the libraries named on the card or the Hub metadata. Converted variants (CTranslate2, ONNX, MLX, Core ML) are covered in Model Formats.
The decision tree below summarises how to pick a starting point; the tables give the detail.
Reference: Hugging Face — Model Cards explains the metadata fields (licence, languages, library) that this page reads from each card.
Speech-to-text catalogue
Speech-to-text (STT, also called automatic speech recognition, ASR) maps an audio waveform to text, optionally with timestamps. The Whisper family is the default starting point because it is multilingual, well supported by every runtime, and available in many converted formats; the alternatives trade language coverage for speed, size or streaming.
| Model (card) | Licence | Size | Languages | Streaming | Runtimes |
|---|---|---|---|---|---|
Apache-2.0 |
About 1.54B (Hub API) |
Multilingual transcription and translation to English; see card for the list |
Offline (30 s windows, chunked for long audio) |
|
|
MIT |
About 0.81B (Hub API) |
Multilingual transcription; the turbo variant is a pruned large-v3, see card |
Offline |
|
|
MIT |
About 0.76B (Hub API) |
English only |
Offline; also usable as a draft model for speculative decoding with large-v3 |
|
|
CC-BY-4.0 (attribution required) |
0.6B |
25 European languages, automatic language detection |
Offline, long audio (up to 24 minutes with full attention on an A100 80 GB, up to 3 hours with local attention, per the card) |
NVIDIA NeMo; the Hub also tags |
|
CC-BY-4.0 (attribution required) |
About 1B (Hub API) |
25 European languages; also speech translation, see card for the directions |
Offline |
NVIDIA NeMo |
|
MIT |
61M (tiny is 27M) |
English |
Offline, built for low-cost edge hardware |
|
|
MIT |
Card lists tiny 34M, small 123M and medium 245M |
English |
Streaming (sliding-window encoder for low-latency ASR) |
|
Notes on the STT table:
-
Nothing in this table is non-commercial, but two licences have conditions. CC-BY-4.0 (Parakeet, Canary, and the Kyutai TTS model below) allows commercial use as long as you give attribution, and Whisper’s licence differs between checkpoints: large-v3 is tagged Apache-2.0 and turbo MIT, so check the tag of the exact checkpoint you ship.
-
Whisper is offline by design. It pads or splits audio into 30-second windows. The
chunk_length_soption intransformersand the segment generator infaster-whisperhandle long recordings; they do not make Whisper a low-latency live recogniser. For live captions, use Moonshine streaming or a voice-agent stack that adds voice-activity detection in front of the recogniser (see Turn-Taking and Interruptions). -
Moonshine hallucinates on short or clipped audio. Its card warns that it can emit text that was not spoken and can repeat itself, worst on very short segments or segments with cut-off word edges. The same caveat applies to Whisper: silence in, invented text out. Pair any recogniser with voice-activity detection.
-
distil-whisper keeps the large-v3 encoder and distils the decoder, so it is English-only but much faster. Because the encoder is shared, its card describes using it as the draft model for speculative decoding with large-v3, which keeps large-v3’s output while running faster.
-
Parakeet and Canary are trained and optimised with NeMo for NVIDIA GPUs; on Apple silicon or a CPU-only server, Whisper through
faster-whisper, or Moonshine, is the more practical choice.
References: transformers — Whisper, transformers — Moonshine and NVIDIA NeMo — ASR models.
Text-to-speech catalogue
Text-to-speech (TTS) maps text to a waveform. The Hub’s text-to-speech task tag is shared by very different designs:
a tiny non-autoregressive model such as Kokoro, autoregressive language-model-style models such as Orpheus and Dia, and
diffusion-head models such as VibeVoice. The designs differ in cost by more than an order of magnitude, so the size
column is worth reading before you pick one.
| Model (card) | Licence | Size | Languages | Streaming | Runtimes |
|---|---|---|---|---|---|
Apache-2.0 |
82M |
8 languages and 54 voices in v1.0 (American and British English, Japanese, Mandarin Chinese, Spanish, French, Hindi, Italian, Brazilian Portuguese) |
Chunked: the |
|
|
Repository tagged MIT; each voice has its own card with the dataset licence, so see card per voice |
Per voice, see card (ONNX files) |
More than 50 language directories in the voices repository (53 at the time of checking), with a varying number of voices each |
Chunked, per sentence |
Piper engine ( |
|
Apache-2.0 |
About 0.94B (Hub API) |
English; v1.1 has a tokenizer that simplifies multilingual training, see card |
The card points to an inference guide that covers streaming |
|
|
Apache-2.0 |
1.6B |
English |
Offline (real-time only on enterprise GPUs, per the card) |
|
|
Apache-2.0 tag, but the model is fine-tuned from Llama 3.2 3B Instruct, so the base model’s terms may also apply; see card |
3B class (about 3.8B tensor elements, Hub API) |
English |
See card (gated repository: you must accept an access form and authenticate) |
|
|
MIT |
0.5B (Llama backbone) |
23 languages in the multilingual release; English in the original |
See card |
|
|
CC-BY-4.0 (attribution required) |
1.8B (the card says the "1.6B" in the name is inaccurate) |
English and French |
Streaming text to speech, including dialogues |
|
|
MIT licence, but the card limits use to research and does not recommend commercial use |
1.5B language-model backbone (about 2.7B tensor elements in total, Hub API) |
English and Chinese only |
Offline; up to about 90 minutes and 4 speakers per generation |
|
|
MIT |
0.5B language-model backbone (about 1.0B tensor elements in total, Hub API) |
English only is supported (the Hub metadata lists |
Streaming text input with low time to first audio (hardware dependent), single speaker |
|
|
Apache-2.0 |
1B class (about 1.55B tensor elements, Hub API) |
English |
See card (gated repository: you must accept an access form and authenticate) |
|
Notes on the TTS table:
-
Restricted or conditional licences, stated plainly. No row carries a non-commercial licence tag, but three have conditions you must read. VibeVoice-1.5B is MIT-licensed yet its card restricts use to research and development and says it is not intended for commercial or real-world use without further testing; it also embeds an audible "generated by AI" disclaimer in every output. Orpheus is fine-tuned from a Llama model, so the Llama licence may still bind you. Kyutai TTS requires attribution under CC-BY-4.0. Piper is the reverse case: the voices are MIT-tagged but the engine is GPL-3.0, which matters if you link it into a distributed application.
-
Gated repositories. Orpheus and CSM are gated with automatic approval: downloading requires accepting the access conditions on the card while logged in, then authenticating with
$HF_TOKEN. Hub access setup is in Hub Essentials. -
Voice cloning is a misuse risk. Chatterbox, Dia and CSM can condition on a reference voice, and Kyutai TTS deliberately limits cloning to pre-computed voice embeddings. Dia’s card forbids producing audio that resembles real individuals without permission, Chatterbox adds a built-in watermark to its output and carries a disclaimer against misuse, and Kyutai’s card states that the model does not watermark. Get consent for any voice you clone and disclose synthetic audio to listeners.
-
Size is not a proxy for quality or cost. Kokoro (82M) and Piper voices run on a laptop CPU; 1.5B to 3B autoregressive or diffusion models want a GPU, and Dia’s card reports testing on GPUs only.
-
Kokoro and Piper are the practical on-device choices. Both are small and permissively licensed models with ONNX-friendly variants. Kokoro covers more expressive voices in fewer languages; Piper covers more languages with individually licensed voices.
References: transformers — Dia, transformers — CSM, Kokoro repository and Piper repository.
Speech-to-text with transformers
The automatic-speech-recognition pipeline loads the model, its tokenizer and its feature extractor from a model ID and
returns a dictionary with the transcript. In transformers v5 the precision argument is dtype, and dtype="auto"
uses the dtype stored in the checkpoint. The pipeline accepts a file path, a NumPy array or a list of files.
import torch
from transformers import pipeline
device = "cuda:0" if torch.cuda.is_available() else "cpu"
asr = pipeline(
"automatic-speech-recognition",
model="openai/whisper-large-v3-turbo",
dtype="auto",
device=device,
chunk_length_s=30, # split long audio into 30 s windows
batch_size=8, # windows decoded in parallel, tune to your memory
)
result = asr("meeting.mp3", return_timestamps=True)
print(result["text"])
for chunk in result["chunks"]:
print(chunk["timestamp"], chunk["text"])
Whisper predicts the spoken language by default. If you know it, pass it through generate_kwargs (for example
generate_kwargs={"language": "english"}); pass {"task": "translate"} to translate to English instead of
transcribing. Loading a checkpoint that ships custom code would need trust_remote_code=True, which runs the
repository author’s Python on your machine; none of the models above need it, so leave it off.
Reference: transformers — Pipelines and the Whisper large-v3-turbo model card, which documents the chunked long-form options. The full pipeline tour is in Transformers Pipelines.
Text-to-speech in transformers goes through the text-to-audio task (text-to-speech is an alias) or directly
through the model and processor classes. Dia is a good example because its card documents the model-and-processor path:
tag each speaker turn with [S1] and [S2], generate, then decode and save.
from transformers import AutoProcessor, DiaForConditionalGeneration
device = "cuda" # the card reports testing on GPUs only
checkpoint = "nari-labs/Dia-1.6B-0626"
processor = AutoProcessor.from_pretrained(checkpoint)
model = DiaForConditionalGeneration.from_pretrained(checkpoint).to(device)
text = ["[S1] The docs assistant is now running offline. [S2] Great, no network needed."]
inputs = processor(text=text, padding=True, return_tensors="pt").to(device)
outputs = model.generate(**inputs, max_new_tokens=512) # the card notes 256 tokens is roughly 2 s
outputs = processor.batch_decode(outputs)
processor.save_audio(outputs, "dialogue.wav")
Dia was not fine-tuned on a fixed voice, so each run produces different voices; pass a reference clip with its transcript to condition on a voice, which is the cloning case described above.
Reference: transformers — Dia and the Dia model card.
Fast transcription with faster-whisper
faster-whisper runs Whisper on CTranslate2 and is usually the quickest way to get Whisper onto a CPU, a consumer GPU or
a server. WhisperModel accepts a size name such as large-v3 or turbo and downloads the converted checkpoint from
the Hub, or a path to a local converted directory. compute_type selects the precision: float16 on GPU, or int8 on
CPU. The transcribe method returns a lazy generator of segments, so transcription only runs as you iterate.
from faster_whisper import WhisperModel
model = WhisperModel("turbo", device="cpu", compute_type="int8")
# GPU: WhisperModel("large-v3", device="cuda", compute_type="float16")
segments, info = model.transcribe(
"meeting.mp3",
beam_size=5,
vad_filter=True, # Silero VAD drops long silences, reducing hallucinated text
word_timestamps=True,
)
print("Detected language %s (p=%.2f)" % (info.language, info.language_probability))
for segment in segments: # the generator runs here
print("[%.2fs -> %.2fs] %s" % (segment.start, segment.end, segment.text))
for word in segment.words:
print(" %.2f %s" % (word.start, word.word))
For many files, BatchedInferencePipeline wraps the same model and accepts a batch_size. The distil-whisper checkpoints
also run here: the faster-whisper README shows distil-large-v3 with language="en" and
condition_on_previous_text=False.
Reference: faster-whisper README and CTranslate2 documentation.
Text-to-speech with Kokoro
Kokoro is the most convenient small TTS model for local work. The kokoro package exposes KPipeline; the
lang_code must match the voice (a is American English, b British English, e Spanish, f French, h Hindi,
i Italian, j Japanese, p Brazilian Portuguese, z Mandarin Chinese). It phonemises text with misaki, falling
back to espeak-ng, so install that system package first; Japanese and Chinese need the misaki[ja] and
misaki[zh] extras. Output is 24 kHz mono audio, yielded one segment at a time.
import soundfile as sf
from kokoro import KPipeline
# pip install kokoro soundfile and apt-get install espeak-ng (or the brew/choco equivalent)
pipeline = KPipeline(lang_code="a") # American English
text = "DocsAssistant is now running fully offline on this machine."
for i, (graphemes, phonemes, audio) in enumerate(pipeline(text, voice="af_heart")):
print(i, graphemes)
sf.write(f"speech_{i}.wav", audio, 24000)
Because the generator yields per segment, you can start playback after the first segment instead of waiting for the whole
text, which gives a reasonable time to first audio for short replies. On Apple silicon, the Kokoro README suggests
setting PYTORCH_ENABLE_MPS_FALLBACK=1 to use the GPU. The kokoro package constrains the Python version (the baseline
for this page lists Python below 3.13), so use a dedicated virtual environment.
Reference: Kokoro repository and the Kokoro-82M model card. The same model in ONNX form, for runtimes outside Python, is onnx-community/Kokoro-82M-v1.0-ONNX.
From models to real-time use
Everything above transcribes or synthesises whole utterances, or at best a segment at a time. A conversation needs more: voice-activity detection to know when the user has stopped, streaming in both directions, barge-in (the user interrupting the reply) and a language model in the middle. Those pipelines are covered in the Voice Agents sub-section; treat this page as the model shelf it draws from. As a rule of thumb when choosing for that use, prefer the models marked as streaming (Moonshine streaming for input, Kyutai TTS or VibeVoice-Realtime for output) or the small models whose first segment arrives quickly (Kokoro, Piper), and measure time to first audio on your own hardware rather than trusting a card.
The same models appear later in this sub-section: Conversion & Quantization shows how the Whisper and Kokoro checkpoints are converted for ONNX, Core ML and CTranslate2 runtimes, and the per-platform integration pages reuse the same four-task scenario (transcribe, answer, speak, describe a screenshot) with these models.
References
-
OpenAI — Robust Speech Recognition via Large-Scale Weak Supervision (Whisper)
-
Distil-Whisper — Robust Knowledge Distillation via Large-Scale Pseudo Labelling
-
Moonshine paper, as cited on the Moonshine model card (arXiv 2410.15608)
-
Kyutai — delayed streams modeling paper, as cited on the Kyutai TTS model card (arXiv 2509.08753)