Add a new voice handler or feature to the voice module
Add new voice features to apps/artagent/backend/voice/.
"""
Voice Feature Module
====================
Brief description of the voice feature.
"""
from __future__ import annotations
from typing import TYPE_CHECKING
from apps.artagent.backend.voice.shared.context import VoiceSessionContext, TransportType
from apps.artagent.backend.voice.shared.handoff_service import HandoffService
from apps.artagent.backend.voice.shared.metrics_factory import LazyMeter, build_session_attributes
from utils.ml_logging import get_logger
if TYPE_CHECKING:
from azure.cognitiveservices.speech import SpeechConfig
logger = get_logger(__name__)
# Lazy metrics
_meter = LazyMeter("voice.my_feature", version="1.0.0")
_latency = _meter.histogram(
name="voice.my_feature.latency",
description="Feature latency",
unit="ms",
)
async def handle_my_feature(
context: VoiceSessionContext,
data: bytes,
) -> None:
"""
Handle voice feature.
Args:
context: Voice session context (use instead of websocket.state)
data: Input data to process
"""
# Transport-aware processing
if context.transport_type == TransportType.BROWSER:
sample_rate = 48000
elif context.transport_type == TransportType.ACS:
sample_rate = 16000
else:
sample_rate = 24000 # VoiceLive
# Process and record metrics
attrs = build_session_attributes(context.session_id)
_latency.record(latency_ms, attributes=attrs)
voice/ or appropriate subdirectoryVoiceSessionContext instead of websocket.statevoice. prefixfrom apps.artagent.backend.voice.shared.context import VoiceSessionContext
context = VoiceSessionContext.from_websocket(websocket)
session_id = context.session_id
transport = context.transport_type
from apps.artagent.backend.voice.tts import TTSPlayback
tts = TTSPlayback(context)
await tts.speak(text) # Auto-routes to browser/ACS/VoiceLive
from apps.artagent.backend.voice.shared.handoff_service import HandoffService
handoff_service = HandoffService(
scenario_name=scenario_name,
handoff_map=handoff_map,
agents=agents,
memo_manager=memo_manager,
)
resolution = handoff_service.resolve_handoff(from_agent, to_agent)
from typing import TYPE_CHECKING
if TYPE_CHECKING:
from azure.cognitiveservices.speech import SpeechConfig
def create_speech_config() -> "SpeechConfig":
from azure.cognitiveservices.speech import SpeechConfig
return SpeechConfig(...)
VoiceSessionContext instead of websocket.stateTTSPlayback for audio outputLazyMeter pattern for metricsvoice. prefixSee voice-module.instructions.md for full patterns and contracts.
npx skills add Azure-Samples/add-voice-handler下载完整 Skill 目录,包含 SKILL.md 及所有相关文件
Search for places (restaurants, cafes, etc.) via Google Places API proxy on localhost.
Interact with GitHub using the `gh` CLI. Use `gh issue`, `gh pr`, `gh run`, and `gh api` for issues, PRs, CI runs, and advanced queries.
Create or update AgentSkills. Use when designing, structuring, or packaging skills with scripts, references, and assets.
Start voice calls via the OpenClaw voice-call plugin.
Notion API for creating and managing pages, databases, and blocks.
Gemini CLI for one-shot Q&A, summaries, and generation.
Category:developer