Azure AI Voicelive Py
MicrosoftOfficialCreated by Microsoft
- Skill
- Tool integration
- Software development
- MIT
- Low risk
AutoGineer summary
Written by AutoGineer from the skill’s own files, not by the author
The azure-ai-voicelive-py skill provides a Python SDK to facilitate bidirectional WebSocket communication with Azure AI models. It enables developers to integrate voice capabilities into applications, supporting features such as voice assistants, chatbots, speech-to-speech translation, and voice-driven avatars. The SDK includes tools for managing audio buffers, configuring session parameters, handling function calls, and processing real-time events.
What it does
- Establishes bidirectional WebSocket connections for audio streaming.
- Supports Server VAD and manual turn-based conversation control.
- Enables function calling and integration with MCP tools.
- Provides mechanisms for real-time transcription and audio output.
- Offers configuration for various voice models and audio formats.
- Facilitates integration with voice-driven avatars.
When to use it
- When building Python applications that require real-time voice interaction.
- When implementing voice-enabled chatbots or virtual assistants.
- When developing systems requiring speech-to-speech translation.
- When integrating voice-driven avatars into software projects.
Advantages
- Native support for asynchronous Python patterns.
- Flexible authentication options including Entra ID integration.
- Comprehensive event handling for session and audio management.
- Granular control over audio input and output buffers.
Usage examples
- “How do I initialize a connection to the Azure AI Voice Live service?”
- The user receives a code snippet demonstrating the use of the connect() function within an async context manager, including the required endpoint and credential configuration.
- “Show me how to configure a voice assistant with a custom function tool.”
- The user receives an example of using the session.update() method to define a FunctionTool, including its name, description, and parameter schema.
Install
Download the skill as a ZIP:
https://mp-staging.autogineer.com/agent-skills/microsoft/azure-ai-voicelive-py/downloadUnzip it into the cross-client skills folder of your project:
mkdir -p .agents/skills && unzip azure-ai-voicelive-py.zip -d .agents/skills
Documentation by Microsoft
Azure AI Voice Live SDK
Build real-time voice AI applications with bidirectional WebSocket communication.
Installation
pip install azure-ai-voicelive aiohttp azure-identityEnvironment Variables
AZURE_COGNITIVE_SERVICES_ENDPOINT=https://<region>.api.cognitive.microsoft.com # Required for all auth methods
AZURE_TOKEN_CREDENTIALS=prod # Required only if DefaultAzureCredential is used in production
AZURE_COGNITIVE_SERVICES_KEY=<api-key> # Only required for the legacy API-key auth path belowAuthentication & Lifecycle
🔑 Two rules apply to every code sample below:
Prefer
DefaultAzureCredential. It works locally (Azure CLI / VS Code / Developer CLI) and in Azure (managed identity, workload identity) with no code change. Avoid connection strings, account/API keys — they bypass Entra audit and rotation.
Local dev:
DefaultAzureCredentialworks as-is.Production: set
AZURE_TOKEN_CREDENTIALS=prod(orAZURE_TOKEN_CREDENTIALS=<specific_credential>) to constrain the credential chain to production-safe credentials.Wrap every client in a context manager so HTTP transports, sockets, and token caches are released deterministically:
Sync:
with <Client>(...) as client:Async:
async with <Client>(...) as client:andasync with DefaultAzureCredential() as credential:(fromazure.identity.aio)Snippets may abbreviate this setup, but production code should always follow both rules.
import os
from azure.ai.voicelive.aio import connect
from azure.identity.aio import DefaultAzureCredential, ManagedIdentityCredential
# Local dev: DefaultAzureCredential. Production: set AZURE_TOKEN_CREDENTIALS=prod or AZURE_TOKEN_CREDENTIALS=<specific_credential>
# Or use a specific credential directly in production:
# See https://learn.microsoft.com/python/api/overview/azure/identity-readme?view=azure-python#credential-classes
# credential = ManagedIdentityCredential()
async with DefaultAzureCredential(require_envvar=True) as credential:
async with connect(
endpoint=os.environ["AZURE_COGNITIVE_SERVICES_ENDPOINT"],
credential=credential,
model="gpt-4o-realtime-preview",
credential_scopes=["https://cognitiveservices.azure.com/.default"]
) as conn:
...Legacy: API Key (existing keyed deployments)
New code should use DefaultAzureCredential above. Use AzureKeyCredential only if you have an existing keyed deployment that hasn't been migrated to Entra ID yet — for example, regulated environments still completing their Entra rollout.
import os
from azure.core.credentials import AzureKeyCredential
from azure.ai.voicelive.aio import connect
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:
...Quick Start
import asyncio
import os
from azure.ai.voicelive.aio import connect
from azure.identity.aio import DefaultAzureCredential
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:
# Update session with instructions
await conn.session.update(session={
"instructions": "You are a helpful assistant.",
"modalities": ["text", "audio"],
"voice": "alloy"
})
# Listen for events
async for event in conn:
print(f"Event: {event.type}")
if event.type == "response.audio_transcript.done":
print(f"Transcript: {event.transcript}")
elif event.type == "response.done":
break
asyncio.run(main())Core Architecture
Connection Resources
The VoiceLiveConnection exposes these resources:
| Resource | Purpose | Key Methods |
|---|---|---|
conn.session | Session configuration | update(session=...) |
conn.response | Model responses | create(), cancel() |
conn.input_audio_buffer | Audio input | append(), commit(), clear() |
conn.output_audio_buffer | Audio output | clear() |
conn.conversation | Conversation state | item.create(), item.delete(), item.truncate() |
conn.transcription_session | Transcription config | update(session=...) |
Session Configuration
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", # or "echo", "shimmer", "sage", etc.
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"]
}
)
]
))Audio Streaming
Send Audio (Base64 PCM16)
import base64
# Read audio chunk (16-bit PCM, 24kHz mono)
audio_chunk = await read_audio_from_microphone()
b64_audio = base64.b64encode(audio_chunk).decode()
await conn.input_audio_buffer.append(audio=b64_audio)Receive Audio
async for event in conn:
if event.type == "response.audio.delta":
audio_bytes = base64.b64decode(event.delta)
await play_audio(audio_bytes)
elif event.type == "response.audio.done":
print("Audio complete")Event Handling
async for event in conn:
match event.type:
# Session events
case "session.created":
print(f"Session: {event.session}")
case "session.updated":
print("Session updated")
# Audio input events
case "input_audio_buffer.speech_started":
print(f"Speech started at {event.audio_start_ms}ms")
case "input_audio_buffer.speech_stopped":
print(f"Speech stopped at {event.audio_end_ms}ms")
# Transcription events
case "conversation.item.input_audio_transcription.completed":
print(f"User said: {event.transcript}")
case "conversation.item.input_audio_transcription.delta":
print(f"Partial: {event.delta}")
# Response events
case "response.created":
print(f"Response started: {event.response.id}")
case "response.audio_transcript.delta":
print(event.delta, end="", flush=True)
case "response.audio.delta":
audio = base64.b64decode(event.delta)
case "response.done":
print(f"Response complete: {event.response.status}")
# Function calls
case "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()
# Errors
case "error":
print(f"Error: {event.error.message}")Common Patterns
Manual Turn Mode (No VAD)
await conn.session.update(session={"turn_detection": None})
# Manually control turns
await conn.input_audio_buffer.append(audio=b64_audio)
await conn.input_audio_buffer.commit() # End of user turn
await conn.response.create() # Trigger responseInterrupt Handling
async for event in conn:
if event.type == "input_audio_buffer.speech_started":
# User interrupted - cancel current response
await conn.response.cancel()
await conn.output_audio_buffer.clear()Conversation History
# Add system message
await conn.conversation.item.create(item={
"type": "message",
"role": "system",
"content": [{"type": "input_text", "text": "Be concise."}]
})
# Add user message
await conn.conversation.item.create(item={
"type": "message",
"role": "user",
"content": [{"type": "input_text", "text": "Hello!"}]
})
await conn.response.create()Voice Options
| Voice | Description |
|---|---|
alloy | Neutral, balanced |
echo | Warm, conversational |
shimmer | Clear, professional |
sage | Calm, authoritative |
coral | Friendly, upbeat |
ash | Deep, measured |
ballad | Expressive |
verse | Storytelling |
Azure voices: Use AzureStandardVoice, AzureCustomVoice, or AzurePersonalVoice models.
Audio Formats
| Format | Sample Rate | Use Case |
|---|---|---|
pcm16 | 24kHz | Default, high quality |
pcm16-8000hz | 8kHz | Telephony |
pcm16-16000hz | 16kHz | Voice assistants |
g711_ulaw | 8kHz | Telephony (US) |
g711_alaw | 8kHz | Telephony (EU) |
Turn Detection Options
# Server VAD (default)
{"type": "server_vad", "threshold": 0.5, "silence_duration_ms": 500}
# Azure Semantic VAD (smarter detection)
{"type": "azure_semantic_vad"}
{"type": "azure_semantic_vad_en"} # English optimized
{"type": "azure_semantic_vad_multilingual"}Error Handling
from azure.ai.voicelive.aio import ConnectionError, ConnectionClosed
try:
async with connect(...) as conn:
async for event in conn:
if event.type == "error":
print(f"API Error: {event.error.code} - {event.error.message}")
except ConnectionClosed as e:
print(f"Connection closed: {e.code} - {e.reason}")
except ConnectionError as e:
print(f"Connection error: {e}")Best Practices
This SDK is async-only; use the
.aionamespace throughout. Do not try to pair it with sync clients from other Azure SDKs in the same call path — keep the whole request path async.Always use context managers for clients and async credentials. Wrap every connection in
async with connect(...) as conn:. For asyncDefaultAzureCredentialfromazure.identity.aio, also useasync with credential:so tokens and transports are cleaned up.
References
Detailed API Reference: See references/api-reference.md
Complete Examples: See references/examples.md
All Models & Types: See references/models.md
Files
- ATTRIBUTION.mdAdded by AutoGineer974 B
- LICENSELicence file added by AutoGineer1.1 KiB
- SKILL.md11.3 KiB
- references/api-reference.md8.7 KiB
- references/examples.md16.9 KiB
- references/models.md18.0 KiB
references/models.md
Azure AI Voice Live SDK - Models Reference
Table of Contents
Enums
Client Events
Server Events
Session Models
Conversation Items
Content Parts
Tools
Voice Models
Turn Detection
Response Models
Avatar Models
Enums
Modality
class Modality(str, Enum):
TEXT = "text"
AUDIO = "audio"
ANIMATION = "animation"
AVATAR = "avatar"OpenAIVoiceName
class OpenAIVoiceName(str, Enum):
ALLOY = "alloy"
ASH = "ash"
BALLAD = "ballad"
CORAL = "coral"
ECHO = "echo"
SAGE = "sage"
SHIMMER = "shimmer"
VERSE = "verse"
MARIN = "marin"
CEDAR = "cedar"InputAudioFormat
class InputAudioFormat(str, Enum):
PCM16 = "pcm16" # 24kHz default
G711_ULAW = "g711_ulaw" # 8kHz
G711_ALAW = "g711_alaw" # 8kHzOutputAudioFormat
class OutputAudioFormat(str, Enum):
PCM16 = "pcm16" # 24kHz
PCM16_8000_HZ = "pcm16-8000hz"
PCM16_16000_HZ = "pcm16-16000hz"
G711_ULAW = "g711_ulaw" # 8kHz
G711_ALAW = "g711_alaw" # 8kHzTurnDetectionType
class TurnDetectionType(str, Enum):
SERVER_VAD = "server_vad"
AZURE_SEMANTIC_VAD = "azure_semantic_vad"
AZURE_SEMANTIC_VAD_EN = "azure_semantic_vad_en"
AZURE_SEMANTIC_VAD_MULTILINGUAL = "azure_semantic_vad_multilingual"MessageRole
class MessageRole(str, Enum):
SYSTEM = "system"
USER = "user"
ASSISTANT = "assistant"ItemType
class ItemType(str, Enum):
MESSAGE = "message"
FUNCTION_CALL = "function_call"
FUNCTION_CALL_OUTPUT = "function_call_output"
MCP_LIST_TOOLS = "mcp_list_tools"
MCP_CALL = "mcp_call"
MCP_APPROVAL_REQUEST = "mcp_approval_request"
MCP_APPROVAL_RESPONSE = "mcp_approval_response"ContentPartType
class ContentPartType(str, Enum):
INPUT_TEXT = "input_text"
INPUT_AUDIO = "input_audio"
INPUT_IMAGE = "input_image"
TEXT = "text"
AUDIO = "audio"ToolType
class ToolType(str, Enum):
FUNCTION = "function"
MCP = "mcp"ToolChoiceLiteral
class ToolChoiceLiteral(str, Enum):
AUTO = "auto"
NONE = "none"
REQUIRED = "required"ResponseStatus
class ResponseStatus(str, Enum):
COMPLETED = "completed"
CANCELLED = "cancelled"
FAILED = "failed"
INCOMPLETE = "incomplete"
IN_PROGRESS = "in_progress"ClientEventType
class ClientEventType(str, Enum):
SESSION_UPDATE = "session.update"
INPUT_AUDIO_BUFFER_APPEND = "input_audio_buffer.append"
INPUT_AUDIO_BUFFER_COMMIT = "input_audio_buffer.commit"
INPUT_AUDIO_BUFFER_CLEAR = "input_audio_buffer.clear"
INPUT_AUDIO_TURN_START = "input_audio.turn.start"
INPUT_AUDIO_TURN_APPEND = "input_audio.turn.append"
INPUT_AUDIO_TURN_END = "input_audio.turn.end"
INPUT_AUDIO_TURN_CANCEL = "input_audio.turn.cancel"
INPUT_AUDIO_CLEAR = "input_audio.clear"
CONVERSATION_ITEM_CREATE = "conversation.item.create"
CONVERSATION_ITEM_RETRIEVE = "conversation.item.retrieve"
CONVERSATION_ITEM_TRUNCATE = "conversation.item.truncate"
CONVERSATION_ITEM_DELETE = "conversation.item.delete"
RESPONSE_CREATE = "response.create"
RESPONSE_CANCEL = "response.cancel"
SESSION_AVATAR_CONNECT = "session.avatar.connect"
MCP_APPROVAL_RESPONSE = "mcp_approval_response"ServerEventType
class ServerEventType(str, Enum):
ERROR = "error"
SESSION_AVATAR_CONNECTING = "session.avatar.connecting"
SESSION_CREATED = "session.created"
SESSION_UPDATED = "session.updated"
CONVERSATION_ITEM_INPUT_AUDIO_TRANSCRIPTION_COMPLETED = "conversation.item.input_audio_transcription.completed"
CONVERSATION_ITEM_INPUT_AUDIO_TRANSCRIPTION_DELTA = "conversation.item.input_audio_transcription.delta"
CONVERSATION_ITEM_INPUT_AUDIO_TRANSCRIPTION_FAILED = "conversation.item.input_audio_transcription.failed"
CONVERSATION_ITEM_CREATED = "conversation.item.created"
CONVERSATION_ITEM_RETRIEVED = "conversation.item.retrieved"
CONVERSATION_ITEM_TRUNCATED = "conversation.item.truncated"
CONVERSATION_ITEM_DELETED = "conversation.item.deleted"
INPUT_AUDIO_BUFFER_COMMITTED = "input_audio_buffer.committed"
INPUT_AUDIO_BUFFER_CLEARED = "input_audio_buffer.cleared"
INPUT_AUDIO_BUFFER_SPEECH_STARTED = "input_audio_buffer.speech_started"
INPUT_AUDIO_BUFFER_SPEECH_STOPPED = "input_audio_buffer.speech_stopped"
RESPONSE_CREATED = "response.created"
RESPONSE_DONE = "response.done"
RESPONSE_OUTPUT_ITEM_ADDED = "response.output_item.added"
RESPONSE_OUTPUT_ITEM_DONE = "response.output_item.done"
RESPONSE_CONTENT_PART_ADDED = "response.content_part.added"
RESPONSE_CONTENT_PART_DONE = "response.content_part.done"
RESPONSE_TEXT_DELTA = "response.text.delta"
RESPONSE_TEXT_DONE = "response.text.done"
RESPONSE_AUDIO_TRANSCRIPT_DELTA = "response.audio_transcript.delta"
RESPONSE_AUDIO_TRANSCRIPT_DONE = "response.audio_transcript.done"
RESPONSE_AUDIO_DELTA = "response.audio.delta"
RESPONSE_AUDIO_DONE = "response.audio.done"
RESPONSE_FUNCTION_CALL_ARGUMENTS_DELTA = "response.function_call_arguments.delta"
RESPONSE_FUNCTION_CALL_ARGUMENTS_DONE = "response.function_call_arguments.done"
# MCP events
MCP_LIST_TOOLS_IN_PROGRESS = "mcp_list_tools.in_progress"
MCP_LIST_TOOLS_COMPLETED = "mcp_list_tools.completed"
MCP_LIST_TOOLS_FAILED = "mcp_list_tools.failed"
RESPONSE_MCP_CALL_ARGUMENTS_DELTA = "response.mcp_call_arguments.delta"
RESPONSE_MCP_CALL_ARGUMENTS_DONE = "response.mcp_call_arguments.done"
RESPONSE_MCP_CALL_IN_PROGRESS = "response.mcp_call.in_progress"
RESPONSE_MCP_CALL_COMPLETED = "response.mcp_call.completed"
RESPONSE_MCP_CALL_FAILED = "response.mcp_call.failed"
# Animation events
RESPONSE_ANIMATION_BLENDSHAPES_DELTA = "response.animation_blendshapes.delta"
RESPONSE_ANIMATION_BLENDSHAPES_DONE = "response.animation_blendshapes.done"
RESPONSE_ANIMATION_VISEME_DELTA = "response.animation_viseme.delta"
RESPONSE_ANIMATION_VISEME_DONE = "response.animation_viseme.done"
RESPONSE_AUDIO_TIMESTAMP_DELTA = "response.audio_timestamp.delta"
RESPONSE_AUDIO_TIMESTAMP_DONE = "response.audio_timestamp.done"Client Events
ClientEventSessionUpdate
class ClientEventSessionUpdate(Model):
type: Literal["session.update"]
event_id: Optional[str]
session: RequestSessionClientEventInputAudioBufferAppend
class ClientEventInputAudioBufferAppend(Model):
type: Literal["input_audio_buffer.append"]
event_id: Optional[str]
audio: str # Base64-encoded audioClientEventInputAudioBufferCommit
class ClientEventInputAudioBufferCommit(Model):
type: Literal["input_audio_buffer.commit"]
event_id: Optional[str]ClientEventInputAudioBufferClear
class ClientEventInputAudioBufferClear(Model):
type: Literal["input_audio_buffer.clear"]
event_id: Optional[str]ClientEventConversationItemCreate
class ClientEventConversationItemCreate(Model):
type: Literal["conversation.item.create"]
event_id: Optional[str]
previous_item_id: Optional[str]
item: ConversationRequestItemClientEventConversationItemDelete
class ClientEventConversationItemDelete(Model):
type: Literal["conversation.item.delete"]
event_id: Optional[str]
item_id: strClientEventConversationItemTruncate
class ClientEventConversationItemTruncate(Model):
type: Literal["conversation.item.truncate"]
event_id: Optional[str]
item_id: str
content_index: int
audio_end_ms: intClientEventResponseCreate
class ClientEventResponseCreate(Model):
type: Literal["response.create"]
event_id: Optional[str]
response: Optional[ResponseCreateParams]
additional_instructions: Optional[str]ClientEventResponseCancel
class ClientEventResponseCancel(Model):
type: Literal["response.cancel"]
event_id: Optional[str]
response_id: Optional[str]Server Events
ServerEventSessionCreated
class ServerEventSessionCreated(Model):
type: Literal["session.created"]
event_id: str
session: ResponseSessionServerEventSessionUpdated
class ServerEventSessionUpdated(Model):
type: Literal["session.updated"]
event_id: str
session: ResponseSessionServerEventError
class ServerEventError(Model):
type: Literal["error"]
event_id: str
error: ServerEventErrorDetails
class ServerEventErrorDetails(Model):
type: str
code: Optional[str]
message: str
param: Optional[str]ServerEventInputAudioBufferSpeechStarted
class ServerEventInputAudioBufferSpeechStarted(Model):
type: Literal["input_audio_buffer.speech_started"]
event_id: str
audio_start_ms: int
item_id: strServerEventInputAudioBufferSpeechStopped
class ServerEventInputAudioBufferSpeechStopped(Model):
type: Literal["input_audio_buffer.speech_stopped"]
event_id: str
audio_end_ms: int
item_id: strServerEventConversationItemInputAudioTranscriptionCompleted
class ServerEventConversationItemInputAudioTranscriptionCompleted(Model):
type: Literal["conversation.item.input_audio_transcription.completed"]
event_id: str
item_id: str
content_index: int
transcript: strServerEventConversationItemInputAudioTranscriptionDelta
class ServerEventConversationItemInputAudioTranscriptionDelta(Model):
type: Literal["conversation.item.input_audio_transcription.delta"]
event_id: str
item_id: str
content_index: int
delta: strServerEventResponseCreated
class ServerEventResponseCreated(Model):
type: Literal["response.created"]
event_id: str
response: ResponseServerEventResponseDone
class ServerEventResponseDone(Model):
type: Literal["response.done"]
event_id: str
response: ResponseServerEventResponseAudioDelta
class ServerEventResponseAudioDelta(Model):
type: Literal["response.audio.delta"]
event_id: str
response_id: str
item_id: str
output_index: int
content_index: int
delta: str # Base64-encoded audioServerEventResponseAudioTranscriptDelta
class ServerEventResponseAudioTranscriptDelta(Model):
type: Literal["response.audio_transcript.delta"]
event_id: str
response_id: str
item_id: str
output_index: int
content_index: int
delta: strServerEventResponseAudioTranscriptDone
class ServerEventResponseAudioTranscriptDone(Model):
type: Literal["response.audio_transcript.done"]
event_id: str
response_id: str
item_id: str
output_index: int
content_index: int
transcript: strServerEventResponseFunctionCallArgumentsDelta
class ServerEventResponseFunctionCallArgumentsDelta(Model):
type: Literal["response.function_call_arguments.delta"]
event_id: str
response_id: str
item_id: str
output_index: int
call_id: str
delta: strServerEventResponseFunctionCallArgumentsDone
class ServerEventResponseFunctionCallArgumentsDone(Model):
type: Literal["response.function_call_arguments.done"]
event_id: str
response_id: str
item_id: str
output_index: int
call_id: str
name: str
arguments: strSession Models
RequestSession
class RequestSession(Model):
instructions: Optional[str]
modalities: Optional[List[Modality]]
voice: Optional[Voice] # str, OpenAIVoiceName, OpenAIVoice, or AzureVoice
input_audio_format: Optional[InputAudioFormat]
output_audio_format: Optional[OutputAudioFormat]
turn_detection: Optional[TurnDetection]
tools: Optional[List[Tool]]
tool_choice: Optional[ToolChoice]
temperature: Optional[float]
max_response_output_tokens: Optional[Union[int, Literal["inf"]]]
input_audio_transcription: Optional[AudioInputTranscriptionOptions]ResponseSession
class ResponseSession(Model):
id: str
object: str
model: str
expires_at: int
modalities: List[Modality]
instructions: Optional[str]
voice: Optional[Voice]
input_audio_format: InputAudioFormat
output_audio_format: OutputAudioFormat
turn_detection: Optional[TurnDetection]
tools: List[Tool]
tool_choice: ToolChoice
temperature: float
max_response_output_tokens: Optional[int]AudioInputTranscriptionOptions
class AudioInputTranscriptionOptions(Model):
model: str # e.g., "whisper-1"Conversation Items
ConversationRequestItem (Union Type)
# Can be one of:
- SystemMessageItem
- UserMessageItem
- AssistantMessageItem
- FunctionCallItem
- FunctionCallOutputItemMessageItem Base
class MessageItem(Model):
type: Literal["message"]
id: Optional[str]
role: MessageRole
content: List[ContentPart]
status: Optional[ItemParamStatus]FunctionCallItem
class FunctionCallItem(Model):
type: Literal["function_call"]
id: Optional[str]
call_id: str
name: str
arguments: str
status: Optional[ItemParamStatus]FunctionCallOutputItem
class FunctionCallOutputItem(Model):
type: Literal["function_call_output"]
id: Optional[str]
call_id: str
output: strContent Parts
InputTextContentPart
class InputTextContentPart(Model):
type: Literal["input_text"]
text: strInputAudioContentPart
class InputAudioContentPart(Model):
type: Literal["input_audio"]
audio: str # Base64
transcript: Optional[str]RequestTextContentPart
class RequestTextContentPart(Model):
type: Literal["text"]
text: strRequestAudioContentPart
class RequestAudioContentPart(Model):
type: Literal["audio"]
audio: str # Base64
transcript: Optional[str]RequestImageContentPart
class RequestImageContentPart(Model):
type: Literal["input_image"]
url: Optional[str]
base64: Optional[str]
detail: Optional[RequestImageContentPartDetail] # "auto", "low", "high"Tools
FunctionTool
class FunctionTool(Model):
type: Literal["function"]
name: str
description: Optional[str]
parameters: Optional[dict] # JSON SchemaMCPTool
class MCPTool(Model):
type: Literal["mcp"]
server_label: str
require_approval: Optional[MCPApprovalType] # "never" or "always"MCPServer
class MCPServer(Model):
type: Literal["url"]
url: str
name: str
tool_configuration: Optional[dict]ToolChoiceSelection
class ToolChoiceSelection(Model):
type: Literal["function"]
name: strVoice Models
OpenAIVoice
class OpenAIVoice(Model):
type: Literal["openai"]
name: OpenAIVoiceNameAzureStandardVoice
class AzureStandardVoice(Model):
type: Literal["azure-standard"]
name: str # e.g., "en-US-JennyNeural"AzureCustomVoice
class AzureCustomVoice(Model):
type: Literal["azure-custom"]
endpoint_id: str
name: strAzurePersonalVoice
class AzurePersonalVoice(Model):
type: Literal["azure-personal"]
speaker_profile_id: str
model: Optional[PersonalVoiceModels]Turn Detection
ServerVad
class ServerVad(Model):
type: Literal["server_vad"]
threshold: Optional[float] # 0.0-1.0
prefix_padding_ms: Optional[int]
silence_duration_ms: Optional[int]
create_response: Optional[bool]AzureSemanticVad
class AzureSemanticVad(Model):
type: Literal["azure_semantic_vad"]
# Uses semantic understanding for better turn detectionAzureSemanticVadEn
class AzureSemanticVadEn(Model):
type: Literal["azure_semantic_vad_en"]
eou_detection: Optional[EouDetection]EouDetection
class EouDetection(Model):
threshold_level: Optional[EouThresholdLevel] # "low", "medium", "high", "default"Response Models
Response
class Response(Model):
id: str
object: Literal["realtime.response"]
status: ResponseStatus
status_details: Optional[ResponseStatusDetails]
output: List[ResponseItem]
usage: Optional[TokenUsage]ResponseCreateParams
class ResponseCreateParams(Model):
modalities: Optional[List[Modality]]
instructions: Optional[str]
voice: Optional[Voice]
output_audio_format: Optional[OutputAudioFormat]
tools: Optional[List[Tool]]
tool_choice: Optional[ToolChoice]
temperature: Optional[float]
max_response_output_tokens: Optional[Union[int, Literal["inf"]]]
conversation: Optional[Literal["auto", "none"]]
input: Optional[List[ConversationRequestItem]]TokenUsage
class TokenUsage(Model):
total_tokens: int
input_tokens: int
output_tokens: int
input_token_details: Optional[InputTokenDetails]
output_token_details: Optional[OutputTokenDetails]Avatar Models
AvatarConfig
class AvatarConfig(Model):
type: AvatarConfigTypes # "video-avatar" or "photo-avatar"
character: str
style: Optional[str]
output_protocol: Optional[AvatarOutputProtocol] # "webrtc" or "websocket"
background: Optional[Background]
video_params: Optional[VideoParams]IceServer
class IceServer(Model):
urls: List[str]
username: Optional[str]
credential: Optional[str]Background
class Background(Model):
color: Optional[str] # Hex color
image_url: Optional[str]VideoParams
class VideoParams(Model):
resolution: Optional[VideoResolution]
crop: Optional[VideoCrop]Requirements and compatibility
Works with: Claude Code, Claude apps, OpenAI Codex, GitHub Copilot, Cursor, Gemini CLI, Kiro, OpenCode, Goose, Amp, Roo Code, JetBrains Junie, Factory Droid, Devin (ex-Windsurf), Mistral Vibe, OpenHands, Letta
“Works with” means the tool reads the open Agent Skills format; a skill written for one tool may use features others lack.
Needs: Needs an API key, Needs Python
Security
What our scanner noticed· Low risk
- Instructions that use the network
A static scan is not a guarantee. Skills are third-party content: review a skill before you let an agent use it.
Attribution and licence
- Created by
- Microsoft
- Publisher
- Microsoft (Official)
- Source
- microsoft/skills · .github/plugins/azure-sdk-python/skills/azure-ai-voicelive-py · commit 0696600
- Licence
- MIT License (redistribution allowed)
- LICENSE (added by AutoGineer from LICENSE)
- ATTRIBUTION.md (written by AutoGineer)
- Synced
AutoGineer is not affiliated with or endorsed by Microsoft.
Download ZIP
The ZIP holds the skill’s files, its licence files and an ATTRIBUTION.md. Download azure-ai-voicelive-py.zip