mcpField
V
voice-agents

voice-agents

github.com/sarvamai开发72188 次安装3 天前更新
代码仓库

关于 voice-agents

voice-agents 是一项使用 Sarvam 服务构建语音 Agent 的技能,面向采用 LiveKit 或 Pipecat 的 Python 开发者。它提供集成示例,并记录语音、模型和框架配置中的注意事项。

主要功能

  1. 01提供 LiveKit 集成示例
  2. 02提供 Pipecat 集成示例
  3. 03涵盖语音识别、合成与 LLM
  4. 04说明插件参数和模型限制

适用场景

  1. 01构建实时语音对话 Agent
  2. 02在 Pipecat 流程中组合语音识别与合成
  3. 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=Truesarvam.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 IDmodel="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-conversationsSarvam 推出了 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