基于Azure VoiceLive SDK构建实时双向语音AI应用,支持流式音频、转写、函数调用与多语音模型。
阿苏尔语音 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。
实际使用前应先确认任务范围、数据来源、运行环境、必要权限和关键参数,再依据技能说明逐步执行;若输入条件不完整,应先补齐信息或采用保守配置,避免因错误假设导致结果偏离需求。执行过程中需要关注工具调用是否成功、接口或依赖是否可用、输出格式是否符合预期,并对异常提示、缺失字段和边界情况进行处理;
涉及批量任务时,还应保存进度,避免中断后重复操作。该技能适合用于一次性任务,也可以接入自动化工作流,与其他技能或上层代理配合完成更完整的业务链路;在组合使用时,应明确每一步的输入输出关系,并避免不同步骤之间出现参数冲突。
| 依赖项 | 类型 | 是否必需 | 获取方式 |
|---|---|---|---|
| LLM API | API | 必需 | 由Agent内置LLM提供 |
需要配置对应API Key,详见上文环境配置章节
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(转写配置)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规范执行领域术语操作,遵循单一意图原则。 输出: 返回领域术语的执行结果,包含操作状态和输出数据。
azure-ai-voicelive-py的相关能力-identity: 命令参数,用于指定操作选项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://.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后由业务侧控制用户话音结束时机,适用于按键说话或外部分片场景:
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.updatedinput_audio_buffer.speech_started、input_audio_buffer.speech_stoppedconversation.item.input_audio_transcription.delta、conversation.item.input_audio_transcription.completedresponse.created、response.audio.delta、response.audio_transcript.delta、response.audio_transcript.done、response.doneresponse.function_call_arguments.doneerror (包含 event.error.code 与 event.error.message)现象: 抛出 ConnectionClosed,带 code 与 reason。
原因: 网络抖动、服务端超时、鉴权令牌过期。
处理: 捕获 ConnectionClosed 后重新 connect() 并恢复 session.update,长连接场景建议外层 while True 执行ping命令测试网络连通性,检查防火墙和代理设置连接后重新执行命令并指数退避。
现象: 事件流中收到 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.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 的写入,或采用单生产者协程从音频队列消费。
生产环境优先 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响应超时或无响应 | 网络延迟或模型负载过高 | 执行ping命令测试网络连通性,检查防火墙和代理设置连接,执行ping命令测试网络连通性,检查防火墙和代理设置连接后重新执行命令请求;确认Agent平台LLM服务正常 |
| 输入内容格式不正确 | 用户输入不符合skill预期格式 | 检查输入是否符合skill使用说明中的格式要求,参考示例章节 |
| 执行结果与预期不符 | 指令描述不够明确或上下文不足 | 提供更详细的指令描述,补充必要的上下文信息 |
| 命令执行失败 | 运行环境不满足要求或权限不足 | 确认运行环境符合依赖说明中的要求;检查命令权限设置 |
gpt-4o-realtime-preview),不兼容标准Chat Completion APIAzureCustomVoice/AzurePersonalVoice) 需在Azure语音资源上单独部署,不支持即时切换transcription_session 与 session 不能在同一连接上同时启用实时响应与纯转写模式pcm16 24kHzcall_id 来自服务端事件,业务侧不能自行生成相关专题
热门下载
相关下载
精品课程
共6课时 | 54.7万人学习
共89课时 | 134.1万人学习
共49课时 | 82.6万人学习