关于 voice-agents
voice-agents 是一项使用 Sarvam 服务构建语音 Agent 的技能,面向采用 LiveKit 或 Pipecat 的 Python 开发者。它提供集成示例,并记录语音、模型和框架配置中的注意事项。
主要功能
- 01提供 LiveKit 集成示例
- 02提供 Pipecat 集成示例
- 03涵盖语音识别、合成与 LLM
- 04说明插件参数和模型限制
适用场景
- 01构建实时语音对话 Agent
- 02在 Pipecat 流程中组合语音识别与合成
- 03配置电话场景的音频采样率
MCP 相关
README 指出,聊天内的一次性语音与配音功能由 sarvam-mcp 的 `sarvam_tools_voice` 和 `_dub` 提供;此技能侧重 LiveKit/Pipecat Agent 代码。
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ sarvamai/ skills --skill voice-agents安装后在 Claude Code 中输入/voice-agents确认已加载。
详细介绍
语音 Agent — Sarvam AI
一次性聊天内语音/配音 → sarvam-mcp(
sarvam_tools_voice/_dub)。此技能 = LiveKit/Pipecat Agent 代码。
重要
认证:使用
api-subscription-key标头——而非Authorization: Bearer。环境变量:SARVAM_API_KEY
LiveKit 快速入门
pip install "livekit-agents[sarvam,silero]" python-dotenv
from livekit.agents import JobContext, WorkerOptions, cli
from livekit.agents.voice import Agent, AgentSession
from livekit.plugins import sarvam
class VoiceAgent(Agent):
def __init__(self) -> None:
super().__init__(
instructions="You are a helpful voice assistant. Be friendly, concise, and conversational.",
stt=sarvam.STT(
language="unknown", # auto-detect; or "hi-IN", "ta-IN", etc.
model="saaras:v3",
mode="transcribe",
flush_signal=True # emits speech start/end events for turn-taking
),
llm=sarvam.LLM(model="sarvam-105b"),
tts=sarvam.TTS(
target_language_code="en-IN",
model="bulbul:v4-flash",
speaker="simran_en_customer",
),
)
async def on_enter(self):
self.session.generate_reply()
async def entrypoint(ctx: JobContext):
# Do NOT pass vad= — VAD is handled internally by the Sarvam plugin
session = AgentSession(
turn_detection="stt", # let Sarvam STT handle turn detection
min_endpointing_delay=0.07 # ~70ms matches Sarvam STT processing latency
)
await session.start(agent=VoiceAgent(), room=ctx.room)
if __name__ == "__main__":
cli.run_app(WorkerOptions(entrypoint_fnc=entrypoint))
运行 python agent.py dev,使用 python agent.py console 测试。
Pipecat 快速入门
pip install "pipecat-ai[daily,sarvam]" python-dotenv loguru
import os
from pipecat.pipeline.pipeline import Pipeline
from pipecat.processors.aggregators.llm_context import LLMContext
from pipecat.processors.aggregators.llm_response_universal import LLMContextAggregatorPair
from pipecat.services.sarvam.stt import SarvamSTTService
from pipecat.services.sarvam.tts import SarvamTTSService
from pipecat.services.sarvam.llm import SarvamLLMService
stt = SarvamSTTService(
api_key=os.getenv("SARVAM_API_KEY"),
language="unknown", # auto-detect; or "hi-IN", "ta-IN", etc.
model="saaras:v3",
mode="transcribe" # or "translate" for speech-to-English
)
tts = SarvamTTSService(
api_key=os.getenv("SARVAM_API_KEY"),
settings=SarvamTTSService.Settings(
model="bulbul:v4-flash",
voice="simran_en_customer", # persona ID — not a v3 short name
language="en-IN",
pace=1.0,
),
)
llm = SarvamLLMService(
api_key=os.getenv("SARVAM_API_KEY"),
settings=SarvamLLMService.Settings(model="sarvam-105b"),
)
messages = [{"role": "system", "content": "You are a friendly AI assistant. Keep responses brief."}]
context_aggregator = LLMContextAggregatorPair(LLMContext(messages))
pipeline = Pipeline([
transport.input(), # Daily or WebRTC transport
stt,
context_aggregator.user(),
llm,
tts,
transport.output(),
context_aggregator.assistant(),
])
JavaScript/TypeScript 说明
LiveKit 和 Pipecat Agent 仅支持 Python。对于 JS/TS 语音管道,请直接使用各个 SDK 方法:
import { SarvamAIClient } from "sarvamai";
const client = new SarvamAIClient({ apiSubscriptionKey: "YOUR_SARVAM_API_KEY" });
// STT: client.speechToText.transcribe({...})
// TTS: client.textToSpeech.convertStream({...}) // returns BinaryResponse
// LLM: client.chat.completions({...})
注意事项
| 注意事项 | 详情 |
|---|---|
LiveKit:不要使用 vad= | 不要向 AgentSession 传入 vad=——VAD 由 Sarvam 插件在内部处理。改为设置 turn_detection="stt" 和 min_endpointing_delay=0.07。 |
LiveKit:flush_signal=True | sarvam.STT 必须设置此项,才能触发语音开始/结束事件并正确进行轮流对话。 |
| 不同插件的 TTS 语音参数不同 | LiveKit(livekit-plugins-sarvam 最高至 1.5.2):使用 target_language_code + speaker。sarvam.TTS() 不接受 language_code=。Pipecat(1.0):使用 settings=SarvamTTSService.Settings(voice=..., language=..., model=...)——参数是 voice,不是 speaker,也不能直接作为构造函数关键字参数传入。 |
| v4 说话人使用 persona ID | model="bulbul:v4-flash" 需要 voice_language_style(simran_en_customer、aparna_hi_customer)。短名称(shubh、anand、priya)会返回 400。模型不是 v3 时,如果未指定说话人,LiveKit 会默认使用 anushka——务必传入 speaker。印地语:aparna_hi_customer。泰米尔语:gokul_ta_narration。ml-IN / od-IN 没有 v4 persona——这些语言请使用 bulbul:v3。 |
| Pipecat 类名 | 从 pipecat.services.sarvam.stt/.tts/.llm 导入 SarvamSTTService/SarvamTTSService/SarvamLLMService——不是 SarvamSTT。LLM 模型要在 SarvamLLMService.Settings(model=...) 中指定,系统提示词要放在 LLMContext 消息中。 |
sarvam-30b 已弃用,且现在会在 API 层直接报错 | 已通过实时调用验证:现在通过聊天 API 调用 sarvam-30b 会返回 400:"Model 'sarvam-30b' has been deprecated. Please use one of the available models instead: sarvam-105b, sarvam-105b-conversations." 基于 sarvam-30b 构建的 Pipecat 管线仍可正常构建(见下文),但每轮 LLM 对话运行时都会失败——这不是未来可能发生的风险,如果你正在使用它,现在就已经无法正常工作。 |
你安装的 Pipecat 允许列表中可能还没有 sarvam-105b-conversations | Sarvam 推出了 sarvam-105b-conversations——一种具有 32K 上下文、专为实时对话/语音 Agent 后训练的变体,也就是以前由 sarvam-30b 占据的型号。针对 pipecat-ai==0.0.108 的实时验证结果:SarvamLLMService._SUPPORTED_MODELS 为 frozenset({"sarvam-105b", "sarvam-105b-32k", "sarvam-30b", "sarvam-30b-16k"})——其中尚未包含 sarvam-105b-conversations,此时构造 SarvamLLMService(settings=SarvamLLMService.Settings(model="sarvam-105b-conversations")) 会立即引发 ValueError: Unsupported Sarvam LLM model 'sarvam-105b-conversations'. Allowed values: sarvam-105b, sarvam-105b-32k, sarvam-30b, sarvam-30b-16k.。另请注意,同一个允许列表在构造时仍会接受 sarvam-30b/sarvam-30b-16k,尽管这些型号现在在 API 层已不可用(见上一行)——构造成功并不代表模型可用。切换到 sarvam-105b-conversations 前,请检查你所安装的 pipecat-ai 版本的允许列表;如果其中还没有该型号,请使用普通的 sarvam-105b。 |
max_tokens 配额 | Sarvam 模型会在内部进行推理。不要将 max_tokens 设得过低,否则 content 会是 None。省略此项、设为 500 或更高,或使用 reasoning_effort=None 禁用推理。 |
| TTS 音高/响度 | 对于 bulbul:v4-flash,pitch 范围为 −0.5–0.5,loudness 范围为 0.1–2.5。Bulbul v3 现在也接受这些参数(已于 2026-10-06 实时验证);pace 范围为 0.5–2.0。超出范围的值会返回 400。 |
| STT WebSocket 编解码器 | 仅支持 wav/pcm——流式传输不支持 MP3/AAC/OGG。 |
| 用于 TTS 的 HTTP 流 | convert_stream 会直接返回二进制音频(不使用 base64),更适合用于管线。 |
| 电话服务 | 对于电话 Agent(例如 Exotel),请将 audio_in_sample_rate=8000 和 audio_out_sample_rate=8000 设为与电话音频匹配。 |
完整文档
从以下链接获取框架集成指南、环境设置和高级模式:
评论
支持 Markdown