GitHub Copilot ChatGPT Claude Codex CLI Cursor opencode Skill Text

azure-ai-voicelive-dotnet

Azure AI Voice Live SDK for .NET. Build real-time voice AI applications with bidirectional WebSocket communication. Use for voice assistants, conversational AI, real-time speech-to-speech, and voice-enabled chatbots. Triggers: "voice live", "real-time voice", "VoiceLiveClient", "

Ciza · 0 points · 23 views 0 listing impressions 0 install-command copies
Virus-scanned Reviewed automatically before listing.

Full trust report

Download microsoft-skills-.github_plugins_azure-sdk-dotnet_skills_azure-ai-voicelive-dotnet-e58528d.zip · 3 KB
Part of microsoft/skills — 195 skills

Install

skills CLI npx skills add https://github.com/microsoft/skills/tree/main/.github/plugins/azure-sdk-dotnet/skills/azure-ai-voicelive-dotnet
Claude Code claude plugin marketplace add https://llmmart.ai/marketplace.json && claude plugin install microsoft-skills@llmmart
Git git clone https://github.com/microsoft/skills.git

The skills CLI installs just this skill, for any of its supported agents. Claude Code installs the whole microsoft/skills collection as a plugin from our marketplace. Git is the plain clone.

Skill manifest

Azure.AI.VoiceLive (.NET)

Real-time voice AI SDK for building bidirectional voice assistants with Azure AI.

Installation

dotnet add package Azure.AI.VoiceLive
dotnet add package Azure.Identity
dotnet add package NAudio                    # For audio capture/playback

Current Versions: Stable v1.0.0, Preview v1.1.0-beta.1

Environment Variables

AZURE_VOICELIVE_ENDPOINT=https://<resource>.services.ai.azure.com/  # Required: Voice Live endpoint
AZURE_VOICELIVE_MODEL=gpt-4o-realtime-preview  # Required: model deployment name
AZURE_VOICELIVE_VOICE=en-US-AvaNeural  # Optional: Voice Live voice name
AZURE_VOICELIVE_API_KEY=<your-api-key>  # Only required for AzureKeyCredential auth
AZURE_TOKEN_CREDENTIALS=prod  # Required only if DefaultAzureCredential is used in production

Authentication

Microsoft Entra Token Credential

using Azure.Identity;
using Azure.AI.VoiceLive;

Uri endpoint = new Uri("https://your-resource.cognitiveservices.azure.com");
// Local dev: DefaultAzureCredential. Production: set AZURE_TOKEN_CREDENTIALS=prod or AZURE_TOKEN_CREDENTIALS=<specific_credential>
var credential = new DefaultAzureCredential(
    DefaultAzureCredential.DefaultEnvironmentVariableName
);
// Or use a specific credential directly in production:
// See https://learn.microsoft.com/dotnet/api/overview/azure/identity-readme?view=azure-dotnet#credential-classes
// var credential = new ManagedIdentityCredential();
VoiceLiveClient client = new VoiceLiveClient(endpoint, credential);

Required Role: Cognitive Services User (assign in Azure Portal → Access control)

API Key

Uri endpoint = new Uri("https://your-resource.cognitiveservices.azure.com");
AzureKeyCredential credential = new AzureKeyCredential("your-api-key");
VoiceLiveClient client = new VoiceLiveClient(endpoint, credential);

Client Hierarchy

VoiceLiveClient
└── VoiceLiveSession (WebSocket connection)
    ├── ConfigureSessionAsync()
    ├── GetUpdatesAsync() → SessionUpdate events
    ├── AddItemAsync() → UserMessageItem, FunctionCallOutputItem
    ├── SendAudioAsync()
    └── StartResponseAsync()

Core Workflow

1. Start Session and Configure

using Azure.Identity;
using Azure.AI.VoiceLive;

var endpoint = new Uri(Environment.GetEnvironmentVariable("AZURE_VOICELIVE_ENDPOINT"));
var client = new VoiceLiveClient(endpoint, new DefaultAzureCredential());

var model = "gpt-4o-mini-realtime-preview";

// Start session
using VoiceLiveSession session = await client.StartSessionAsync(model);

