Generated banner for Nemotron Speech
Generated logo for Nemotron Speech

Nemotron Speech

NVIDIAOfficialCreated by Nemotron Speech TeamDistributed by NVIDIA

  • Skill
  • Tool integration
  • Data and AI
  • Apache-2.0
  • Medium risk
  • Has scripts

From the author

Routes NVIDIA Nemotron Speech (Formerly Riva) NIM tasks — deploys, runs, and tests ASR, TTS, and NMT NIMs on build.nvidia.com or self-hosted.
— the description by Nemotron Speech Team

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

  1. Download the skill as a ZIP:

    https://autogineer.com/agent-skills/nvidia/nemotron-speech/download
  2. Unzip 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-client and a valid NVIDIA_API_KEY from https://build.nvidia.com.

  • Treat NVIDIA_API_KEY and NGC_API_KEY as secrets: never print, paste, commit, or log real key values. Prefer --password-stdin for Docker login and store persistent keys in a credential manager or a chmod 600 env file rather than world-readable shell startup files.

  • For self-hosted Docker model caching: host directories mounted at /opt/nim/.cache must be writable by the container user (the NIM container runs as nvs:1000 internally), not just the host user. Run sudo chown 1000:1000 $LOCAL_NIM_CACHE after 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/workspace inside the container isn't writable to arbitrary UIDs. If you see I/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) to references/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) to references/tts-custom.md.

  • Route TTS synthesis pipeline configuration — SSML, zero-shot voice cloning, applying an existing pronunciation dictionary, audio encoding, sample rate, custom_configuration keys — to references/tts-pipelines.md. (For discovering and constructing the pronunciation itself, use tts-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:

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_KEY and internet access

  • Public 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

Files

references/tts-pronunciation.md

Riva TTS Pronunciation Discovery and Dictionary Application

Agent: When walking the user through the discovery workflow, announce each step: Step N/3 — Step Title (e.g., "Step 1/3 — Generate IPA Candidates").

Source of truth. This skill describes a stable workflow for discovering and applying pronunciations. For per-release detail — which models support custom_dictionary, the exact IPA phone set for a given model, SSML <phoneme> tag support, --phone_dictionary_file riva-build parameter name — fetch or open the canonical doc page and answer from that, not from this skill's text. See Looking up current information below.


Purpose

Discover and apply the correct pronunciation for a specific word or phrase in Riva TTS. Covers the full workflow: generating IPA candidates using the agent's linguistic knowledge, synthesizing audio variants so the user can compare and choose, and then applying the chosen pronunciation in all three delivery formats.

Use this reference when: the user does not know the phoneme sequence for their word and needs to find it through listening and iteration.

Use tts-pipelines.md instead when: the user already knows the phoneme string and just needs help with the wire format or application method.

Looking up current information

Question typeFetch this page
IPA phone set for current Riva TTS modelshttps://docs.nvidia.com/nim/speech/latest/tts/phoneme-support.html
<phoneme> tag support and runtime custom-dictionary formathttps://docs.nvidia.com/nim/speech/latest/tts/customization.html
Build-time dictionary configuration and riva-build workflowhttps://docs.nvidia.com/nim/speech/latest/tts/custom-deployment.html
gRPC proto contract — SynthesizeSpeechRequest.custom_dictionary fieldhttps://docs.nvidia.com/nim/speech/latest/reference/api-references/tts/protos.html
--custom-dictionary CLI flag format for talk.pyhttps://docs.nvidia.com/nim/speech/latest/tts/customization.html

Do not infer from this skill's text: which IPA phone symbols a specific model supports, whether SSML <phoneme> is supported for the deployed model, or whether custom_dictionary is accepted. Use the phoneme-support page for the IPA inventory and the customization page for request-time feature support.


Prerequisites

  • A running TTS NIM (see tts.md)

  • pip install nvidia-riva-client

  • A voice name discovered via --list-voices (see tts.md Step 3)

  • The word or phrase to fix, and a short carrier sentence that contains it


IPA Phoneme Notation

Modern Riva / Nemotron Speech TTS models use IPA (International Phonetic Alphabet), not ARPABET/CMU, unless the model was built with --phone_set arpabet at riva-build time. The agent generates IPA candidates using its own linguistic knowledge — no external lookup tool is required for common English words.

Worked example — "NVIDIA":

LabelIPACharacter difference
AɛnˈvɪdiəInitial vowel ɛ (as in "bed"), primary stress on second syllable
BɪnˈvɪdiəInitial vowel ɪ (as in "it"), same stress
CɛnˈvidɪəVariant vowel in third syllable

Two key conventions:

  • ˈ marks primary stress on the following syllable; ˌ marks secondary stress. Omitting stress marks lets the model infer, but including them produces more consistent output.

  • ʌ and ɚ are not natively in modern models' phone sets — they are auto-converted to ə and ɝ respectively. Use ə and ɝ directly.

For the authoritative phone inventory, fetch the phoneme-support page from the routing table above.


Step 1 — Generate IPA Candidates

The agent produces 2–3 distinct IPA strings for the target word, labeled A, B, C. Each variant should differ in a meaningful and audible way — typically stress placement, initial or final vowel choice, or syllable reduction. Present them as a short table so the user can read the differences before listening.

Agent instruction: Generate variants using your linguistic knowledge. Do not use phone symbols that are absent from the model's phone set. Fetch the phoneme-support page if uncertain whether a specific symbol is supported.


Step 2 — Synthesize Audio Variants

Run this script to produce one WAV file per candidate. The user listens to each and picks the one that sounds correct.

Prerequisites: set SERVER and VOICE environment variables (or edit inline), then run:

export SERVER=0.0.0.0:50051              # or grpc.nvcf.nvidia.com:443 for cloud
export VOICE="<voice-name-from-list-voices>"
#!/usr/bin/env python3
import os, wave, riva.client
from riva.client.proto import riva_tts_pb2

SERVER   = os.getenv("SERVER", "0.0.0.0:50051")
VOICE    = os.getenv("VOICE", "")
is_cloud = "nvcf" in SERVER

WORD     = "NVIDIA"                              # word to fix
SENTENCE = f"Welcome to {WORD} neural inference."  # short carrier sentence

# Agent fills in these IPA candidates for the word above
CANDIDATES = {
    "A": "ɛnˈvɪdiə",
    "B": "ɪnˈvɪdiə",
    "C": "ɛnˈvidɪə",
}

md = None
if is_cloud:
    fid = os.environ["FUNCTION_ID"]
    md  = [["function-id", fid],
           ["authorization", f"Bearer {os.environ['NVIDIA_API_KEY']}"]]

auth = riva.client.Auth(uri=SERVER, use_ssl=is_cloud, metadata_args=md)
tts  = riva.client.SpeechSynthesisService(auth)
SR   = 44100

for label, ipa in CANDIDATES.items():
    # custom_dictionary wire format: "WORD  IPA"  ← double space between word and phonemes
    # Multiple entries: "WORD1  IPA1,WORD2  IPA2"  ← comma-separated, no spaces around comma
    req = riva_tts_pb2.SynthesizeSpeechRequest(
        text=SENTENCE,
        language_code="en-US",
        encoding=riva.client.AudioEncoding.LINEAR_PCM,
        sample_rate_hz=SR,
        voice_name=VOICE,
        custom_dictionary=f"{WORD}  {ipa}",
    )
    resp = tts.stub.Synthesize(req, metadata=auth.get_auth_metadata())
    fname = f"variant_{label.lower()}.wav"
    with wave.open(fname, "wb") as w:
        w.setnchannels(1); w.setsampwidth(2); w.setframerate(SR)
        w.writeframes(resp.audio)
    print(f"Wrote {fname}  (/{ipa}/)")

print("\nListen to variant_a.wav, variant_b.wav, variant_c.wav and tell me which sounds correct.")

Double-space rule: The custom_dictionary field uses two spaces between the word and its phoneme string: "WORD IPA". A single space silently misparses the entry, and the model falls back to its default G2P without error.


Step 3 — Apply the Chosen Pronunciation

After the user identifies their preferred variant, output all three delivery formats. The user can choose whichever fits their workflow.

Format 1 — Per-request custom_dictionary (runtime, no rebuild)

Pass the dictionary string directly in each synthesis request. No riva-build or riva-deploy needed.

Wire format:

Single word:   "NVIDIA  ɛnˈvɪdiə"
Multiple words: "NVIDIA  ɛnˈvɪdiə,NIM  nɪm"

Rules: double space between word and phonemes; comma-separated entries with no spaces around the comma; no trailing comma.

gRPC (inline quick path):

import os, 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="Welcome to NVIDIA.",
    language_code="en-US",
    encoding=riva.client.AudioEncoding.LINEAR_PCM,
    sample_rate_hz=44100,
    voice_name="<voice-name-from-list-voices>",
    custom_dictionary="NVIDIA  ɛnˈvɪdiə",
)
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 equivalent (reads from a file — see Format 3):

