AI Voice Agent Configuration

SkillMedia

Configure AI Voice Agents for ServiceNow including speech-to-text, intent recognition, voice-driven workflows, IVR integration, and conversational AI for voice channels

Available today. Use it from your connected AI after setup.

Connect ahel once, and every AI you use reads what you have installed.

Then ask your AI: use the AI Voice Agent Configuration skill

What this skill tells your AI

The instructions your AI receives, as published by happy-technologies-llc/happy-platform-skills in skills/genai/voice-assist/SKILL.md and read by ahel’s review.

Overview

This skill covers configuring AI-powered Voice Agents in ServiceNow for telephony and voice-driven interactions. It covers:

  • Setting up Virtual Agent topics for voice channel compatibility
  • Configuring speech-to-text (STT) and text-to-speech (TTS) engine integration
  • Designing intent recognition models for voice input with NLU training
  • Building voice-specific conversation flows with DTMF fallback support
  • Integrating with IVR systems and telephony providers (Twilio, Genesys, Amazon Connect)
  • Managing voice interaction records and analytics
  • Handling voice-specific challenges: noise, accents, disambiguation, and timeout management

When to use:

  • When deploying a voice-enabled IT helpdesk or HR service center
  • Setting up IVR self-service with AI-driven natural language understanding
  • When extending existing Virtual Agent topics to support voice channels
  • Building voice-first workflows for field service or hands-free scenarios
  • Configuring voice authentication and caller verification

Prerequisites

  • Roles: admin, sn_va.topic_admin, sn_cs.admin, or sn_va.voice_admin
  • Plugins: com.glide.cs.chatbot (Virtual Agent), com.sn_va.voice (Voice), com.glide.interaction (Agent Workspace Interaction)
  • Access: sys_cs_topic, interaction, sys_cs_intent, sys_properties tables
  • Knowledge: Conversational AI design principles, telephony basics (SIP, DTMF), and your organization's IVR call flow requirements
  • Integrations: A telephony provider (Twilio, Genesys Cloud, Amazon Connect) configured with ServiceNow

Key Voice Tables

TablePurposeKey Fields
sys_cs_topicVirtual Agent conversation topicsname, description, channel, state, nlu_intent, category, order
interactionVoice/chat interaction recordsnumber, channel, state, opened_for, assignment_group, duration, disposition, recording_url
sys_cs_topic_detailTopic flow step definitionstopic, step_type, prompt_text, order, variable_name, next_step
sys_cs_messageConversation messagesinteraction, message_type, body, direction, timestamp
sys_cs_intentNLU intent definitionsname, description, model, training_phrases, confidence_threshold
sys_cs_contextConversation context variablesname, data_type, scope, default_value
sys_propertiesSystem configuration propertiesname, value, description, type

Procedure

Step 1: Verify Voice Plugin and Telephony Setup

Check that voice capabilities are enabled and configured.

Using MCP (Claude Code/Desktop):

Tool: SN-Query-Table
Parameters:
  table_name: sys_properties
  query: nameLIKEva.voice^ORnameLIKEcs.voice^ORnameLIKEtelephony
  fields: name,value,description
  limit: 30

Using REST API:

GET /api/now/table/sys_properties?sysparm_query=nameLIKEva.voice^ORnameLIKEcs.voice^ORnameLIKEtelephony&sysparm_fields=name,value,description&sysparm_limit=30

Step 2: Configure Speech-to-Text Settings

Set up STT engine properties for voice input processing.

Using MCP:

Tool: SN-Update-Record
Parameters:
  table_name: sys_properties
  sys_id: [stt_property_sys_id]
  data:
    value: "google_cloud_speech"

Key STT properties to configure:

PropertyPurposeRecommended Value
sn.va.voice.stt.providerSTT engine providergoogle_cloud_speech, aws_transcribe, azure_speech
sn.va.voice.stt.languagePrimary recognition languageen-US
sn.va.voice.stt.modelRecognition model typephone_call (optimized for telephony)
sn.va.voice.stt.profanity_filterFilter profanitytrue
sn.va.voice.stt.interim_resultsEnable partial resultstrue
sn.va.voice.tts.providerTTS engine providergoogle_cloud_tts, aws_polly, azure_speech
sn.va.voice.tts.voiceTTS voice selectionen-US-Neural2-C (natural voice)
sn.va.voice.tts.speedSpeech rate1.0 (normal speed)

Step 3: Create Voice-Enabled Topics

Build Virtual Agent topics optimized for voice interactions.

Using MCP:

Tool: SN-Create-Record
Parameters:
  table_name: sys_cs_topic
  fields:
    name: "Password Reset - Voice"
    description: "Voice-optimized password reset flow with caller verification and DTMF fallback"
    channel: voice
    state: draft
    category: it_support
    nlu_intent: password_reset
    greeting_message: "I can help you reset your password. First, I need to verify your identity. Can you please tell me your employee ID?"

Using REST API:

POST /api/now/table/sys_cs_topic
Content-Type: application/json

{
  "name": "Password Reset - Voice",
  "description": "Voice-optimized password reset flow with caller verification",
  "channel": "voice",
  "state": "draft",
  "category": "it_support",
  "nlu_intent": "password_reset"
}

Step 4: Design Voice Conversation Flow Steps

Add topic detail steps for the voice conversation.

Using MCP:

Tool: SN-Create-Record
Parameters:
  table_name: sys_cs_topic_detail
  fields:
    topic: [topic_sys_id]
    step_type: user_input
    prompt_text: "Please say or enter your employee ID number."
    order: 100
    variable_name: employee_id
    input_type: alphanumeric
    dtmf_enabled: true
    timeout_seconds: 10
    retry_count: 3
    retry_prompt: "I did not catch that. Please say your employee ID again, or press the numbers on your phone keypad."
    no_input_prompt: "Are you still there? Please say your employee ID to continue."

Add verification step:

Tool: SN-Create-Record
Parameters:
  table_name: sys_cs_topic_detail
  fields:
    topic: [topic_sys_id]
    step_type: script_action
    order: 200
    script: |
      var user = new GlideRecord('sys_user');
      user.addQuery('employee_number', vaInputs.employee_id);
      user.query();
      if (user.next()) {
        vaVars.user_sys_id = user.sys_id.toString();
        vaVars.user_name = user.name.toString();
        vaVars.verified = true;
      } else {
        vaVars.verified = false;
      }
    next_step_success: 300
    next_step_failure: 250

Add confirmation prompt:

Tool: SN-Create-Record
Parameters:
  table_name: sys_cs_topic_detail
  fields:
    topic: [topic_sys_id]
    step_type: user_input
    prompt_text: "I found your account. Just to confirm, is your name {user_name}? Please say yes or no."
    order: 300
    variable_name: name_confirmed
    input_type: boolean
    dtmf_mapping: "1=yes,2=no"

Step 5: Configure NLU Intent for Voice

Train the NLU model to recognize voice-specific utterances.

Using MCP:

Tool: SN-Create-Record
Parameters:
  table_name: sys_cs_intent
  fields:
    name: password_reset
    description: "Intent for password reset requests via voice channel"
    model: default_nlu_model
    confidence_threshold: 0.7
    training_phrases: |
      I need to reset my password
      my password is not working
      I forgot my password
      can you help me change my password
      I am locked out of my account
      password expired
      I cannot log in
      reset password please
      my password does not work anymore
      I need a new password
      help me with my password
      account is locked

Using REST API:

POST /api/now/table/sys_cs_intent
Content-Type: application/json

{
  "name": "password_reset",
  "description": "Intent for password reset requests via voice",
  "confidence_threshold": "0.7",
  "training_phrases": "I need to reset my password\nmy password is not working\nI forgot my password\ncan you help me change my password\nI am locked out"
}

Step 6: Set Up IVR Integration