// Configure session
VoiceLiveSessionOptions sessionOptions = new()
{
    Model = model,
    Instructions = "You are a helpful AI assistant. Respond naturally.",
    Voice = new AzureStandardVoice("en-US-AvaNeural"),
    TurnDetection = new AzureSemanticVadTurnDetection()
    {
        Threshold = 0.5f,
        PrefixPadding = TimeSpan.FromMilliseconds(300),
        SilenceDuration = TimeSpan.FromMilliseconds(500)
    },
    InputAudioFormat = InputAudioFormat.Pcm16,
    OutputAudioFormat = OutputAudioFormat.Pcm16
};

// Set modalities (both text and audio for voice assistants)
sessionOptions.Modalities.Clear();
sessionOptions.Modalities.Add(InteractionModality.Text);
sessionOptions.Modalities.Add(InteractionModality.Audio);

await session.ConfigureSessionAsync(sessionOptions);

2. Process Events

await foreach (SessionUpdate serverEvent in session.GetUpdatesAsync())
{
    switch (serverEvent)
    {
        case SessionUpdateResponseAudioDelta audioDelta:
            byte[] audioData = audioDelta.Delta.ToArray();
            // Play audio via NAudio or other audio library
            break;
            
        case SessionUpdateResponseTextDelta textDelta:
            Console.Write(textDelta.Delta);
            break;
            
        case SessionUpdateResponseFunctionCallArgumentsDone functionCall:
            // Handle function call (see Function Calling section)
            break;
            
        case SessionUpdateError error:
            Console.WriteLine($"Error: {error.Error.Message}");
            break;
            
        case SessionUpdateResponseDone:
            Console.WriteLine("\n--- Response complete ---");
            break;
    }
}

3. Send User Message

await session.AddItemAsync(new UserMessageItem("Hello, can you help me?"));
await session.StartResponseAsync();

4. Function Calling

// Define function
var weatherFunction = new VoiceLiveFunctionDefinition("get_current_weather")
{
    Description = "Get the current weather for a given location",
    Parameters = BinaryData.FromString("""
        {
            "type": "object",
            "properties": {
                "location": {
                    "type": "string",
                    "description": "The city and state or country"
                }
            },
            "required": ["location"]
        }
        """)
};

// Add to session options
sessionOptions.Tools.Add(weatherFunction);

// Handle function call in event loop
if (serverEvent is SessionUpdateResponseFunctionCallArgumentsDone functionCall)
{
    if (functionCall.Name == "get_current_weather")
    {
        var parameters = JsonSerializer.Deserialize<Dictionary<string, string>>(functionCall.Arguments);
        string location = parameters?["location"] ?? "";
        
        // Call external service
        string weatherInfo = $"The weather in {location} is sunny, 75°F.";
        
        // Send response
        await session.AddItemAsync(new FunctionCallOutputItem(functionCall.CallId, weatherInfo));
        await session.StartResponseAsync();
    }
}

Voice Options

Voice Type Class Example
Azure Standard AzureStandardVoice "en-US-AvaNeural"
Azure HD AzureStandardVoice "en-US-Ava:DragonHDLatestNeural"
Azure Custom AzureCustomVoice Custom voice with endpoint ID

Supported Models

Model Description
gpt-4o-realtime-preview GPT-4o with real-time audio
gpt-4o-mini-realtime-preview Lightweight, fast interactions
phi4-mm-realtime Cost-effective multimodal

Key Types Reference

Type Purpose
VoiceLiveClient Main client for creating sessions
VoiceLiveSession Active WebSocket session
VoiceLiveSessionOptions Session configuration
AzureStandardVoice Standard Azure voice provider
AzureSemanticVadTurnDetection Voice activity detection
VoiceLiveFunctionDefinition Function tool definition
UserMessageItem User text message
FunctionCallOutputItem Function call response
SessionUpdateResponseAudioDelta Audio chunk event
SessionUpdateResponseTextDelta Text chunk event

