voice-assist について
ServiceNow の音声対応 Virtual Agent トピック、音声処理、NLU、電話フローを設定するスキルです。音声セルフサービスやヘルプデスクを構築するチーム向けに、設定から監視、トラブルシューティングまでを扱います。
主な機能
- 01音声対応 Virtual Agent トピックの設定
- 02STT と TTS のプロパティ設定
- 03音声入力向け NLU インテントの学習
- 04DTMF フォールバック付きフロー設計
- 05インタラクション記録と分析の確認
活用シーン
- 01音声対応 IT ヘルプデスクの導入
- 02Virtual Agent トピックの音声対応
- 03IVR セルフサービスフローの設定
- 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_topic | Virtual 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_intent | NLU インテント定義 | 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.provider | STT エンジンプロバイダー | 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.provider | TTS エンジンプロバイダー | google_cloud_tts、aws_polly、azure_speech |
sn.va.voice.tts.voice | TTS 音声の選択 | 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-Table | GET /api/now/table/sys_cs_topic |
| トピックの作成 | SN-Create-Record | POST /api/now/table/sys_cs_topic |
| フローステップの作成 | SN-Create-Record | POST /api/now/table/sys_cs_topic_detail |
| インテントの設定 | SN-Create-Record | POST /api/now/table/sys_cs_intent |
| インタラクションの照会 | SN-Query-Table | GET /api/now/table/interaction |
| プロパティの設定 | SN-Execute-Background-Script | POST /api/now/table/sys_properties |
| スキーマの検出 | SN-Discover-Table-Schema | GET /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 サポートの依頼に対応する音声エージェントを導入します
作成するトピック:
- パスワードのリセット(MFA 検証に最適化された音声対応)
- VPN 接続(はい/いいえで回答する質問を使った段階的なトラブルシューティング)
- ソフトウェアのリクエスト(ソフトウェア名と理由を聞き取ります)
- インシデントのステータス確認(チケット番号または発信者 ID で検索します)
- エージェントへの転送(コンテキストを引き継いでスムーズに転送します)
対話例:
- 発信者:「パスワードをリセットしたいのですが」
- エージェント:「承知しました。セキュリティのため、本人確認が必要です。従業員 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 Designercsm/chat-recommendation- チャットベースの推奨(音声にも拡張可能)hrsd/chat-reply-recommendation- 音声にも応用できる人事チャットの返信admin/workflow-creation- 音声でのやり取りをトリガーとするワークフローを構築します