python3 python-clients/scripts/tts/talk.py \
  --server 0.0.0.0:50051 \
  --text "Welcome to NVIDIA." \
  --voice <VOICE_NAME> \
  --custom-dictionary my_pronunciations.txt \
  --output output.wav

Format 2 — SSML <phoneme> inline tag

Override pronunciation for a single occurrence of a word directly in the synthesis text, without a dictionary file.

<speak>
  Welcome to <phoneme alphabet="ipa" ph="ɛnˈvɪdiə">NVIDIA</phoneme> neural inference.
</speak>
import wave, riva.client

auth = riva.client.Auth(uri="0.0.0.0:50051")
tts  = riva.client.SpeechSynthesisService(auth)

ssml = '<speak>Welcome to <phoneme alphabet="ipa" ph="ɛnˈvɪdiə">NVIDIA</phoneme>.</speak>'
resp = tts.synthesize(
    text=ssml,
    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)

SSML <phoneme> support is per-model. Fetch the customization page to confirm your deployed model accepts SSML and specifically <phoneme alphabet="ipa">. A model that does not support SSML will silently ignore the tag and fall back to its default G2P pronunciation — no error is raised.


Format 3 — Session dictionary file (reuse across requests)

Build a persistent file of pronunciation overrides and load it for every request, or share it across team members.

