基于Azure VoiceLive SDK构建实时双向语音AI应用,支持流式音频、转写、函数调用与多语音模型。
阿苏尔语音 QQAIQAGent → : 7 4 : 4 : 4 : 6 : 6 : 3 : 3 : 3 : 3 : 3 : 3 : 3 : 3 : 3 : 3
功能概述
阿苏尔语音 QQAIQAGent → : 7 4 : 4 : 4 : 6 : 6 : 3 : 3 : 3 : 3 : 3 : 3 : 3 : 3 : 3 : 3是一项面向实际任务的技能,主要用于3 : : 3 : 3 : : 3;3 : 3 : : : 3 : : 3。
核心要点
- 它将相关步骤、工具调用和结果整理方式集中到统一流程中,帮助使用者更快完成目标并减少重复操作。
- 使用时应结合输入条件选择合适的执行方式,核对必要参数、依赖环境与输出内容,并按原始要求处理异常情况。
- 从功能定位来看,该技能强调把分散的操作要求整理成清晰、可复用的处理流程,使用户能够围绕既定目标快速准备输入、选择执行方式并获得结构化结果。
使用与执行
实际使用前应先确认任务范围、数据来源、运行环境、必要权限和关键参数,再依据技能说明逐步执行;若输入条件不完整,应先补齐信息或采用保守配置,避免因错误假设导致结果偏离需求。执行过程中需要关注工具调用是否成功、接口或依赖是否可用、输出格式是否符合预期,并对异常提示、缺失字段和边界情况进行处理;
结果检查与注意事项
涉及批量任务时,还应保存进度,避免中断后重复操作。该技能适合用于一次性任务,也可以接入自动化工作流,与其他技能或上层代理配合完成更完整的业务链路;在组合使用时,应明确每一步的输入输出关系,并避免不同步骤之间出现参数冲突。
Azure VoiceLive 实时语音AI开发
依赖说明
运行环境
- Agent平台: 支持SKILL.md的任意AI Agent(Claude Code / Cursor / Codex / Gemini CLI等)
- 操作系统: Windows / macOS / Linux
依赖项
| 依赖项 | 类型 | 是否必需 | 获取方式 |
|---|---|---|---|
| LLM API | API | 必需 | 由Agent内置LLM提供 |
API Key 配置
需要配置对应API Key,详见上文环境配置章节
可用性分类
- 分类: MD+EXEC()
API Key配置方式:
export API_KEY="your_api_key_here"
配置后需重启会话或开启新终端生效。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(转写配置) - 支持服务端VAD (
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指定作用域
指令解析与执行
解析用户指令,执行核心操作并返回处理结果。
输入: 用户提供操作指令和必要参数。
输出: 返回操作执行的结果。
- 执行
指令解析与执行操作,处理输入数据并返回结果 - 验证执行结果,确认输出符合预期格式
- 参考
指令解析与执行相关配置参数进行设置
数据处理与转换
处理输入数据,执行转换操作并输出结果。
输入: 用户提供操作指令和必要参数。
输出: 返回操作执行的结果。
- 执行
数据处理与转换操作,处理输入数据并返回结果 - 验证执行结果,确认输出符合预期格式
- 参考
数据处理与转换相关配置参数进行设置
结果验证与输出
验证处理结果的正确性,格式化输出并返回给用户。
输入: 用户提供操作指令和必要参数。
输出: 返回操作执行的结果。
- 执行
结果验证与输出操作,处理输入数据并返回结果 - 验证执行结果,确认输出符合预期格式
- 参考
结果验证与输出相关配置参数进行设置
能力覆盖范围
本skill还覆盖以下能力场景: SDK、构建实时双向语音、支持流式音频、函数调用与多语音、的实时语音、开发技能、双向通信、流式音频输入输出、实时转写、会话管理、函数调用工具集成、与多语音模型选择、适用于构建语音助、客服对话、实时翻译、会议转写等场景、两种认证方式、等多种音频格式、高保真与、电话场景。这些能力在上述核心功能中均有对应处理逻辑。
源能力映射
本skill覆盖源skill的以下能力点:
| 源能力点 | 支持状态 | 实现方式 |
|---|---|---|
| Resource | 支持 | 通过核心功能实现对应能力 |
输入: 用户提供源能力映射所需的指令和必要参数。 处理: 按照skill规范执行源能力映射操作,遵循单一意图原则。 输出: 返回源能力映射的执行结果,包含操作状态和输出数据。
领域术语
本skill涉及以下领域术语: english, telephony, 需要网络连接, receive, listen, history, formats, handling, resources, trigger, types, variables, sample, errors, case
处理: 按照skill规范执行领域术语操作,遵循单一意图原则。 输出: 返回领域术语的执行结果,包含操作状态和输出数据。
使用流程
- 环境确认: 确认Agent平台已加载本skill,检查依赖说明中的环境要求
- 指令输入: 向Agent描述需要执行的任务,引用
azure-ai-voicelive-py的相关能力 - 执行处理: Agent按照核心能力章节的指令执行任务
- 结果验证: 检查输出结果是否符合预期,参考错误处理章节处理异常
命令参数说明
-identity: 命令参数,用于指定操作选项
适用场景
- 实时语音助手: 构建可中断、可工具调用的低延迟语音对话应用,适用于智能硬件、车载、客服前置等
- 会议实时转写: 通过
transcription_session持续输出conversation.item.input_audio_transcription.delta与completed事件,生成可读字幕流 - 电话客服IVR: 使用
g711_ulaw/g711_alaw8kHz格式接入SIP/PSTN电话网络,搭配azure_semantic_vad处理短促话音 - 多模态交互机器人: 同一会话内文本与音频混合输入,通过
conversation.item.create注入历史上下文,实现长程记忆对话
安装与环境
pip install azure-ai-voicelive aiohttp azure-identity
必要环境变量:
AZURE_COGNITIVE_SERVICES_ENDPOINT=https://.api.cognitive.microsoft.com AZURE_COGNITIVE_SERVICES_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",
credential_scopes=["https://cognitiveservices.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送入扬声器播放
elif event.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)
})
await conn.response.create()
elif event.type == "response.done":
break
asyncio.run(main())
案例二: 手动轮次模式 (无VAD)
关闭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.type == "input_audio_buffer.speech_stopped":
print(f"Speech stopped at {event.audio_end_ms}ms")
事件参考
async for event in conn 可迭代以下事件:
- 会话事件:
session.created、session.updated - 音频输入:
input_audio_buffer.speech_started、input_audio_buffer.speech_stopped - 转写:
conversation.item.input_audio_transcription.delta、conversation.item.input_audio_transcription.completed - 响应:
response.created、response.audio.delta、response.audio_transcript.delta、response.audio_transcript.done、response.done - 函数调用:
response.function_call_arguments.done - 错误:
error(包含event.error.code与event.error.message)
异常处理
WebSocket连接中断
现象: 抛出 ConnectionClosed,带 code 与 reason。
原因: 网络抖动、服务端超时、鉴权令牌过期。
处理: 捕获 ConnectionClosed 后重新 connect() 并恢复 session.update,长连接场景建议外层 while True 执行ping命令测试网络连通性,检查防火墙和代理设置连接后重新执行命令并指数退避。
鉴权失败 (401/403)
现象: 事件流中收到 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。
VAD端点漏判
现象: 用户话音未结束就被 speech_stopped 触发响应,或停顿后未触发响应。
原因: server_vad.threshold 过高/过低,silence_duration_ms 太短。
处理: 嘈杂环境调高 threshold 至 0.6-0.7;温和场景降至 0.3-0.4;silence_duration_ms 默认500ms,中文对话可调至700ms。
函数调用回填丢失
现象: 模型不再继续响应,事件流停滞在 response.function_call_arguments.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 的写入,或采用单生产者协程从音频队列消费。
常见问题
Q1: DefaultAzureCredential 与 API Key 该选哪个?
生产环境优先 DefaultAzureCredential,可结合托管身份、AAD令牌、Key Vault轮换,避免密钥硬编码;本地快速验证或无AAD环境用 AzureKeyCredential,密钥通过环境变量注入而非源码。
Q2: 如何降低端到端延迟?
启用 server_vad 让服务端自动判定话音起止,避免本地VAD往返;prefix_padding_ms 设为200-300ms防截断;input_audio_format 使用 pcm16 24kHz;播放端使用环形缓冲区而非整段缓存;模型选 gpt-4o-realtime-preview 而非标准版。
Q3: 如何在对话中保留历史上下文?
通过 conn.conversation.item.create 显式注入 type=message 的 system/user/assistant 消息,content 数组中 input_text/output_text/input_audio/output_audio 类型混合存在;服务端会按注入顺序维护对话历史。
Q4: 能否同时拿到音频流和文字转写?
可以。modalities=["text","audio"] 配置后,同一响应会同时派发 response.audio.delta 与 response.audio_transcript.delta,前者为base64 PCM,后者为增量文本,业务侧可分别消费。
Q5: Azure原生音色和OpenAI音色有什么区别?
OpenAI音色 (alloy/echo/shimmer 等) 走实时模型内置TTS;Azure原生音色 (AzureStandardVoice/AzureCustomVoice/AzurePersonalVoice) 走Azure语音服务,支持自定义音色与神经语音克隆,但需要在Azure语音资源上单独部署。
Q6: 通话中断后如何恢复对话?
VoiceLiveConnection 是无状态WebSocket,断线后必须重新 connect() 建立新会话;若要恢复语义上下文,需把历史 conversation.item 重新通过 item.create 注入新会话,服务端不会自动持久化。
错误处理
| 错误场景 | 原因 | 处理方式 |
|---|---|---|
| LLM响应超时或无响应 | 网络延迟或模型负载过高 | 执行ping命令测试网络连通性,检查防火墙和代理设置连接,执行ping命令测试网络连通性,检查防火墙和代理设置连接后重新执行命令请求;确认Agent平台LLM服务正常 |
| 输入内容格式不正确 | 用户输入不符合skill预期格式 | 检查输入是否符合skill使用说明中的格式要求,参考示例章节 |
| 执行结果与预期不符 | 指令描述不够明确或上下文不足 | 提供更详细的指令描述,补充必要的上下文信息 |
| 命令执行失败 | 运行环境不满足要求或权限不足 | 确认运行环境符合依赖说明中的要求;检查命令权限设置 |
已知限制
- 仅支持Azure OpenAI实时模型 (如
gpt-4o-realtime-preview),不兼容标准Chat Completion API - WebSocket长连接依赖稳定网络,断线后对话上下文不会自动恢复
- Azure原生音色 (
AzureCustomVoice/AzurePersonalVoice) 需在Azure语音资源上单独部署,不支持即时切换 transcription_session与session不能在同一连接上同时启用实时响应与纯转写模式- 音频输出格式受模型限制,部分模型仅支持
pcm1624kHz - 函数调用结果必须为JSON字符串,且
call_id来自服务端事件,业务侧不能自行生成
热门AI工具
相关专题
Vite项目打包部署专题汇集生产构建、产物预览、输出目录、资源路径、Nginx与GitHub Pages部署及常见白屏和路由404问题的已审核文章,帮助读者完成上线流程。
0
2026.10.28
Vite搭配Vue.js专题汇集创建Vue 3项目、配置开发环境、路径别名、Vue插件、代理、多环境构建与调试的已审核文章,帮助读者完成从初始化到日常开发的配置。
0
2026.10.28
Vite项目目录专题汇集入口文件、src源码、public静态资源、路径别名、项目根目录和构建输出目录相关的已审核文章,帮助读者理解各文件夹的用途与引用方式。
0
2026.10.28
本专题介绍Gradle插件开发的基本流程,涵盖插件类编写、自定义任务注册、扩展参数设计和插件应用方法,帮助你理解插件如何组织构建逻辑,减少多个项目之间的重复配置。
0
2026.10.22
本专题介绍Gradle Wrapper的基本作用,涵盖文件组成、生成方法、版本配置和任务调用,帮助你理解项目如何使用指定的Gradle版本,减少不同开发环境带来的构建差异。
0
2026.10.22
本专题整理Golangci-lint常用Linters的用途与配置方法,覆盖错误处理、无效代码、安全、复杂度、命名和依赖检查,帮助项目合理选规则。
0
2026.10.22
本专题介绍Gradle Java项目构建方法,涵盖Java插件配置、依赖声明、源码编译、测试执行和打包检查,帮助你理解各阶段的任务关系,逐步完成项目构建。
0
2026.10.22
本专题汇总PHP常见时间戳漏洞,包括2038年溢出、时区漂移、时间戳伪造、重放攻击、时间盲注与日志审计失效等,并给出升级64位环境、使用 DateTimeImmutable、统一UTC、严格超时校验、预处理绑定、hash_equals 比对等修复方案,帮助开发者快速排查和加固时间相关代码。
0
2026.10.22
本专题聚焦Golangci-lint YAML配置文件,讲清运行参数、规则启停、目录排除、问题过滤及严重级别设置,便于团队统一检查标准。
0
2026.10.22
热门下载
相关下载
精品课程
共6课时 | 12.1万人学习
共79课时 | 161.6万人学习
共6课时 | 54.7万人学习