Configure the telephony provider connection.

Using MCP:

Tool: SN-Execute-Background-Script
Parameters:
  script: |
    // Configure Twilio integration properties
    var props = {
      'sn.va.voice.telephony.provider': 'twilio',
      'sn.va.voice.telephony.account_sid': '[twilio_account_sid]',
      'sn.va.voice.telephony.phone_number': '+18005551234',
      'sn.va.voice.telephony.webhook_url': gs.getProperty('glide.servlet.uri') + 'api/sn_va/voice/webhook',
      'sn.va.voice.telephony.recording_enabled': 'true',
      'sn.va.voice.telephony.max_call_duration': '1800',
      'sn.va.voice.telephony.transfer_number': '+18005555678'
    };

    for (var key in props) {
      var prop = new GlideRecord('sys_properties');
      prop.addQuery('name', key);
      prop.query();
      if (prop.next()) {
        prop.value = props[key];
        prop.update();
      } else {
        prop.initialize();
        prop.name = key;
        prop.value = props[key];
        prop.description = 'Voice agent telephony configuration';
        prop.insert();
      }
    }
    gs.info('Telephony properties configured: ' + Object.keys(props).length + ' properties set.');
  description: "Voice: Configure telephony provider integration properties"

Step 7: Monitor Voice Interactions

Query interaction records for voice channel analytics.

Using MCP:

Tool: SN-Query-Table
Parameters:
  table_name: interaction
  query: channel=voice^ORDERBYDESCsys_created_on
  fields: sys_id,number,channel,state,opened_for,assignment_group,duration,disposition,topic,sys_created_on,close_notes
  limit: 50

Generate voice analytics:

Tool: SN-Execute-Background-Script
Parameters:
  script: |
    var analytics = {
      period: 'Last 30 days',
      total_calls: 0,
      avg_duration_seconds: 0,
      self_service_rate: 0,
      transfer_rate: 0,
      by_disposition: {},
      by_topic: {},
      avg_confidence: 0
    };

    var ga = new GlideAggregate('interaction');
    ga.addQuery('channel', 'voice');
    ga.addQuery('sys_created_on', '>=', gs.daysAgo(30));
    ga.addAggregate('COUNT');
    ga.addAggregate('AVG', 'duration');
    ga.query();
    if (ga.next()) {
      analytics.total_calls = parseInt(ga.getAggregate('COUNT'));
      analytics.avg_duration_seconds = Math.round(parseFloat(ga.getAggregate('AVG', 'duration')) || 0);
    }

    var resolved = new GlideAggregate('interaction');
    resolved.addQuery('channel', 'voice');
    resolved.addQuery('sys_created_on', '>=', gs.daysAgo(30));
    resolved.addQuery('disposition', 'resolved');
    resolved.addAggregate('COUNT');
    resolved.query();
    if (resolved.next() && analytics.total_calls > 0) {
      analytics.self_service_rate = Math.round((parseInt(resolved.getAggregate('COUNT')) / analytics.total_calls) * 100);
    }

    gs.info('VOICE ANALYTICS:\n' + JSON.stringify(analytics, null, 2));
  description: "Voice: Generate voice interaction analytics for the last 30 days"

Tool Usage

OperationMCP ToolREST Endpoint
Query TopicsSN-Query-TableGET /api/now/table/sys_cs_topic
Create TopicsSN-Create-RecordPOST /api/now/table/sys_cs_topic
Create Flow StepsSN-Create-RecordPOST /api/now/table/sys_cs_topic_detail
Configure IntentsSN-Create-RecordPOST /api/now/table/sys_cs_intent
Query InteractionsSN-Query-TableGET /api/now/table/interaction
Set PropertiesSN-Execute-Background-ScriptPOST /api/now/table/sys_properties
Schema DiscoverySN-Discover-Table-SchemaGET /api/now/table/sys_dictionary