Best Practices

  1. Always set both modalities — Include Text and Audio for voice assistants
  2. Use AzureSemanticVadTurnDetection — Provides natural conversation flow
  3. Configure appropriate silence duration — 500ms typical to avoid premature cutoffs
  4. Use using statement — Ensures proper session disposal
  5. Handle all event types — Check for errors, audio, text, and function calls
  6. Use DefaultAzureCredential — Never hardcode API keys

Error Handling

if (serverEvent is SessionUpdateError error)
{
    if (error.Error.Message.Contains("Cancellation failed: no active response"))
    {
        // Benign error, can ignore
    }
    else
    {
        Console.WriteLine($"Error: {error.Error.Message}");
    }
}

Audio Configuration

  • Input Format: InputAudioFormat.Pcm16 (16-bit PCM)
  • Output Format: OutputAudioFormat.Pcm16
  • Sample Rate: 24kHz recommended
  • Channels: Mono

Related SDKs

SDK Purpose Install
Azure.AI.VoiceLive Real-time voice (this SDK) dotnet add package Azure.AI.VoiceLive
Microsoft.CognitiveServices.Speech Speech-to-text, text-to-speech dotnet add package Microsoft.CognitiveServices.Speech
NAudio Audio capture/playback dotnet add package NAudio

Reference Links

