Nemotron Speech
NVIDIAOfficialCreated by Nemotron Speech TeamDistributed by NVIDIA
- Skill
- Tool integration
- Data and AI
- Apache-2.0
- Medium risk
- Has scripts
AutoGineer summary
Written by AutoGineer from the skill’s own files, not by the author
Nemotron Speech acts as a central command interface for managing NVIDIA's speech AI NIMs. It provides a structured workflow for users to navigate deployment options, whether using cloud-hosted inference via build.nvidia.com or self-hosted Docker containers. The skill handles the routing of tasks across ASR, TTS, and NMT modalities, ensuring users follow the correct procedures for model selection, pipeline configuration, and system readiness checks.
What it does
- Routes users to specific workflows for ASR, TTS, and NMT deployment.
- Provides guidance on self-hosted Docker deployment and cloud-hosted inference.
- Assists with custom model builds using riva-build and riva-deploy.
- Facilitates ASR pipeline tuning including VAD, diarization, and language models.
- Supports TTS customization such as SSML, zero-shot voice cloning, and pronunciation dictionaries.
- Directs users to authoritative documentation for version-specific model and hardware requirements.
When to use it
- When you need to deploy or test NVIDIA Riva/Nemotron Speech NIMs.
- When configuring custom ASR or TTS pipelines for specific accuracy or vocabulary needs.
- When troubleshooting deployment readiness, GPU compatibility, or container health.
- When integrating speech-to-text, text-to-speech, or translation into an application.
Advantages
- Centralizes complex speech AI workflows into a single, navigable interface.
- Ensures adherence to official NVIDIA documentation and best practices.
- Simplifies the transition between cloud-hosted and self-hosted environments.
- Provides clear, step-by-step procedures for custom model deployment.
Usage examples
- “Deploy a Parakeet ASR NIM”
- The agent loads the ASR reference file and guides the user through the self-hosted deployment steps.
- “How do I fix the pronunciation of NIM in Riva TTS?”
- The agent loads the TTS pronunciation reference, suggests IPA candidates, and provides the necessary gRPC snippet.
- “Can my GPU run this?”
- The agent initiates the deployment readiness check workflow to verify system requirements.
- “Translate English to German”
- The agent loads the NMT reference file and walks the user through the translation deployment flow.
Install
Download the skill as a ZIP:
https://mp-staging.autogineer.com/agent-skills/nvidia/nemotron-speech/downloadUnzip it into the cross-client skills folder of your project:
mkdir -p .agents/skills && unzip nemotron-speech.zip -d .agents/skills
Documentation by Nemotron Speech Team
Nemotron Speech Skills
Note: "Nemotron Speech" is the public-facing name for what NVIDIA documents today as Riva / Riva NIM. All commands, container images, gRPC APIs, Python imports, and documentation URLs still use "Riva" — the rename is brand-only. Do not rename commands, images, or doc URLs.
Agent: When walking the user through a multi-step workflow, announce each step before presenting it: Step N/M — Step Title (e.g., "Step 1/4 — Deploy the Container").
Purpose
Single entry point for all NVIDIA Nemotron Speech (Riva) NIM workflows: ASR (speech-to-text), TTS (text-to-speech), and NMT (translation). Covers cloud-hosted inference via build.nvidia.com, self-hosted Docker deployment, client-protocol choice for ASR (gRPC, HTTP, WebSocket), custom NeMo model deployment via riva-build, ASR pipeline tuning (VAD, diarization, language models), and the prerequisite Docker / NGC / driver setup.
When to Use This Skill
Use this skill for any Nemotron Speech / Riva NIM task — deployment, testing, custom model build, system requirements check, or model selection across ASR / TTS / NMT modalities.
Workflow
Identify the user's task type, then load the corresponding reference file from references/. The reference files contain the detailed per-workflow content; this SKILL.md is a routing surface. Load only the reference relevant to the task at hand.
Prerequisites
For self-hosted deployment: NVIDIA AI Enterprise (NVAIE) entitlement, then complete the environment setup — NVIDIA drivers, Docker, Container Toolkit, NGC API key, Riva Python client. See
references/setup.md.For cloud-hosted inference:
pip install -U nvidia-riva-clientand a validNVIDIA_API_KEYfrom https://build.nvidia.com.Treat
NVIDIA_API_KEYandNGC_API_KEYas secrets: never print, paste, commit, or log real key values. Prefer--password-stdinfor Docker login and store persistent keys in a credential manager or achmod 600env file rather than world-readable shell startup files.For self-hosted Docker model caching: host directories mounted at
/opt/nim/.cachemust be writable by the container user (the NIM container runs asnvs:1000internally), not just the host user. Runsudo chown 1000:1000 $LOCAL_NIM_CACHEafter creating the directory so the container can write to it. Avoid world-writable modes — they let any local user replace cached model artifacts. Also avoid-u "$(id -u):$(id -g)"on the docker run —/opt/nim/workspaceinside the container isn't writable to arbitrary UIDs. If you seeI/O error Permission denied (os error 13)during model download, the host directory ownership is the issue.
Instructions
Match the user's task to one reference file and load only that file; the references are detailed, so progressive disclosure keeps context tight.
Route setup requests for drivers, Docker, Container Toolkit, and NGC to
references/setup.md.Route GPU compatibility, deployment readiness, and container health checks to
references/deployment-readiness-checks.md.Route model choice across ASR, TTS, and NMT to
references/model-selection.md.Route ASR deployment or inference for Parakeet, Canary, Whisper, and Nemotron ASR Streaming to
references/asr.md.Route custom-trained NeMo ASR deployment (
.nemo→ RMIR → NIM) toreferences/asr-custom.md.Route ASR pipeline configuration for VAD, diarization, language models, and chunk size to
references/pipelines.md.Route TTS deployment or inference for Magpie to
references/tts.md.Route custom or fine-tuned TTS model deployment (
.nemo→ RMIR → NIM) toreferences/tts-custom.md.Route TTS synthesis pipeline configuration — SSML, zero-shot voice cloning, applying an existing pronunciation dictionary, audio encoding, sample rate,
custom_configurationkeys — toreferences/tts-pipelines.md. (For discovering and constructing the pronunciation itself, usetts-pronunciation.md.)Route TTS pronunciation discovery — finding, testing, and applying IPA pronunciations for specific words or phrases — to
references/tts-pronunciation.md.Route NMT deployment or inference for Riva Translate, language pairs, and DNT tags to
references/nmt.md.
Source of truth
For per-release detail — current model catalog, container IDs, function IDs, voice lists, VRAM minimums, per-model feature support — fetch or open the canonical NVIDIA doc rather than relying on text in this SKILL.md or the references. Each reference file includes its own routing table to the relevant doc pages.
Top-level landing pages:
Examples
"Deploy a Parakeet ASR NIM" → load references/asr.md, follow Option B (self-hosted), Steps 1–4.
"Synthesize speech with Magpie" → load references/tts.md, follow Option A (cloud) or Option B (self-hosted).
"Translate English to German" → load references/nmt.md, follow the 4-step flow.
"Convert my fine-tuned .nemo to a NIM" → load references/asr-custom.md for the 4-phase pipeline and references/pipelines.md for build-time config.
"Deploy a custom fine-tuned TTS voice as a NIM" → load references/tts-custom.md for the 4-phase pipeline.
"Use zero-shot voice cloning with Magpie" → load references/tts-pipelines.md.
"Add SSML emphasis tags to my TTS request" → load references/tts-pipelines.md.
"'NVIDIA' sounds wrong in my Magpie TTS output — suggest a few IPA options to test" → load references/tts-pronunciation.md, generate IPA candidates, synthesize variants, then output all three delivery formats.
"How do I fix the pronunciation of 'NIM' in Riva TTS with a custom_dictionary in gRPC Python?" → load references/tts-pronunciation.md, propose IPA for 'NIM', show wire format and gRPC snippet.
"Can my GPU run this?" → load references/deployment-readiness-checks.md and run the 6-step system check.
"Which Riva model should I use?" → load references/model-selection.md, apply the decision framework, then fetch the support matrix for the specific current model name.
Naming & Terminology
Skill brand: Nemotron Speech (public-facing name).
Internal naming preserved: commands (
riva-build,riva-deploy,riva_streaming_asr_client), Python client (riva.client), gRPC namespace (nvidia.riva.asr.*), container registry (nvcr.io/nim/nvidia/*), and all NVIDIA documentation URLs still use "Riva". Do not rename these in code, commands, or docs.
Troubleshooting
For task-specific runtime or modality issues, use the relevant reference file (references/<task>.md). Cross-cutting readiness checks:
Container does not become ready →
references/deployment-readiness-checks.md(system check + health check table)Health check fails →
references/deployment-readiness-checks.mddocker pullfromnvcr.ioreturns 403 →references/setup.md(Step 5 — Docker login)Wrong base image / model architecture mismatch →
references/asr-custom.md(Phase 2 base image)VRAM / GPU compatibility →
references/deployment-readiness-checks.md, then verify on the support matrix
Limitations
x86_64 architecture only — WSL2 on Windows requires Podman and supports a subset of NIMs (see
references/setup.md)Self-hosted deployment requires an NVIDIA AI Enterprise license
Cloud-hosted inference requires an active
NVIDIA_API_KEYand internet accessPublic skill branding is "Nemotron Speech"; commands, container images, Python imports (
riva.client), gRPC services (nvidia.riva.*), and NVIDIA documentation URLs still use "Riva" — follow official docs and catalogs for naming, do not rename these in commands or code
Next Steps
Verify hardware compatibility:
references/deployment-readiness-checks.mdSet up the environment:
references/setup.mdPick a model:
references/model-selection.mdDeploy:
references/asr.md,references/tts.md, orreferences/nmt.md
Files
- ATTRIBUTION.mdAdded by AutoGineer917 B
- BENCHMARK.md10.7 KiB
- LICENSELicence file added by AutoGineer11.2 KiB
- SKILL.md11.7 KiB
- evals/EVAL.md1.2 KiB
- evals/evals.json17.3 KiB
- references/asr-custom.md14.6 KiB
- references/asr.md26.4 KiB
- references/deployment-readiness-checks.md7.8 KiB
- references/model-selection.md19.2 KiB
- references/nmt.md15.5 KiB
- references/pipelines.md16.3 KiB
- references/setup.md7.2 KiB
- references/tts-custom.md14.1 KiB
- references/tts-pipelines.md21.5 KiB
- references/tts-pronunciation.md13.3 KiB
- references/tts.md17.1 KiB
- scripts/main.pyScript13.3 KiB
- skill-card.md4.1 KiB
- skill.oms.sig7.5 KiB
references/tts-pipelines.md
Riva TTS Synthesis Pipeline Configuration
Note: Build-time options run
riva-buildinside the NIM container — enter with--entrypoint /bin/bash(seetts-custom.md). Most TTS customizations are runtime-only and do not require a rebuild.Source of truth. This skill describes synthesis pipeline concepts and parameter shapes, which are stable. For per-release detail — full parameter list, per-model
custom_configurationkeys, supported SSML tags, default sample rates, pronunciation dictionary format — fetch or open the canonical doc page and answer from that, not from this skill's text. See Looking up current information below.
Purpose
Configure TTS synthesis pipeline options: audio encoding, sample rate, offline vs streaming mode, SSML, per-request custom_configuration keys (e.g., emotional styles), zero-shot voice cloning, and custom pronunciation dictionaries. Most options are runtime-only (no rebuild needed). Build-time options (embedding a custom pronunciation dictionary at deploy time) require re-running riva-build and riva-deploy.
Looking up current information
| Question type | Fetch this page |
|---|---|
Request-time customization — SSML, custom dictionaries, and custom_configuration keys | https://docs.nvidia.com/nim/speech/latest/tts/customization.html |
| Voices and emotional styles | https://docs.nvidia.com/nim/speech/latest/tts/voices.html |
| Zero-shot voice cloning — supported models, prompt requirements, quality options | https://docs.nvidia.com/nim/speech/latest/tts/voice-cloning.html |
| Custom deployment and build-time synthesis options | https://docs.nvidia.com/nim/speech/latest/tts/custom-deployment.html |
gRPC proto contract — SynthesizeSpeechRequest, ZeroShotData, custom_configuration map | https://docs.nvidia.com/nim/speech/latest/reference/api-references/tts/protos.html |
| HTTP REST API — offline and streaming synthesis request fields and response formats | https://docs.nvidia.com/nim/speech/latest/reference/api-references/tts/http-tts.html |
| Realtime WebSocket API — OpenAI-realtime-compatible TTS sessions, event schemas | https://docs.nvidia.com/nim/speech/latest/reference/api-references/tts/realtime-tts.html |
| Current model catalog, voice lists, supported languages, VRAM minimums | https://docs.nvidia.com/nim/speech/latest/reference/support-matrix/tts.html |
| Latency / throughput benchmarks per model and GPU | https://docs.nvidia.com/nim/speech/latest/reference/performances/tts/performance.html |
| Get all build-time parameters from inside the container | riva-build --config-path=pkg://servicemaker.configs.tts --config-name=<model-config-name> -h |
Do not infer from this skill's text: which custom_configuration keys a specific model supports, which SSML tags are available, what the current default sample rate is, or whether zero-shot voice cloning is supported for a given model. Use the topic-specific pages above and the live model configuration.
Prerequisites
For runtime-only options (streaming mode, SSML,
custom_configuration, zero-shot, custom dictionaries per-request): a running TTS NIM (seetts.md) andpip install nvidia-riva-clientFor build-time options (embedding a pronunciation dictionary into the model repo): complete
tts-custom.mdfirst — NIM container available,NGC_API_KEYexported
Instructions
Determine first whether a rebuild is needed. Most TTS pipeline tuning is runtime-only and takes effect per-request. Build-time options (embedding a pronunciation dictionary into the model repo) require Phase 2–3 from tts-custom.md.
For runtime tuning: set the relevant parameters in your SynthesizeSpeechRequest or talk.py flags. Fetch the customization page for the authoritative list of per-model custom_configuration keys and supported SSML tags.
Offline vs Streaming Synthesis
Choose based on latency requirements and response size:
| Mode | RPC | When to use |
|---|---|---|
Offline (Synthesize) | Unary | Short to medium text; full audio needed before playback; gRPC response ≤ 4 MB |
Streaming (SynthesizeOnline) | Server-streaming | Long text; low time-to-first-audio; bypasses 4 MB gRPC limit |
The gRPC 4 MB limit is the hard boundary: a single Synthesize (offline) response cannot exceed 4 MB. At 16-bit PCM 22050 Hz mono, 4 MB ≈ 90 seconds of audio. For longer synthesis, use SynthesizeOnline (--stream in talk.py) or HTTP streaming.
Time-to-first-audio: streaming begins returning audio chunks as soon as the first TTS chunk is ready, before the full utterance is synthesized. Use streaming when playback latency matters more than simplicity.
gRPC:
# Offline
python3 python-clients/scripts/tts/talk.py \
--server 0.0.0.0:50051 \
--text "Your text here." \
--voice <VOICE_NAME> \
--output output.wav
# Streaming
python3 python-clients/scripts/tts/talk.py \
--server 0.0.0.0:50051 \
--text "Your text here." \
--voice <VOICE_NAME> \
--stream \
--output output.wavAudio Encoding
Two supported encodings:
| Encoding | Format | Best for |
|---|---|---|
LINEAR_PCM | Uncompressed 16-bit PCM | Maximum compatibility, lossless, larger files |
OGG_OPUS | Opus-compressed audio in Ogg container | Lower bandwidth, streaming, browser playback |
LINEAR_PCM is the default. Use OGG_OPUS when bandwidth matters or when the downstream player supports it. Verify per-model encoding support on the customization page — not all models expose Opus.
gRPC (inline quick path):
import os, wave, riva.client
auth = riva.client.Auth(uri="0.0.0.0:50051")
tts = riva.client.SpeechSynthesisService(auth)
resp = tts.synthesize(
text="Your text here.",
voice_name="<voice-name-from-list-voices>",
language_code="en-US",
encoding=riva.client.AudioEncoding.OGGOPUS, # or .LINEAR_PCM
sample_rate_hz=22050,
)
with open("output.ogg", "wb") as f:
f.write(resp.audio)HTTP:
# Offline — returns WAV (LINEAR_PCM)
curl -sS http://localhost:9000/v1/audio/synthesize --fail-with-body \
-F language=en-US \
-F text="Your text here." \
-F voice=<VOICE_NAME> \
--output output.wav
# Streaming — returns raw LPCM (NOT WAV); wrap with sox
curl -sS http://localhost:9000/v1/audio/synthesize_online --fail-with-body \
-F language=en-US \
-F text="Your text here." \
-F voice=<VOICE_NAME> \
-F sample_rate_hz=22050 \
--output output.raw
sox -b 16 -e signed -c 1 -r 22050 output.raw output.wavHTTP streaming returns raw LPCM, not WAV. The response has no WAV header. Pass the same sample rate you requested to
sox(-r <rate>). A mismatched rate produces pitched-wrong or sped-up output.
Sample Rate
The model synthesizes at its native sample rate. Requesting a different rate causes server-side resampling, which may reduce quality.
Default is model-specific — fetch from the support matrix or inspect the
GetRivaSynthesisConfigprobe output (seetts.mdStep 2)Common values: 22050 Hz (legacy models), 44100 Hz (higher-quality models)
Pass
--sample-rate-hztotalk.pyorsample_rate_hzin the gRPC request to request a specific rate
Do not hardcode a sample rate without checking the model's native rate on the support matrix — requesting lower than native discards quality; higher than native wastes bandwidth with no benefit.
SSML (Speech Synthesis Markup Language)
SSML allows per-word or per-phrase control over prosody, emphasis, breaks, and phoneme pronunciation. Support is per-model — not all Riva TTS models accept SSML input.
Before using SSML:
Fetch the customization page to confirm SSML support for your model
Verify which SSML tags the model accepts (supported tags vary by model version)
General usage pattern (wrap text in <speak> root):
import wave, riva.client
auth = riva.client.Auth(uri="0.0.0.0:50051")
tts = riva.client.SpeechSynthesisService(auth)
ssml_text = """<speak>
Welcome to <emphasis level="strong">NVIDIA</emphasis> TTS.
<break time="500ms"/>
Synthesis begins now.
</speak>"""
resp = tts.synthesize(
text=ssml_text,
voice_name="<voice-name-from-list-voices>",
language_code="en-US",
encoding=riva.client.AudioEncoding.LINEAR_PCM,
sample_rate_hz=44100,
)
with wave.open("output.wav", "wb") as w:
w.setnchannels(1); w.setsampwidth(2); w.setframerate(44100)
w.writeframes(resp.audio)Do not assume specific SSML tag support from this skill's text — fetch the customization page and answer from the fetched content.
Custom Configuration Keys (custom_configuration)
custom_configuration is a per-request string-to-string map for model-specific synthesis parameters. Common uses: emotional styles, speaking rate adjustments, exaggeration factors.
These keys are per-model and per-release — always fetch the customization page to find which keys a given model supports and what their valid ranges are.
gRPC (inline quick path):
import wave, riva.client
from riva.client.proto import riva_tts_pb2
auth = riva.client.Auth(uri="0.0.0.0:50051")
tts = riva.client.SpeechSynthesisService(auth)
req = riva_tts_pb2.SynthesizeSpeechRequest(
text="Hello, this is expressive synthesis.",
language_code="en-US",
encoding=riva.client.AudioEncoding.LINEAR_PCM,
sample_rate_hz=44100,
voice_name="<voice-name-from-list-voices>",
custom_configuration={
"exaggeration_factor": "1.5", # example key — verify on the customization page
},
)
resp = tts.stub.Synthesize(req, metadata=auth.get_auth_metadata())
with wave.open("output.wav", "wb") as w:
w.setnchannels(1); w.setsampwidth(2); w.setframerate(44100)
w.writeframes(resp.audio)talk.py (comma-separated key:value pairs):
python3 python-clients/scripts/tts/talk.py \
--server 0.0.0.0:50051 \
--text "Hello, this is expressive synthesis." \
--voice <VOICE_NAME> \
--custom-configuration "exaggeration_factor:1.5" \
--output output.wavDo not infer key names or valid ranges from this skill's text — fetch the customization page.
Zero-Shot Voice Cloning
Zero-shot synthesis lets you synthesize in a new voice from a short audio prompt (reference audio + transcript), without fine-tuning. Support is per-model — not all deployed NIMs expose this capability.
Agent: Run the pre-flight check below before providing zero-shot synthesis code or proceeding with any zero-shot workflow. Do not skip this step even if the user says "I already deployed the right model." A model that does not support zero-shot returns no error during deployment — the failure only surfaces at inference time as an
UNIMPLEMENTEDgRPC error or silent fallback. The pre-flight check catches this before the user wastes time preparing audio prompts.
Zero-Shot Pre-flight Check
Run this probe to confirm that the deployed NIM actually supports zero-shot synthesis:
#!/usr/bin/env python3
import sys, riva.client
from riva.client.proto.riva_tts_pb2 import (
RivaSynthesisConfigRequest, SynthesizeSpeechRequest, ZeroShotData,
)
from riva.client.proto.riva_audio_pb2 import AudioEncoding
SERVER = "0.0.0.0:50051" # adjust if cloud or non-default port
auth = riva.client.Auth(uri=SERVER)
tts = riva.client.SpeechSynthesisService(auth)
# Step 1 — confirm NIM is healthy and a model is loaded
try:
cfg = tts.stub.GetRivaSynthesisConfig(
RivaSynthesisConfigRequest(), metadata=auth.get_auth_metadata()
)
except Exception as e:
print(f"BLOCKED: NIM not reachable — {e}"); sys.exit(1)
if not cfg.model_config:
print("BLOCKED: NIM responded but no TTS models are loaded."); sys.exit(1)
for m in cfg.model_config:
print(f"Running model: {m.model_name}")
# Step 2 — probe zero-shot capability with a minimal dummy request
# The probe intentionally uses invalid audio data.
# UNIMPLEMENTED / "not supported" → model does not support zero-shot → BLOCKED
# INVALID_ARGUMENT / any other error → model accepts ZeroShotData but rejected bad input → OK
try:
probe = SynthesizeSpeechRequest(
text="probe",
language_code="en-US",
encoding=AudioEncoding.LINEAR_PCM,
sample_rate_hz=22050,
zero_shot_data=ZeroShotData(
audio_prompt=b"\x00" * 100, # intentionally invalid; triggers INVALID_ARGUMENT if supported
sample_rate_hz=16000,
encoding=AudioEncoding.LINEAR_PCM,
quality=1,
transcript="probe",
),
)
tts.stub.Synthesize(probe, metadata=auth.get_auth_metadata())
# Unexpectedly succeeded — zero-shot is supported
print("OK: zero-shot is supported by the running model.")
except Exception as e:
err = str(e).lower()
if "unimplemented" in err or "not supported" in err or "zero_shot" in err or "zero-shot" in err:
print(f"BLOCKED: the deployed model does not support zero-shot synthesis.\n {e}")
print("\nNext steps:")
print(" 1. Check the TTS support matrix for models that advertise zero-shot capability.")
print(" 2. Redeploy using a zero-shot-capable model (e.g., a Magpie variant — verify on support matrix).")
print(" 3. Re-run this check after redeployment before proceeding.")
sys.exit(1)
# Any other error (e.g., INVALID_ARGUMENT) means the server accepted ZeroShotData
# but rejected our dummy input — zero-shot IS available on this model
print(f"OK: zero-shot is supported (probe rejected dummy input as expected: {type(e).__name__}).")If the check exits with code 1: stop here. Do not proceed with zero-shot synthesis. Redeploy with a zero-shot-capable model (fetch the TTS support matrix for the current list) and re-run the check.
If the check prints OK: proceed with the synthesis steps below.
Requirements (verify on the voice-cloning page):
A 5–30 second clean audio clip of the target voice (WAV, mono, 16-bit PCM recommended)
The verbatim transcript of that audio clip
A model that passed the pre-flight check above
quality parameter: integer 1–40 (default 20). Higher values improve voice similarity at the cost of synthesis latency. Fetch the voice-cloning page for per-model guidance on valid range and recommended starting point.
Inline quick path (gRPC):
import wave, riva.client
from riva.client.proto import riva_tts_pb2
# Read the reference audio prompt
with open("reference_audio.wav", "rb") as f:
audio_prompt = f.read()
# Get sample rate from WAV header
with wave.open("reference_audio.wav") as w:
prompt_sr = w.getframerate()
auth = riva.client.Auth(uri="0.0.0.0:50051")
tts = riva.client.SpeechSynthesisService(auth)
req = riva_tts_pb2.SynthesizeSpeechRequest(
text="Text to synthesize in the cloned voice.",
language_code="en-US",
encoding=riva.client.AudioEncoding.LINEAR_PCM,
sample_rate_hz=44100,
zero_shot_data=riva_tts_pb2.ZeroShotData(
audio_prompt=audio_prompt,
sample_rate_hz=prompt_sr,
encoding=riva.client.AudioEncoding.LINEAR_PCM,
quality=20,
transcript="The exact verbatim transcript of the reference audio.",
),
)
resp = tts.stub.Synthesize(req, metadata=auth.get_auth_metadata())
with wave.open("output.wav", "wb") as out:
out.setnchannels(1); out.setsampwidth(2); out.setframerate(44100)
out.writeframes(resp.audio)Audio prompt quality matters. A clean, quiet recording with no background noise produces significantly better voice similarity. Stereo files must be downmixed to mono before use:
ffmpeg -i input.wav -ac 1 -ar 16000 prompt.wav. Resampling artifacts or clipping in the prompt noticeably degrade similarity.
Custom Pronunciation Dictionaries
Override how specific words or phrases are pronounced using grapheme-to-phoneme (G2P) mappings. Support and format are per-model — verify on the customization page.
Runtime per-request (no rebuild required):
Pass the dictionary as a string in the custom_dictionary field. The phoneme format (CMU ARPA, IPA, etc.) is model-specific — fetch from the customization page.
import wave, riva.client
from riva.client.proto import riva_tts_pb2
auth = riva.client.Auth(uri="0.0.0.0:50051")
tts = riva.client.SpeechSynthesisService(auth)
# Dictionary format is model-specific — fetch from the customization page
custom_dict = """
NVIDIA en-US N IH V IH D IY AH
NIM en-US N IH M
"""
req = riva_tts_pb2.SynthesizeSpeechRequest(
text="NVIDIA NIM enables fast inference.",
language_code="en-US",
encoding=riva.client.AudioEncoding.LINEAR_PCM,
sample_rate_hz=44100,
voice_name="<voice-name-from-list-voices>",
custom_dictionary=custom_dict,
)
resp = tts.stub.Synthesize(req, metadata=auth.get_auth_metadata())
with wave.open("output.wav", "wb") as w:
w.setnchannels(1); w.setsampwidth(2); w.setframerate(44100)
w.writeframes(resp.audio)Build-time (embedded into model repository):
Embedding a pronunciation dictionary at build time avoids passing it per-request, but requires re-running riva-build and riva-deploy (see tts-custom.md). The build-time parameter name and dictionary path format are per-model — fetch the custom-deployment page and confirm with the image-specific riva-build ... -h output.
Get All Available Build-Time Parameters
To see all configurable parameters for the version you're running, enter the NIM container and run:
riva-build --config-path=pkg://servicemaker.configs.tts --config-name=<model-config-name> -hThe --config-name value is per TTS model family — fetch or open the custom-deployment page and confirm it with the matching image's --help output. Defaults shown in this skill are illustrative and may differ per release.
Examples
Streaming synthesis to WAV:
python3 python-clients/scripts/tts/talk.py \
--server 0.0.0.0:50051 \
--text "Streaming synthesis reduces time to first audio." \
--voice <VOICE_NAME> \
--stream \
--sample-rate-hz 44100 \
--output output.wavHTTP streaming output converted to WAV:
curl -sS http://localhost:9000/v1/audio/synthesize_online --fail-with-body \
-F language=en-US \
-F text="Convert raw LPCM to WAV with sox." \
-F voice=<VOICE_NAME> \
-F sample_rate_hz=22050 \
--output output.raw
sox -b 16 -e signed -c 1 -r 22050 output.raw output.wavSynthesis with custom_configuration (verify key names on customization page):
python3 python-clients/scripts/tts/talk.py \
--server 0.0.0.0:50051 \
--text "Expressive synthesis with custom parameters." \
--voice <VOICE_NAME> \
--custom-configuration "exaggeration_factor:1.5" \
--output output.wavLookup flow — agent question "does Magpie TTS support zero-shot voice cloning?":
Fetch or open the voice-cloning page
Confirm that the deployed Magpie model is listed as zero-shot capable
Answer from the fetched content
Do not answer feature-support questions from this skill's text alone.
Troubleshooting
gRPC 4 MB limit hit — switch to
--stream(SynthesizeOnline) or HTTP streaming for long text. At 22050 Hz 16-bit PCM mono, 4 MB ≈ 90 seconds.HTTP streaming output not playable — the
/v1/audio/synthesize_onlineendpoint returns raw LPCM with no WAV header. Always wrap withsox -b 16 -e signed -c 1 -r <rate> output.raw output.wavusing the exact rate you requested in the API call.custom_configurationkey rejected or silently ignored — key names and valid ranges are per-model and per-release. Fetch the customization page to confirm supported keys for your model.SSML tags silently ignored — not all models support SSML, and models that do support a subset of tags. Fetch the customization page to confirm SSML support before debugging.
Zero-shot pre-flight check exits with BLOCKED — the deployed model does not support zero-shot synthesis. Fetch the TTS support matrix to identify a zero-shot-capable model, redeploy, and re-run the check before attempting synthesis.
Zero-shot pre-flight check returns UNIMPLEMENTED — same as above;
UNIMPLEMENTEDis the gRPC status code returned when the server has no handler forZeroShotData. Redeploy with a supported model.Zero-shot voice similarity poor — check audio prompt quality: background noise, resampling artifacts, clipping, or stereo-to-mono issues all degrade similarity. Use a clean mono 16-bit PCM prompt.
Sample rate mismatch in sox conversion — always pass to
soxthe exactsample_rate_hzyou requested in the API call; a mismatch produces pitched-wrong or sped-up output.Voice name not recognized after custom NIM launch — voice names exposed by a custom NIM depend on the trained checkpoint. Run
--list-voicesagainst the running NIM to discover the actual names.
Limitations
custom_configurationkeys, SSML tags, and zero-shot support are per-model and change per release — verify request-time options on the customization page and zero-shot behavior on the voice-cloning pageZero-shot voice cloning requires a model that supports it; not all TTS NIMs expose this capability
Build-time pronunciation dictionary embedding requires a full
riva-build+riva-deploycycle (seetts-custom.md)HTTP streaming (
/v1/audio/synthesize_online) returns raw LPCM, not WAV — client-side wrapping withsoxor equivalent is always requiredgRPC unary responses (
Synthesize) are capped at 4 MB — approximately 90 seconds at 22050 Hz 16-bit PCM monox86_64 architecture only for self-hosted deployment
Requirements and compatibility
Works with: Claude Code, Claude apps, OpenAI Codex, GitHub Copilot, Cursor, Gemini CLI, Kiro, OpenCode, Goose, Amp, Roo Code, JetBrains Junie, Factory Droid, Devin (ex-Windsurf), Mistral Vibe, OpenHands, Letta
“Works with” means the tool reads the open Agent Skills format; a skill written for one tool may use features others lack.
Needs: Needs an API key, Needs Python
Security
What our scanner noticed· Medium risk
- Large base64-encoded blobs
- Instructions that use the network
- Scripts that your agent may run
This skill includes scripts that your agent may run. Read them before you use it.
A static scan is not a guarantee. Skills are third-party content: review a skill before you let an agent use it.
Attribution and licence
- Created by
- Nemotron Speech Team
- Publisher
- NVIDIA (Official)
- Distributed by
- NVIDIA
- Source
- NVIDIA/skills · skills/nemotron-speech · commit fce3cca
- Licence
- Apache License 2.0 (redistribution allowed)
- LICENSE (added by AutoGineer from LICENSE-APACHE)
- ATTRIBUTION.md (written by AutoGineer)
- Synced
AutoGineer is not affiliated with or endorsed by Nemotron Speech Team or NVIDIA.
Download ZIP
The ZIP holds the skill’s files, its licence files and an ATTRIBUTION.md. Download nemotron-speech.zip