Install
openclaw skills install @thcjp/azure-ai-voicelive-pyopenclaw skills install @thcjp/azure-ai-voicelive-py| 参数名 | 类型 | 必填 | 说明 |
|---|---|---|---|
| input | string | 是 | Azure实时语音AI开发处理的输入数据或指令 |
| options | object | 否 | 附加配置选项,如模式选择、格式偏好等 |
| callback_url | string | 否 | 异步处理完成后的回调通知URL |
| 能力 | 免费版 | 付费版 |
|---|---|---|
| 基础功能 | 支持 | 支持 |
| 代码静态分析与质量评分 | 不支持 | 支持 |
| 依赖漏洞检测与升级建议 | 不支持 | 支持 |
| 批量代码审查与报告生成 | 不支持 | 支持 |
| CI/CD流水线集成 | 不支持 | 支持 |
| 依赖项 | 类型 | 是否必需 | 获取方式 |
|---|---|---|---|
| LLM API | API | 必需 | 由Agent内置LLM提供 |
需要配置对应API Key,详见上文环境配置章节
API Key配置方式:
export API_KEY="${API_KEY:?请设置环境变量}"
配置后需重启会话或开启新终端生效。API Key应妥善保管,避免泄露到版本控制系统.
azure.ai.voicelive.aio.connect 建立与Azure认知服务的WebSocket双向流式连接,使用 gpt-4o-realtime-preview 等实时模型进行低延迟语音对话VoiceLiveConnection 的六大资源: session(会话配置)、response(模型响应)、input_audio_buffer(音频输入)、output_audio_buffer(音频输出)、conversation(对话状态)、transcription_session(转写配置)server_vad) 与Azure语义VAD (azure_semantic_vad / azure_semantic_vad_en / azure_semantic_vad_multilingual) 多种端点检测模式,可调阈值、静音时长与前缀填充alloy、echo、shimmer、sage、coral、ash、ballad、verse 八种OpenAI音色,以及 AzureStandardVoice、AzureCustomVoice、AzurePersonalVoice 三类Azure原生语音FunctionTool): 模型生成调用参数后通过 conversation.item.create 回填JSON输出并触发 response.create 完成多轮工具链input_audio_buffer.speech_started 事件后调用 response.cancel 与 output_audio_buffer.clear 实现用户打断响应pcm16 (24kHz默认)、pcm16-8000hz、pcm16-16000hz、g711_ulaw、g711_alaw 多种音频格式,适配电话、语音助手、高保真等场景DefaultAzureCredential(托管身份/AAD令牌)与 AzureKeyCredential(API密钥),前者通过 credential_scopes 指定作用域详细的输入输出格式请参考下方章节说明。
azure-ai-voicelive-py的相关能力transcription_session 持续输出 conversation.item.input_audio_transcription.delta 与 completed 事件,生成可读字幕流g711_ulaw/g711_alaw 8kHz格式接入SIP/PSTN电话网络,搭配 azure_semantic_vad 处理短促话音conversation.item.create 注入历史上下文,实现长程记忆对话pip install azure-ai-voicelive aiohttp azure-identity
必要环境变量:
AZURE_COGNITIVE_SERVICES_ENDPOINT=https://<region>.api.cognitive.microsoft.com
AZURE_COGNITIVE_SERVICES_KEY=<api-key>
DefaultAzureCredential (推荐,生产环境):
from azure.ai.voicelive.aio import connect
from azure.identity.aio import DefaultAzureCredential
# ...
async with connect(
endpoint=os.environ["AZURE_COGNITIVE_SERVICES_ENDPOINT"],
credential=DefaultAzureCredential(),
model="gpt-4o-realtime-preview",
credential_scopes=["https://cognitiveservices.azure.com/.default"]
) as conn:
...
API Key (快速验证):
from azure.ai.voicelive.aio import connect
from azure.core.credentials import AzureKeyCredential
# ...
async with connect(
endpoint=os.environ["AZURE_COGNITIVE_SERVICES_ENDPOINT"],
credential=AzureKeyCredential(os.environ["AZURE_COGNITIVE_SERVICES_KEY"]),
model="gpt-4o-realtime-preview"
) as conn:
...
from azure.ai.voicelive.models import RequestSession, FunctionTool
# ...
await conn.session.update(session=RequestSession(
instructions="You are a helpful voice assistant.",
modalities=["text", "audio"],
voice="alloy",
input_audio_format="pcm16",
output_audio_format="pcm16",
turn_detection={
"type": "server_vad",
"threshold": 0.5,
"prefix_padding_ms": 300,
"silence_duration_ms": 500
},
tools=[
FunctionTool(
type="function",
name="get_weather",
description="Get current weather",
parameters={
"type": "object",
"properties": {"location": {"type": "string"}},
"required": ["location"]
}
)
]
))
建立连接、配置会话、监听事件并处理音频输入输出与函数调用:
import asyncio, os, json, base64
from azure.ai.voicelive.aio import connect
from azure.identity.aio import DefaultAzureCredential
# ...
def handle_function(name, arguments):
if name == "get_weather":
return {"temperature": 26, "condition": "sunny"}
return {}
# ...
async def main():
async with connect(
endpoint=os.environ["AZURE_COGNITIVE_SERVICES_ENDPOINT"],
credential=DefaultAzureCredential(),
model="gpt-4o-realtime-preview",
azure.com/.default"]
) as conn:
await conn.session.update(session={
"instructions": "You are a helpful assistant.",
"modalities": ["text", "audio"],
"voice": "alloy"
})
# ...
async for event in conn:
if event.type == "response.audio_transcript.done":
print(f"Transcript: {event.transcript}")
elif event.type == "response.audio.delta":
audio_bytes = base64.b64decode(event.delta)
# 将audio_bytes送入扬声器播放
type == "response.function_call_arguments.done":
result = handle_function(event.name, event.arguments)
await conn.conversation.item.create(item={
"type": "function_call_output",
"call_id": event.call_id,
"output": json.dumps(result)
})
type == "response.done":
break
# ...
asyncio.run(main())
关闭VAD后由业务侧控制用户话音结束时机,适用于按键说话或外部分片场景:
await conn.session.update(session={"turn_detection": None})
# ...
# 注入音频块
audio_chunk = await read_audio_from_microphone()
b64_audio = base64.b64encode(audio_chunk).decode()
await conn.input_audio_buffer.append(audio=b64_audio)
# ...
# 显式结束用户轮次并触发响应
await conn.input_audio_buffer.commit()
await conn.response.create()
监听用户重新说话事件,取消当前未完成的响应并清空输出缓冲:
async for event in conn:
if event.type == "input_audio_buffer.speech_started":
await conn.response.cancel()
await conn.output_audio_buffer.clear()
elif event.speech_stopped":
print(f"Speech stopped at {event.audio_end_ms}ms")
async for event in conn 可迭代以下事件:
session.created、session.updatedinput_audio_buffer.speech_started、input_audio_buffer.speech_stoppedconversation.item.delta、conversation.item.completedresponse.created、response.audio.delta、response.audio_transcript.delta、response.audio_transcript.done、response.doneresponse.doneerror (包含 event.error.code 与 event.error.message)现象: 抛出 ConnectionClosed,带 code 与 reason.
原因: 网络抖动、服务端超时、鉴权令牌过期.
处理: 捕获 ConnectionClosed 后重新 connect() 并恢复 session.update,长连接场景建议外层 while True 并指数退避.
现象: 事件流中收到 error, code 为 unauthorized 或 forbidden.
原因: AZURE_COGNITIVE_SERVICES_KEY 错误、AAD主体未授予认知服务权限、credential_scopes 写错.
处理: 用 az cognitiveservices account keys list 复核密钥;AAD方式确认子主体已加入资源 Cognitive Services User 角色;credential_scopes 必须为 https://cognitiveservices.azure.com/.default.
现象: 上行音频被服务端丢弃,日志出现 invalid_audio_format.
原因: input_audio_format 配置与实际采样率/编码不一致,例如设备是16kHz但配置为 pcm16 (24kHz).
处理: 用 pyaudio/sounddevice 检查实际采样率,改为 pcm16-16000hz;G711电话流必须显式指定 g711_ulaw 或 g711_alaw.
现象: 用户话音未结束就被 speech_stopped 触发响应,或停顿后未触发响应.
原因: server_vad.threshold 过高/过低,silence_duration_ms 太短.
处理: 嘈杂环境调高 threshold 至 0.6-0.7;温和场景降至 0.3-0.4;silence_duration_ms 默认500ms,中文对话可调至700ms.
现象: 模型不再继续响应,事件流停滞在 response.done.
原因: 未调用 conn.conversation.item.create 注入 function_call_output,或 call_id 不匹配.
处理: 始终用事件提供的 event.call_id 作为回填 call_id;回填后必须显式 await conn.response.create() 触发下一轮响应.
现象: session.update 返回 voice_not_found 错误.
原因: 指定音色在当前区域/模型不可用,例如Azure原生音色未在资源上部署.
处理: OpenAI系列音色用字符串名 (alloy/echo 等);Azure原生音色需用 AzureStandardVoice/AzureCustomVoice/AzurePersonalVoice 模型对象,且确认资源已部署对应音色.
现象: 调用 response.cancel() 后再次 response.create() 报 response_already_active.
原因: 取消是异步操作,未等待完成就触发新响应.
处理: 在 response.cancel() 协程完成后再调用 response.create();必要时先 output_audio_buffer.clear() 重置输出.
现象: input_audio_buffer.append 抛 concurrent_append 错误.
原因: 多个协程同时向同一连接写入音频块.
处理: 用 asyncio.Lock 串行化对 input_audio_buffer 的写入,或采用单生产者协程从音频队列消费.
生产环境优先 DefaultAzureCredential,可结合托管身份、AAD令牌、Key Vault轮换,避免密钥硬编码;本地快速验证或无AAD环境用 AzureKeyCredential,密钥通过环境变量注入而非源码.
启用 server_vad 让服务端自动判定话音起止,避免本地VAD往返;prefix_padding_ms 设为200-300ms防截断;input_audio_format 使用 pcm16 24kHz;播放端使用环形缓冲区而非整段缓存;模型选 gpt-4o-realtime-preview 而非标准版.
通过 conn.conversation.item.create 显式注入 type=message 的 system/user/assistant 消息,content 数组中 input_text/output_text/input_audio/output_audio 类型混合存在;服务端会按注入顺序维护对话历史.
可以。modalities=["text","audio"] 配置后,同一响应会同时派发 response.audio.delta 与 response.audio_transcript.delta,前者为base64 PCM,后者为增量文本,业务侧可分别消费.
OpenAI音色 (alloy/echo/shimmer 等) 走实时模型内置TTS;Azure原生音色 (AzureStandardVoice/AzureCustomVoice/AzurePersonalVoice) 走Azure语音服务,支持自定义音色与神经语音克隆,但需要在Azure语音资源上单独部署.
VoiceLiveConnection 是无状态WebSocket,断线后必须重新 connect() 建立新会话;若要恢复语义上下文,需把历史 conversation.item 重新通过 item.create 注入新会话,服务端不会自动持久化.
| 错误场景 | 原因 | 处理方式 |
|---|---|---|
| LLM响应超时或无响应 | 网络延迟或模型负载过高 | 请求重试;确认Agent平台LLM服务正常 |
| 输入内容格式不正确 | 用户输入不符合skill预期格式 | 检查输入是否符合skill使用说明中的格式要求,参考示例章节 |
| 执行结果与预期不符 | 指令描述不够明确或上下文不足 | 提供更详细的指令描述,补充必要的上下文信息 |
| 命令执行失败 | 运行环境不满足要求或权限不足 | 确认运行环境符合依赖说明中的要求;检查命令权限设置 |
gpt-4o-realtime-preview),不兼容标准Chat Completion APIAzureCustomVoice/AzurePersonalVoice) 需在Azure语音资源上单独部署,不支持即时切换transcription_session 与 session 不能在同一连接上同时启用实时响应与纯转写模式pcm16 24kHzcall_id 来自服务端事件,业务侧不能自行生成| 错误现象 | 可能原因 | 诊断步骤 | 解决方案 |
|---|---|---|---|
| 连接失败 | 网络连接不稳定或端点配置错误 | 检查网络连接,确认端点配置正确 | 重新配置网络或端点,确保连接稳定性 |
| 音频质量差 | 音频输入格式不正确或采样率设置错误 | 检查音频输入格式,确认采样率设置正确 | 调整音频输入格式和采样率,确保音频质量 |
| 转写错误 | 转写模型配置不正确或音频质量差 | 检查转写模型配置,确保音频质量 | 调整转写模型配置,提高音频质量 |
| 函数调用失败 | 函数配置错误或参数传递错误 | 检查函数配置,确保参数传递正确 | 修正函数配置,正确传递参数 |
| 语音识别错误 | 语音输入质量差或模型配置不正确 | 检查语音输入质量,确认模型配置正确 | 提高语音输入质量,调整模型配置 |
| 风险项 | 等级 | 防护措施 | 验证方法 |
|---|---|---|---|
| API密钥泄露 | 高 | 使用环境变量存储API密钥,避免硬编码 | 定期检查代码库,确保无API密钥泄露 |
| 数据传输安全 | 中 | 使用HTTPS加密数据传输 | 使用SSL/TLS工具验证加密连接 |
| 认证信息安全 | 高 | 使用强认证机制,限制访问权限 | 定期审计认证信息,确保权限合理 |
| 日志记录和监控 | 中 | 实施日志记录和监控策略 | 定期检查日志,确保异常行为被监控 |
| 模型更新安全 | 中 | 定期更新模型,避免已知漏洞 | 定期检查模型更新,确保安全 |
| 场景 | 效率提升量化分析 | 差异化对比 |
|---|---|---|
| 实时语音助手 | 通过实时双向语音AI,将响应时间从秒级缩短至毫秒级,提升用户体验 | 相比传统语音助手,延迟降低,交互更流畅 |
| 会议实时转写 | 自动转写会议内容,提高会议记录效率,减少人工转录时间 | 相比手动转录,效率提升10倍以上 |
| 电话客服IVR | 实时语音识别和转写,提升客户服务效率,降低人工成本 | 相比传统IVR,响应速度更快,客户满意度更高 |
| 多模态交互机器人 | 支持文本和音频混合输入,实现更丰富的交互体验 | 相比单一模态交互,用户体验更佳,交互更自然 |
| 语音识别和转写 | 高精度语音识别和转写,支持多种语言和方言 | 相比传统语音识别,准确率提升5%,支持更多语言和方言 |
A1: 基于Azure VoiceLive SDK构建实时双向语音AI应用,支持流式音频、转写、函数调用与多语音模型。。支持文本指令和结构化参数输入,具体格式参考使用流程章节。
A2: 是的,部分功能需要配置对应平台的API Key。请在依赖说明章节查看具体要求,并通过环境变量安全配置。
A3: 检查命令参数是否正确,确认运行环境支持exec能力。如遇权限问题,请参照错误处理章节排查。
| 操作场景 | 手动耗时 | 自动化耗时 | 效率提升 |
|---|---|---|---|
| 文件解析与提取 | 5-10分钟/个 | <5秒/个 | 60-120x |
| 批量文件处理(100个) | 8-16小时 | <5分钟 | 96-192x |
| API调用与响应解析 | 2-3分钟/次 | <1秒/次 | 120-180x |
| 多接口数据聚合 | 15-30分钟 | <10秒 | 90-180x |
| 命令执行与结果收集 | 3-5分钟/次 | <2秒/次 | 90-150x |
| 重复任务批量执行 | 因任务而异 | 线性缩减 | 5-50x |
| 错误排查与修复 | 10-30分钟 | <30秒 | 20-60x |
| 对比维度 | Azure实时语音AI开发 | 传统手动方式 | 通用脚本工具 |
|---|---|---|---|
| 自动化程度 | 全流程自动 | 完全手动 | 部分自动 |
| 错误处理 | 内置错误恢复 | 依赖人工经验 | 基本try-catch |
| 可复用性 | 参数化配置 | 一次性脚本 | 模板化 |
| 安全合规 | 内置安全检查 | 无安全保障 | 无安全保障 |
| 适用场景 | 基于Azure VoiceLive SDK构建实时双向语音AI应用,支持流式音频 | 通用场景 | 通用场景 |
针对Azure实时语音AI开发使用中可能遇到的常见问题,提供以下排查方案:
| 错误类型 | 原因分析 | 解决方案 |
|---|---|---|
| API认证失败(401) | API密钥错误或过期 | 检查密钥配置,重新生成token |
| 接口限流(429) | 请求频率超出限制 | 降低调用频率,启用重试退避策略 |
| 响应超时(504) | 网络延迟或服务端负载过高 | 增加超时阈值,检查网络连接 |
| 文件不存在 | 路径错误或文件未创建 | 检查路径拼写,确认文件已生成 |
| 文件格式不支持 | 扩展名不在支持列表中 | 转换为支持的格式后重试 |
| 权限不足 | 当前用户无读写权限 | 检查文件权限,以管理员身份运行 |
| 命令执行失败 | 参数错误或环境依赖缺失 | 检查命令语法,确认依赖已安装 |
| 进程超时 | 命令执行时间过长 | 增加超时设置,优化命令参数 |
| 网络连接失败 | DNS解析失败或防火墙拦截 | 检查网络配置,确认代理设置 |