Resource URL
NuGet Package https://www.nuget.org/packages/Azure.AI.VoiceLive
API Reference https://learn.microsoft.com/dotnet/api/azure.ai.voicelive
GitHub Source https://github.com/Azure/azure-sdk-for-net/tree/main/sdk/ai/Azure.AI.VoiceLive
Quickstart https://learn.microsoft.com/azure/ai-services/speech-service/voice-live-quickstart
Files (skills)
  • SKILL.md 9 KB
    ---
    name: azure-ai-voicelive-dotnet
    description: |
      Azure AI Voice Live SDK for .NET. Build real-time voice AI applications with bidirectional WebSocket communication. Use for voice assistants, conversational AI, real-time speech-to-speech, and voice-enabled chatbots. Triggers: "voice live", "real-time voice", "VoiceLiveClient", "VoiceLiveSession", "voice assistant .NET", "bidirectional audio", "speech-to-speech".
    license: MIT
    metadata:
      author: Microsoft
      version: "1.0.0"
      package: Azure.AI.VoiceLive
    ---
    
    # Azure.AI.VoiceLive (.NET)
    
    Real-time voice AI SDK for building bidirectional voice assistants with Azure AI.
    
    ## Installation
    
    ```bash
    dotnet add package Azure.AI.VoiceLive
    dotnet add package Azure.Identity
    dotnet add package NAudio                    # For audio capture/playback
    ```
    
    **Current Versions**: Stable v1.0.0, Preview v1.1.0-beta.1
    
    ## Environment Variables
    
    ```bash
    AZURE_VOICELIVE_ENDPOINT=https://<resource>.services.ai.azure.com/  # Required: Voice Live endpoint
    AZURE_VOICELIVE_MODEL=gpt-4o-realtime-preview  # Required: model deployment name
    AZURE_VOICELIVE_VOICE=en-US-AvaNeural  # Optional: Voice Live voice name
    AZURE_VOICELIVE_API_KEY=<your-api-key>  # Only required for AzureKeyCredential auth
    AZURE_TOKEN_CREDENTIALS=prod  # Required only if DefaultAzureCredential is used in production
    ```
    
    ## Authentication
    
    ### Microsoft Entra Token Credential
    
    ```csharp
    using Azure.Identity;
    using Azure.AI.VoiceLive;
    
    Uri endpoint = new Uri("https://your-resource.cognitiveservices.azure.com");
    // Local dev: DefaultAzureCredential. Production: set AZURE_TOKEN_CREDENTIALS=prod or AZURE_TOKEN_CREDENTIALS=<specific_credential>
    var credential = new DefaultAzureCredential(
        DefaultAzureCredential.DefaultEnvironmentVariableName
    );
    // Or use a specific credential directly in production:
    // See https://learn.microsoft.com/dotnet/api/overview/azure/identity-readme?view=azure-dotnet#credential-classes
    // var credential = new ManagedIdentityCredential();
    VoiceLiveClient client = new VoiceLiveClient(endpoint, credential);
    ```
    
    **Required Role**: `Cognitive Services User` (assign in Azure Portal → Access control)
    
    ### API Key
    
    ```csharp
    Uri endpoint = new Uri("https://your-resource.cognitiveservices.azure.com");
    AzureKeyCredential credential = new AzureKeyCredential("your-api-key");
    VoiceLiveClient client = new VoiceLiveClient(endpoint, credential);
    ```
    
    ## Client Hierarchy
    
    ```
    VoiceLiveClient
    └── VoiceLiveSession (WebSocket connection)
        ├── ConfigureSessionAsync()
        ├── GetUpdatesAsync() → SessionUpdate events
        ├── AddItemAsync() → UserMessageItem, FunctionCallOutputItem
        ├── SendAudioAsync()
        └── StartResponseAsync()
    ```
    
    ## Core Workflow
    
    ### 1. Start Session and Configure
    
    ```csharp
    using Azure.Identity;
    using Azure.AI.VoiceLive;
    
    var endpoint = new Uri(Environment.GetEnvironmentVariable("AZURE_VOICELIVE_ENDPOINT"));
    var client = new VoiceLiveClient(endpoint, new DefaultAzureCredential());
    
    var model = "gpt-4o-mini-realtime-preview";
    
    // Start session
    using VoiceLiveSession session = await client.StartSessionAsync(model);
    
    // Configure session
    VoiceLiveSessionOptions sessionOptions = new()
    {
        Model = model,
        Instructions = "You are a helpful AI assistant. Respond naturally.",
        Voice = new AzureStandardVoice("en-US-AvaNeural"),
        TurnDetection = new AzureSemanticVadTurnDetection()
        {
            Threshold = 0.5f,
            PrefixPadding = TimeSpan.FromMilliseconds(300),
            SilenceDuration = TimeSpan.FromMilliseconds(500)
        },
        InputAudioFormat = InputAudioFormat.Pcm16,
        OutputAudioFormat = OutputAudioFormat.Pcm16
    };
    
    // Set modalities (both text and audio for voice assistants)
    sessionOptions.Modalities.Clear();
    sessionOptions.Modalities.Add(InteractionModality.Text);
    sessionOptions.Modalities.Add(InteractionModality.Audio);
    
    await session.ConfigureSessionAsync(sessionOptions);
    ```
    
    ### 2. Process Events
    
    ```csharp
    await foreach (SessionUpdate serverEvent in session.GetUpdatesAsync())
    {
        switch (serverEvent)
        {
            case SessionUpdateResponseAudioDelta audioDelta:
                byte[] audioData = audioDelta.Delta.ToArray();
                // Play audio via NAudio or other audio library
                break;
                
            case SessionUpdateResponseTextDelta textDelta:
                Console.Write(textDelta.Delta);
                break;
                
            case SessionUpdateResponseFunctionCallArgumentsDone functionCall:
                // Handle function call (see Function Calling section)
                break;
                
            case SessionUpdateError error:
                Console.WriteLine($"Error: {error.Error.Message}");
                break;
                
            case SessionUpdateResponseDone:
                Console.WriteLine("\n--- Response complete ---");
                break;
        }
    }
    ```
    
    ### 3. Send User Message
    
    ```csharp
    await session.AddItemAsync(new UserMessageItem("Hello, can you help me?"));
    await session.StartResponseAsync();
    ```
    
    ### 4. Function Calling
    
    ```csharp
    // Define function
    var weatherFunction = new VoiceLiveFunctionDefinition("get_current_weather")
    {
        Description = "Get the current weather for a given location",
        Parameters = BinaryData.FromString("""
            {
                "type": "object",
                "properties": {
                    "location": {
                        "type": "string",
                        "description": "The city and state or country"
                    }
                },
                "required": ["location"]
            }
            """)
    };
    
    // Add to session options
    sessionOptions.Tools.Add(weatherFunction);
    
    // Handle function call in event loop
    if (serverEvent is SessionUpdateResponseFunctionCallArgumentsDone functionCall)
    {
        if (functionCall.Name == "get_current_weather")
        {
            var parameters = JsonSerializer.Deserialize<Dictionary<string, string>>(functionCall.Arguments);
            string location = parameters?["location"] ?? "";
            
            // Call external service
            string weatherInfo = $"The weather in {location} is sunny, 75°F.";
            
            // Send response
            await session.AddItemAsync(new FunctionCallOutputItem(functionCall.CallId, weatherInfo));
            await session.StartResponseAsync();
        }
    }
    ```
    
    ## Voice Options
    
    | Voice Type | Class | Example |
    |------------|-------|---------|
    | Azure Standard | `AzureStandardVoice` | `"en-US-AvaNeural"` |
    | Azure HD | `AzureStandardVoice` | `"en-US-Ava:DragonHDLatestNeural"` |
    | Azure Custom | `AzureCustomVoice` | Custom voice with endpoint ID |
    
    ## Supported Models
    
    | Model | Description |
    |-------|-------------|
    | `gpt-4o-realtime-preview` | GPT-4o with real-time audio |
    | `gpt-4o-mini-realtime-preview` | Lightweight, fast interactions |
    | `phi4-mm-realtime` | Cost-effective multimodal |
    
    ## Key Types Reference
    
    | Type | Purpose |
    |------|---------|
    | `VoiceLiveClient` | Main client for creating sessions |
    | `VoiceLiveSession` | Active WebSocket session |
    | `VoiceLiveSessionOptions` | Session configuration |
    | `AzureStandardVoice` | Standard Azure voice provider |
    | `AzureSemanticVadTurnDetection` | Voice activity detection |
    | `VoiceLiveFunctionDefinition` | Function tool definition |
    | `UserMessageItem` | User text message |
    | `FunctionCallOutputItem` | Function call response |
    | `SessionUpdateResponseAudioDelta` | Audio chunk event |
    | `SessionUpdateResponseTextDelta` | Text chunk event |
    
    ## Best Practices
    
    1. **Always set both modalities** — Include `Text` and `Audio` for voice assistants
    2. **Use `AzureSemanticVadTurnDetection`** — Provides natural conversation flow
    3. **Configure appropriate silence duration** — 500ms typical to avoid premature cutoffs
    4. **Use `using` statement** — Ensures proper session disposal
    5. **Handle all event types** — Check for errors, audio, text, and function calls
    6. **Use DefaultAzureCredential** — Never hardcode API keys
    
    ## Error Handling
    
    ```csharp
    if (serverEvent is SessionUpdateError error)
    {
        if (error.Error.Message.Contains("Cancellation failed: no active response"))
        {
            // Benign error, can ignore
        }
        else
        {
            Console.WriteLine($"Error: {error.Error.Message}");
        }
    }
    ```
    
    ## Audio Configuration
    
    - **Input Format**: `InputAudioFormat.Pcm16` (16-bit PCM)
    - **Output Format**: `OutputAudioFormat.Pcm16`
    - **Sample Rate**: 24kHz recommended
    - **Channels**: Mono
    
    ## Related SDKs
    
    | SDK | Purpose | Install |
    |-----|---------|---------|
    | `Azure.AI.VoiceLive` | Real-time voice (this SDK) | `dotnet add package Azure.AI.VoiceLive` |
    | `Microsoft.CognitiveServices.Speech` | Speech-to-text, text-to-speech | `dotnet add package Microsoft.CognitiveServices.Speech` |
    | `NAudio` | Audio capture/playback | `dotnet add package NAudio` |
    
    ## Reference Links
    
    | Resource | URL |
    |----------|-----|
    | NuGet Package | https://www.nuget.org/packages/Azure.AI.VoiceLive |
    | API Reference | https://learn.microsoft.com/dotnet/api/azure.ai.voicelive |
    | GitHub Source | https://github.com/Azure/azure-sdk-for-net/tree/main/sdk/ai/Azure.AI.VoiceLive |
    | Quickstart | https://learn.microsoft.com/azure/ai-services/speech-service/voice-live-quickstart |
    

Comments (0)

Sign in to join the conversation.

No comments yet.

Reviews (0)

No reviews yet.

Related