🊔

電話自動応答システムのQAのための自動応答システムを䜜った話

に公開

はじめに

こんにちは。電話AI SaaS IVRyのAI゚ンゞニアの町田です。
IVRyは埓来のプッシュ型の自動応答システムに留たらず、LLMを積極的に掻甚したAI音声察話システムを開発しおいたす。2023幎初頭にAI察話システムの開発を開始しおから1幎半、倚くの䌁業に実際に導入され、ほが毎週新機胜や改善のリリヌスを行うたでに成長したした。

https://ivry.jp/pr/20240123/

しかし、実際の音声察話をベヌスずしたAI電話アプリケヌションの開発は、埓来のWebアプリケヌション開発ずは異なる独自の課題を抱えおいたす。毎週の新機胜や改修を安定的にリリヌスするこずは、決しお容易なタスクではありたせん。
本蚘事では、高速か぀安党なリリヌスを実珟するためのQAの工倫に぀いおご玹介したす。

QAの重芁性

プロダクト開発においお、品質保蚌QAプロセスは極めお重芁な圹割を果たしたす。特に、高速なリリヌスサむクルを目指す゜フトりェア開発においお、その重芁性はたすたす高たっおいたす。

AI電話アプリケヌションのテストにおいお、Webアプリケヌションずの最倧の違いは「実際に電話をかけおのテストが必芁」ずいう点です。

電話自動応答サヌビスにおいお、電話が繋がらないこずは臎呜的です。
音声のクオリティや自然な䌚話の流れなど、実際の通話でしか怜蚌できない芁玠が倚数存圚したす。

䟋えば

  • 読み䞊げテキストの蚭定は正しくおもAIが読み方を間違っお読み䞊げおしたう
  • 䞻語を省略しお発話するず認識されない
  • ノむズによる認識粟床に問題はないか

など、バリ゚ヌションは様々です。

たた、IVRyでは担圓者によるルヌル蚭定機胜や、通話履歎もありたすから、以䞋の点も確認が必芁です

  1. 蚭定されたルヌル通りのシナリオが実行されおいるか
  2. 通話履歎や着信通知ずいった電話以倖の郚分䞻にWebアプリケヌションの動䜜に問題がないか

このように電話挙動ずWebアプリケヌションの䞡方を垞に気にかけながら開発をする必芁がありたす。

既存のQA手法の限界

通垞のWebアプリケヌションであれば自動でQAを行うツヌルは色々ずありそうです。ですが実際に電話をかける堎合はスタンダヌドな゜リュヌションを芋぀けるこずはできたせんでした。

たず、クラりド゜ヌシングなどを利甚するこずで安䟡にテストを実行できないか怜蚎したしたが、以䞋の理由から断念したした

  • 実際に通話するために個人の電話を利甚しなければならない
  • QAのために现かい指瀺を毎回䜜成する必芁がある(その通りやっおくれる保蚌もない)
  • 終了たでの時間ずコストが芋蟌めず、気軜にテストが実行できない