Best Practices

  • Voice-First Design: Write prompts for the ear, not the eye; keep responses under 30 words for voice
  • DTMF Fallback: Always provide keypad input as a fallback for every voice input step
  • Timeout Handling: Set 8-10 second timeouts with graceful re-prompts; offer agent transfer after 3 failures
  • Confirmation Steps: Always confirm critical inputs (employee ID, ticket number) before taking action
  • Barge-In Support: Enable barge-in so callers can interrupt prompts to speed up experienced-user flows
  • Hold Music/Messages: Configure appropriate hold experiences for agent transfer queues
  • Recording Consent: Implement call recording consent prompts as required by jurisdiction
  • Error Recovery: Design every conversation path to have an exit to a live agent; never leave callers in a dead end
  • Accent Adaptation: Use STT models trained on diverse accents; consider region-specific language models
  • Testing: Test with real phone calls, not just text simulation; background noise and audio quality differ significantly

Troubleshooting

Speech Recognition Accuracy Is Low

Symptom: STT frequently misrecognizes caller speech Cause: Default STT model may not be optimized for telephony audio quality (8kHz narrowband) Solution: Switch STT model to phone_call or telephony variant. Add custom vocabulary for company-specific terms. Check audio codec compatibility (G.711 recommended).

Caller Gets Stuck in Loop

Symptom: Callers report being asked the same question repeatedly Cause: Topic flow step retry logic lacks an exit condition or max-retry transfer Solution: Set retry_count to 3 maximum on all input steps. Add an explicit "transfer to agent" step after max retries.

Voice Topic Not Triggering

Symptom: Calls connect but the voice topic does not start Cause: Topic channel filter excludes voice, or the NLU confidence threshold is too high Solution: Verify channel=voice on the topic record. Lower NLU confidence threshold to 0.6 for voice (speech recognition introduces noise).

Integration Webhook Not Receiving Calls

Symptom: Telephony provider configured but calls do not reach ServiceNow Cause: Webhook URL is incorrect, firewall blocks inbound traffic, or SSL certificate issue Solution: Verify the webhook URL matches {instance}/api/sn_va/voice/webhook. Check network ACLs and certificate validity. Test with the provider's webhook validator tool.

Examples

Example 1: IT Helpdesk Voice Agent

Scenario: Deploy a voice agent for common IT support requests

Topics to create:

  1. Password Reset (voice-optimized with MFA verification)
  2. VPN Connectivity (guided troubleshooting with yes/no questions)
  3. Software Request (capture software name and justification)
  4. Incident Status Check (look up by ticket number or caller ID)
  5. Agent Transfer (graceful handoff with context)

Sample interaction:

  • Caller: "I need to reset my password"
  • Agent: "I can help with that. For security, I need to verify your identity. Please say your employee ID."
  • Caller: "One two three four five"
  • Agent: "Thank you. I found your account for John Smith. Is that correct?"
  • Caller: "Yes"
  • Agent: "A password reset link has been sent to your registered email. You should receive it within 2 minutes. Is there anything else I can help with?"

Example 2: HR Benefits Voice Self-Service

Scenario: Configure voice agent for benefits enrollment questions

Tool: SN-Create-Record
Parameters:
  table_name: sys_cs_topic
  fields:
    name: "Benefits Inquiry - Voice"
    description: "Voice self-service for benefits plan information, enrollment status, and coverage details"
    channel: voice
    state: draft
    category: hr_benefits
    nlu_intent: benefits_inquiry

Related Skills

  • genai/playbook-generation - Process automation for voice workflows
  • genai/flow-generation - Flow Designer for voice-triggered automation
  • csm/chat-recommendation - Chat-based recommendations (extend to voice)
  • hrsd/chat-reply-recommendation - HR chat replies adaptable to voice
  • admin/workflow-creation - Build workflows triggered by voice interactions

Signals

GitHub stars
37
Forks
13
Last commit
Jul 2026
Advanced
Catalog kind
skill
Gateway key
voice-assist
Source
github.com/happy-technologies-llc/happy-platform-skills