mcpField
V
voice-assist

voice-assist

github.com/happy-technologies-llcエージェントワークフロー4141 回インストール2 日前に更新
リポジトリ

voice-assist について

ServiceNow の音声対応 Virtual Agent トピック、音声処理、NLU、電話フローを設定するスキルです。音声セルフサービスやヘルプデスクを構築するチーム向けに、設定から監視、トラブルシューティングまでを扱います。

主な機能

  1. 01音声対応 Virtual Agent トピックの設定
  2. 02STT と TTS のプロパティ設定
  3. 03音声入力向け NLU インテントの学習
  4. 04DTMF フォールバック付きフロー設計
  5. 05インタラクション記録と分析の確認

活用シーン

  1. 01音声対応 IT ヘルプデスクの導入
  2. 02Virtual Agent トピックの音声対応
  3. 03IVR セルフサービスフローの設定
  4. 04音声インタラクション記録の監視

MCP 対応

SN-Query-Table、SN-Create-Record、SN-Update-Record などの ServiceNow MCP ツールを使い、トピック、インテント、プロパティ、インタラクション記録を設定する方法を説明します。

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/happy-technologies-llc/happy-platform-skills --skill voice-assist

インストール後、Claude Code で/voice-assistを入力して読み込まれたか確認します。

詳細

AI 音声エージェントの設定

概要

このスキルでは、ServiceNow で電話および音声による対話に対応する AI 搭載音声エージェントの設定について説明します。以下の内容を扱います。

  • 音声チャネルに対応するための Virtual Agent トピックの設定
  • 音声テキスト変換(STT)およびテキスト音声変換(TTS)エンジンの連携設定
  • NLU のトレーニングによる、音声入力向けインテント認識モデルの設計
  • DTMF による代替手段を備えた、音声専用の会話フローの構築
  • IVR システムおよび電話プロバイダー(Twilio、Genesys、Amazon Connect)との連携
  • 音声対話レコードと分析の管理
  • ノイズ、アクセント、曖昧さの解消、タイムアウト管理など、音声特有の課題への対応

使用する場面:

  • 音声対応の IT ヘルプデスクまたは人事サービスセンターを導入する場合
  • AI 主導の自然言語理解を活用した IVR セルフサービスを設定する場合
  • 既存の Virtual Agent トピックを拡張し、音声チャネルに対応させる場合
  • フィールドサービスやハンズフリーのシナリオ向けに、音声を優先したワークフローを構築する場合
  • 音声認証と発信者確認を設定する場合

前提条件

  • ロール: admin、sn_va.topic_admin、sn_cs.admin、または sn_va.voice_admin
  • プラグイン: com.glide.cs.chatbot(Virtual Agent)、com.sn_va.voice(Voice)、com.glide.interaction(Agent Workspace Interaction)
  • アクセス権: sys_cs_topic、interaction、sys_cs_intent、sys_properties テーブル
  • 知識: 対話型 AI の設計原則、電話の基礎(SIP、DTMF)、および組織の IVR コールフロー要件
  • 連携: ServiceNow と連携するよう設定された電話プロバイダー(Twilio、Genesys Cloud、Amazon Connect)

主な音声テーブル

テーブル目的主なフィールド
sys_cs_topicVirtual Agent の会話トピックname、description、channel、state、nlu_intent、category、order
interaction音声/チャット対話レコードnumber、channel、state、opened_for、assignment_group、duration、disposition、recording_url
sys_cs_topic_detailトピックフローのステップ定義topic、step_type、prompt_text、order、variable_name、next_step
sys_cs_message会話メッセージinteraction、message_type、body、direction、timestamp
sys_cs_intentNLU インテント定義name、description、model、training_phrases、confidence_threshold
sys_cs_context会話コンテキスト変数name、data_type、scope、default_value
sys_propertiesシステム設定プロパティname、value、description、type

手順

ステップ 1:音声プラグインと電話の設定を確認する

音声機能が有効になっており、設定済みであることを確認します。

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

REST API を使用:

GET /api/now/table/sys_properties?sysparm_query=nameLIKEva.voice^ORnameLIKEcs.voice^ORnameLIKEtelephony&sysparm_fields=name,value,description&sysparm_limit=30
ステップ 2:音声テキスト変換の設定を行う

音声入力処理用に STT エンジンのプロパティを設定します。

MCP を使用:

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

設定する主な STT プロパティ:

プロパティ目的推奨値
sn.va.voice.stt.providerSTT エンジンプロバイダーgoogle_cloud_speech、aws_transcribe、azure_speech
sn.va.voice.stt.language主な認識言語en-US
sn.va.voice.stt.model認識モデルの種類phone_call(電話向けに最適化)
sn.va.voice.stt.profanity_filter不適切な表現をフィルタリングtrue
sn.va.voice.stt.interim_results部分的な結果を有効化true
sn.va.voice.tts.providerTTS エンジンプロバイダーgoogle_cloud_tts、aws_polly、azure_speech
sn.va.voice.tts.voiceTTS 音声の選択en-US-Neural2-C(自然な音声)
sn.va.voice.tts.speed読み上げ速度1.0(標準速度)
ステップ 3:音声対応トピックを作成する

音声対話に最適化された Virtual Agent トピックを構築します。

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?"

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"
}
ステップ 4:音声会話フローのステップを設計する

音声会話用のトピック詳細ステップを追加します。

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."

確認ステップを追加:

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

確認プロンプトを追加:

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"
ステップ 5:音声用の NLU インテントを設定する

音声特有の発話を認識するように NLU モデルをトレーニングします。

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

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"
}
ステップ 6:IVR 連携を設定する