File format — one entry per line, double space between word and IPA, UTF-8 encoding:

# Pronunciation dictionary — one WORD  IPA entry per line
# Lines starting with # and blank lines are ignored
NVIDIA  ɛnˈvɪdiə
NIM  nɪm
Riva  ˈɹiːvə

Load helper (Python):

def load_dict_file(path: str) -> str:
    """Read a session dictionary file and return the custom_dictionary wire string."""
    entries = []
    with open(path, encoding="utf-8") as f:
        for line in f:
            line = line.strip()
            if line and not line.startswith("#"):
                entries.append(line)
    return ",".join(entries)

# Usage:
custom_dictionary = load_dict_file("my_pronunciations.txt")
req = riva_tts_pb2.SynthesizeSpeechRequest(
    text="...",
    custom_dictionary=custom_dictionary,
    ...
)

talk.py usage — pass the file path directly (talk.py reads and formats it internally):

python3 python-clients/scripts/tts/talk.py \
  --server 0.0.0.0:50051 \
  --text "Welcome to NVIDIA NIM." \
  --voice <VOICE_NAME> \
  --custom-dictionary my_pronunciations.txt \
  --output output.wav

Build-time Option (Permanent Embedding)

If every request to a self-hosted NIM needs the same pronunciation overrides, bake the dictionary into the RMIR at build time using --phone_dictionary_file <path> in riva-build. This removes the need to pass custom_dictionary per-request but requires a full riva-build + riva-deploy cycle (see tts-custom.md).

The phone set selected at riva-build time must match the phoneme alphabet used in the dictionary file. Fetch the custom-deployment page and confirm the exact parameter name and accepted format with the matching image's riva-build ... -h output.


Troubleshooting

  • Pronunciation unchanged despite custom_dictionary — verify the double-space delimiter is present (not single space or tab); verify the model supports custom_dictionary for the deployed version by fetching the customization page; confirm the word spelling in the dictionary matches the exact spelling in the synthesis text (case-sensitive on some models).

  • SSML <phoneme> tag silently ignored — the model may not support SSML or may not support the <phoneme> tag specifically. Fetch the customization page and confirm SSML support for your model before debugging further.

  • IPA character causes synthesis error or unexpected sound — the IPA symbol may not be in the model's phone set, or a Unicode lookalike may have been substituted (e.g., Latin ɛ U+025B vs a visually similar character from another Unicode block). Copy IPA symbols from a verified source; check the phoneme-support page for the authoritative symbol list.

  • Multiple entries: last entry silently dropped — check for spaces around the comma separator or a trailing comma. Correct format: "WORD1 IPA1,WORD2 IPA2" — no whitespace around commas, no trailing comma.

  • Phone set mismatch at build time — --phone_set in riva-build must match the alphabet used in --phone_dictionary_file. Mixing IPA strings into an ARPABET-configured model produces garbled or default-G2P output.

Limitations

  • custom_dictionary and SSML <phoneme> support are per-model and per-release — verify feature support on the customization page and symbols on the phoneme-support page

  • IPA candidates are generated from the agent's linguistic knowledge; for high-stakes or unusual terms, cross-validate against a phonetic dictionary (e.g., CMU Pronouncing Dictionary) or a native-speaker reference recording

  • custom_dictionary applies per-request only; it does not persist across sessions unless included in every request or loaded from a session file

  • Build-time dictionary embedding requires riva-build + riva-deploy; see tts-custom.md

  • All phoneme strings must use UTF-8 encoding; ASCII-lookalike substitutions silently produce incorrect phonemes

  • x86_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