voice-agents について
voice-agentsは、Sarvamのサービスで音声エージェントを構築するPython開発者向けのスキルです。LiveKitとPipecatの例に加え、音声やモデル、フレームワークの設定上の注意点を扱います。
主な機能
- 01LiveKit連携例
- 02Pipecat連携例
- 03音声認識、合成、LLMの説明
- 04プラグイン設定とモデル制限
活用シーン
- 01リアルタイム音声エージェントの構築
- 02Pipecatパイプラインで音声認識と合成を組み合わせる
- 03電話向け音声サンプルレートの設定
MCP 対応
READMEによると、チャット内の単発音声処理と吹き替えはsarvam-mcpの`sarvam_tools_voice`と`_dub`が担い、このスキルはLiveKit/Pipecatのエージェントコードを扱います。
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ sarvamai/ skills --skill voice-agentsインストール後、Claude Code で/voice-agentsを入力して読み込まれたか確認します。
詳細
音声エージェント — Sarvam AI
チャット内で一度だけ実行する音声/吹き替え → sarvam-mcp(
sarvam_tools_voice/_dub)。このスキルは LiveKit/Pipecat エージェントのコードです。
重要
認証:
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 のエージェントは 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(1.5.2 までの livekit-plugins-sarvam):target_language_code と speaker を使用します。sarvam.TTS() の language_code= は拒否されます。Pipecat(1.0):settings=SarvamTTSService.Settings(voice=..., language=..., model=...) を使用します。speaker ではなく voice を使い、コンストラクターにキーワード引数を直接渡さないでください。 |
| v4 の話者はペルソナ 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 ペルソナはありません。その場合は 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-30b が担っていた枠に相当する、リアルタイムの対話/音声エージェント向けに特化して事後学習された 32K コンテキストのバリアント、sarvam-105b-conversations を提供しています。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. が発生します。なお、この同じ許可リストでは API レベルですでに使用できない sarvam-30b/sarvam-30b-16k も、構築時には問題なく受け入れられます(上の行を参照)。構築に成功しても、モデルが動作するとは限りません。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 ではありません)。パイプラインに適しています。 |
| テレフォニー | 電話エージェント(Exotel など)では、テレフォニーの音声に合わせて audio_in_sample_rate=8000 と audio_out_sample_rate=8000 を設定してください。 |
ドキュメント全文
以下から、フレームワークとの統合ガイド、環境設定、応用パターンを確認できます。
- https://docs.sarvam.ai/llms.txt — 包括的なドキュメントのインデックス
- LiveKit ガイド
- Pipecat ガイド
- Bulbul v4 Flash の音声
- レート制限
コメント
Markdown 対応