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.

flowchart TD A["What do you need?"] --> B["Speech to text"] A --> C["Text to speech"] B --> B1{"Latency or device budget?"} B1 -->|"Live captions on a small device"| B2["Moonshine streaming"] B1 -->|"Batch, many languages"| B3["Whisper large-v3 or turbo via faster-whisper"] B1 -->|"European languages, NVIDIA GPU"| B4["Parakeet or Canary via NeMo"] B1 -->|"English only, fastest"| B5["distil-whisper"] C --> C1{"What matters most?"} C1 -->|"Small, CPU, permissive"| C2["Kokoro-82M or Piper"] C1 -->|"Voice cloning or expressive dialogue"| C3["Chatterbox, Dia, Orpheus, CSM"] C1 -->|"Streaming text in, audio out"| C4["Kyutai TTS or VibeVoice-Realtime"] C1 -->|"Describe the voice in words"| C5["Parler-TTS"]
Figure 1. Choosing a speech model by task and constraint

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.

Table 1. Speech-to-text models, checked against the Hub on 2026-09-30
Model (card) Licence Size Languages Streaming Runtimes

openai/whisper-large-v3

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)

transformers, faster-whisper via Systran/faster-whisper-large-v3 (CTranslate2, MIT), openai-whisper, ONNX and other community conversions

openai/whisper-large-v3-turbo

MIT

About 0.81B (Hub API)

Multilingual transcription; the turbo variant is a pruned large-v3, see card

Offline

transformers, faster-whisper (the turbo model name), onnx-community/whisper-large-v3-turbo for Transformers.js

distil-whisper/distil-large-v3.5

MIT

About 0.76B (Hub API)

English only

Offline; also usable as a draft model for speculative decoding with large-v3

transformers, faster-whisper (the card documents the CTranslate2 variant), see card

nvidia/parakeet-tdt-0.6b-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 transformers, see card; optimised for NVIDIA GPUs

nvidia/canary-1b-v2

CC-BY-4.0 (attribution required)

About 1B (Hub API)

25 European languages; also speech translation, see card for the directions

Offline

NVIDIA NeMo

moonshine-ai/moonshine-base

MIT

61M (tiny is 27M)

English

Offline, built for low-cost edge hardware

transformers, Moonshine Voice framework

moonshine-ai/moonshine-streaming-medium

MIT

Card lists tiny 34M, small 123M and medium 245M

English

Streaming (sliding-window encoder for low-latency ASR)

transformers (development version, per the card), Moonshine Voice framework

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_s option in transformers and the segment generator in faster-whisper handle 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.

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.

Table 2. Text-to-speech models, checked against the Hub on 2026-09-30
Model (card) Licence Size Languages Streaming Runtimes

hexgrad/Kokoro-82M

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 kokoro pipeline is a generator that yields audio per text segment

kokoro Python package (needs espeak-ng), onnx-community/Kokoro-82M-v1.0-ONNX for ONNX Runtime and Transformers.js

rhasspy/piper-voices

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 (OHF-Voice/piper1-gpl, GPL-3.0, pip install piper-tts); voices run on CPU through ONNX Runtime

parler-tts/parler-tts-mini-v1.1

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

parler-tts package, transformers

nari-labs/Dia-1.6B-0626

Apache-2.0

1.6B

English

Offline (real-time only on enterprise GPUs, per the card)

transformers (DiaForConditionalGeneration), dia package; tested on GPUs only

canopylabs/orpheus-3b-0.1-ft

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)

transformers, see card

ResembleAI/chatterbox

MIT

0.5B (Llama backbone)

23 languages in the multilingual release; English in the original

See card

chatterbox package; zero-shot voice cloning

kyutai/tts-1.6b-en_fr

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

moshi library and the delayed-streams-modeling repository; voices in kyutai/tts-voices

microsoft/VibeVoice-1.5B

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

transformers, VibeVoice repository

microsoft/VibeVoice-Realtime-0.5B

MIT

0.5B language-model backbone (about 1.0B tensor elements in total, Hub API)

English only is supported (the Hub metadata lists en); the card also provides nine experimental languages (German, French, Italian, Japanese, Korean, Dutch, Polish, Portuguese, Spanish) offered for exploration, see card

Streaming text input with low time to first audio (hardware dependent), single speaker

transformers, VibeVoice repository

sesame/csm-1b

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)

transformers, see card

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.

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.

Transcribing a long file with Whisper large-v3-turbo through the transformers pipeline
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.

Generating dialogue with Dia through the transformers model and processor classes
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.

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.

Transcribing with faster-whisper, with voice-activity filtering and word timestamps
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.

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.

Synthesising speech with Kokoro and writing WAV files
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.