テレフォニープロバイダーへの接続を設定します。

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"
ステップ 7:音声インタラクションを監視する

音声チャネルの分析用に、インタラクションレコードを照会します。

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

音声分析を生成する:

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"

ツールの使用方法

操作MCP ツールREST エンドポイント
トピックの照会SN-Query-TableGET /api/now/table/sys_cs_topic
トピックの作成SN-Create-RecordPOST /api/now/table/sys_cs_topic
フローステップの作成SN-Create-RecordPOST /api/now/table/sys_cs_topic_detail
インテントの設定SN-Create-RecordPOST /api/now/table/sys_cs_intent
インタラクションの照会SN-Query-TableGET /api/now/table/interaction
プロパティの設定SN-Execute-Background-ScriptPOST /api/now/table/sys_properties
スキーマの検出SN-Discover-Table-SchemaGET /api/now/table/sys_dictionary

ベストプラクティス

  • 音声優先の設計: 目ではなく耳で聞くことを前提にプロンプトを作成し、音声での応答は 30 語未満にします
  • DTMF によるフォールバック: 音声入力を行うすべてのステップで、フォールバックとしてキーパッド入力を必ず用意します
  • タイムアウトの処理: 8〜10 秒のタイムアウトを設定し、自然に再プロンプトを行います。3 回失敗したらエージェントへの転送を提案します
  • 確認ステップ: 操作を実行する前に、重要な入力(従業員 ID、チケット番号など)を必ず確認します
  • 割り込みへの対応: 割り込みを有効にし、発信者がプロンプトを中断できるようにして、慣れたユーザー向けのフローを効率化します
  • 保留音/メッセージ: エージェント転送キューに適切な保留中の体験を設定します
  • 録音の同意: 管轄区域の要件に応じて、通話録音の同意を求めるプロンプトを実装します
  • エラーからの復旧: 会話のすべての経路にライブエージェントへの終了経路を設けます。発信者が行き詰まる状態にしないでください
  • アクセントへの適応: 多様なアクセントでトレーニングされた STT モデルを使用し、地域固有の言語モデルも検討します
  • テスト: テキストシミュレーションだけでなく、実際の電話でテストします。背景ノイズや音質には大きな違いがあります

トラブルシューティング

音声認識の精度が低い

症状: STT が発信者の音声を頻繁に誤認識します 原因: デフォルトの STT モデルは、テレフォニー音声の品質(8kHz の狭帯域)に最適化されていない可能性があります 解決策: STT モデルを phone_call または telephony のバリアントに切り替えます。会社固有の用語をカスタム語彙に追加します。オーディオコーデックの互換性を確認します(G.711 を推奨)。

発信者がループから抜け出せない

症状: 発信者から、同じ質問を繰り返し尋ねられるという報告があります 原因: トピックフローステップの再試行ロジックに終了条件または最大再試行後の転送処理がありません 解決策: すべての入力ステップで retry_count を最大 3 に設定します。最大再試行回数に達した後に、「エージェントに転送」するステップを明示的に追加します。

音声トピックが起動しない

症状: 通話は接続されますが、音声トピックが開始しません 原因: トピックのチャネルフィルターで音声が除外されているか、NLU の信頼度しきい値が高すぎます 解決策: トピックレコードで channel=voice が設定されていることを確認します。音声認識によるノイズが発生するため、音声用の NLU 信頼度しきい値を 0.6 に下げます。

連携用 Webhook で通話を受信できない

症状: テレフォニープロバイダーは設定されていますが、通話が ServiceNow に届きません 原因: Webhook URL が正しくない、ファイアウォールが受信トラフィックをブロックしている、または SSL 証明書に問題があります 解決策: Webhook URL が {instance}/api/sn_va/voice/webhook と一致することを確認します。ネットワーク ACL と証明書の有効性を確認します。プロバイダーの Webhook 検証ツールでテストします。

例

例 1:IT ヘルプデスクの音声エージェント

シナリオ: よくある IT サポートの依頼に対応する音声エージェントを導入します

作成するトピック:

  1. パスワードのリセット(MFA 検証に最適化された音声対応)
  2. VPN 接続(はい/いいえで回答する質問を使った段階的なトラブルシューティング)
  3. ソフトウェアのリクエスト(ソフトウェア名と理由を聞き取ります)
  4. インシデントのステータス確認(チケット番号または発信者 ID で検索します)
  5. エージェントへの転送(コンテキストを引き継いでスムーズに転送します)

対話例:

  • 発信者:「パスワードをリセットしたいのですが」
  • エージェント:「承知しました。セキュリティのため、本人確認が必要です。従業員 ID をおっしゃってください」
  • 発信者:「1、2、3、4、5」
  • エージェント:「ありがとうございます。John Smith さんのアカウントが見つかりました。こちらでよろしいですか?」
  • 発信者:「はい」
  • エージェント:「登録済みのメールアドレスにパスワードリセット用のリンクを送信しました。2 分以内に届くはずです。他にお手伝いできることはありますか?」
例 2:人事福利厚生に関する音声セルフサービス

シナリオ: 福利厚生の登録に関する質問に対応する音声エージェントを設定します

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

関連スキル

  • genai/playbook-generation - 音声ワークフローのプロセス自動化
  • genai/flow-generation - 音声をトリガーとする自動化のための Flow Designer
  • csm/chat-recommendation - チャットベースの推奨(音声にも拡張可能)
  • hrsd/chat-reply-recommendation - 音声にも応用できる人事チャットの返信
  • admin/workflow-creation - 音声でのやり取りをトリガーとするワークフローを構築します

コメント