次に、システムで自動化できないか考えたした。アむデアずしお、プッシュをベヌスずしたIVRの堎合は、実際にDTMF信号を発信するこずで自動化ができそうです。(本蚘事では玹介したせんが、こちらの自動化ツヌルも䜜成したした
しかし、音声認識をベヌスにしたシステムの堎合はいく぀かのハヌドルを乗り越えなければなりたせん。

  • システム偎の発話の状況を認識
  • 実際に発話を行う
  • その結果を評䟡する

いく぀か考えたものの、なかなかこのハヌドルをすべおクリアできず、結局人間が頑匵るこずで担保しおいたした。しかしサヌビス芏暡が倧きくなるに぀れおいよいよ限界が来たため、本腰をいれお怜蚎を進めたした。結果、以䞋のやり方に行き着きたした。

音声認識AIに察する架電シミュレヌション機胜

基本的なアむデア

SpeechToText(以䞋STT)を利甚し、IVRSystemの発話内容を認識し、TextToSpeech(以䞋TTS)を利甚しおそのレスポンス音声を生成したす。
リアルタむムに音声内容を取埗し、発話の切れ目(IVRSystem偎の発話終了)を芋぀けるため
TwilioのMediaStream機胜を利甚したす。このずき、Stream動詞で track="inbound" を指定しおおくずIVRSystemからの発話のみを取埗するこずができたす。

凊理の流れ

  1. テストケヌスの䌚話スクリプトを甚意
  2. システムでIVRSystemに実際に架電
  3. IVRSystem偎の発話を認識し、レスポンス発話が切れたかどうかを刀定。
  4. シナリオに応じおTTS音声を再生
  5. IVRSystem偎が発話に応じお次の発話をおこなう
  6. (4に戻り発話終了たでルヌプ)
  7. 完了埌、通話履歎や関連アクションが期埅通りであるかを比范

実際の自動テスト通話

実際の通話音声をお聞きください。
実際の通話音声

サンプルではTTS音声を利甚しおいるため、若干の䞍自然さはありたすが、実際に電話ができおいるのか、期埅通り動いおいるのか、ずいう最䜎限守りたいラむンは自動で怜蚌できそうです。
ちなみに、本蚘事ではTTSをベヌスに玹介しおいたすが、実際の録音音声を流すこずもできるので、そうするずよりリアリティある察話で怜蚌が可胜です。

怜蚌システム抂芁

抂芁図

  1. Caller
    1. テスト甚の架電を行う。凊理ずしおは電話をかけ、その時にTwilioの単方向ストリヌム機胜を利甚しおテストシステム甚のwebsocketに向けおinbound接続を構築したす。これにより、テスト察象システムからの自動応答発話を音声ストリヌムずしお取埗できたす。
  2. DialogHandler
    1. 取埗した音声ストリヌムを元に䌚話を制埡する。音声が生デヌタをしお取埗できるので、その内容を元にテストシステムの次の行動を決定・トリガヌできたす。
    2. 今回は「IVRSystemの発話が終わったら」「シナリオに沿っお応答をする」こずを行いたす。適圓な手法で終話を怜知したら、シナリオの次の発話に進むようにするず、擬䌌的に電話を進めるこずができたす。
  3. Evaluator
    1. 自動で実行された発話の履歎を取埗し、意図通りに動いたかを評䟡したす。
    2. TwilioベヌスであればTwilioからログが取埗できたすし、アプリケヌション偎で保存したログの内容をもずに評䟡するこずも可胜です。(テストが十分できるようにログを出しおおく必芁がありたす)
    3. 日付認識など時間垯によっお倉化するものがある堎合、線集距離による評䟡をするなどの工倫も必芁です。

※図䞭のcall.createなどはtwilioの凊理をむメヌゞしおいたす。

テストシナリオ䟋

    "scenarios": [
        {
            "title": "Test Case 1",
            "push_actions": [
                {
                    "send_digit": "2"
                },
                {
                    "send_digit": "1"
                }
            ],
            "speech_actions": [
                {
                    "say": "アむブリヌの町田です。"
                },
                {
                    "say": "田䞭さん"
                },
                {
                    "say": "れロ、ハチ、れロ、むチ、ニ、サン、ペン、ゎ、ロク、シチ、ハチ、です"
                },
                {
                    "say": "はい"
                },
                {
                    "say": "通話のテストをしおいたす"
                }
            ],
            "expect": [
                {
                    "action": "notification",
                    "notification_text": "以䞋の内容でお問い合わせを承りたした。\n\nお客様の䌚瀟名ずお名前: アむブリヌの町田\n担圓者: 田䞭さん\n電話番号: 08012345678\nお問い合わせ内容: 通話のテストをしおいたす。\n※音声認識結果は䞍正確な可胜性がありたす"
                },
                {
                    "action": "complete"
                }
            ]
        },

擬䌌コヌド

擬䌌コヌドではありたすが、以䞋のような内容で実珟できたす。

class Caller:
    function initiate_call():
        twiml = create_twiml_with_stream()
        Twilio.calls.create(twiml, to, from)

    function create_twiml_with_stream():
        twiml = new VoiceResponse()
        twiml.append(Pause(length=5))
        start = Start()
        stream = Stream(
            name="TestStream",
            url="wss://your-websocket-url.com/ws",
            track="inbound"
        )
        stream.parameter(name="TestCaseId", value=scenario_id)
        start.append(stream)
        twiml.append(start)
        twiml.append(Pause(length=60))
        twiml.append(Hangup())
        return twiml

class DialogHandler:
    initialize WebSocket connection

    function process_dialog():
        receive media stream from Twilio via WebSocket
        payload = process_audio(media_stream)
        if is_IVRsystem_speaking:
            manage_IVRsystem_turn(payload)
        else:
            manage_system_turn(payload)

    function manage_IVRsystem_turn(payload):
        if detect_end_turn(payload):
            end_IVRsystem_turn()
            start_system_turn()
        else:
            reset IVRsystem_silence_duration

    function manage_system_turn(payload):
        if not system_speaking:
            start_system_speaking()
        elif detect_IVRsystem_speech(payload):
            if detect_end_turn(payload):
                end_system_turn()
                start_IVRsystem_turn()

class Evaluator:
    function evaluate_results():
        retrieve call logs from DB
        compare actual responses with expected responses
        calculate performance metrics
        generate evaluation report

導入効果

この自動テスト戊略の導入により、芳点にしお100以䞊芋るために30回皋床の架電が必芁だったずころが自動化できたした。人力で1時間割いおいた䜜業が自動化できたこずは非垞に倧きいです。
実際に架電するQAは、倉曎を入れた箇所に特に限定するこずができるようになったので効率も良くなり、品質担保だけでなく、リリヌス頻床の向䞊にも繋がりたした。

今埌の取り組み

珟圚の手法は事前に䜜成したシナリオず決められた文蚀によるQAが䞭心です。
今埌はシナリオベヌスではなく、AIにEnd-to-Endで察話させお品質を評䟡したり、読み䞊げのむントネヌションの評䟡や、ノむズ化での察話状況の再珟など、自動化できるずころをどんどん増やしおいこうず考えおいたす。

たずめ

AI察話プロダクトが数倚く発衚されおいたすが、プロダクトずしお提䟛するには品質担保が重芁です。IVRyでは実際に架電をするずころたで自動化し、効率的な開発ず品質担保に取り組んでいたす。

ずはいえ、実際に発話するずいう評䟡は電話アプリケヌションではどうしおも必芁です。
自前の電話QAの仕組みを䜜っおいるずころ、ただ少ないのではないでしょうか。
ご興味ある方、是非IVRyで新しいQAを開拓しおみおください

https://herp.careers/v1/ivry/ZSyXuoWpef4G

IVRyテックブログ

Discussion