トレタ開発者ブログ

飲食店向け予約/顧客台帳サービス「トレタ」、モバイルオーダー「トレタO/X」などを運営するトレタの開発メンバーによるブログです。

トレタ予約番を支える技術

こんにちは、トレタ予約番事業で開発リーダーをしている北川です。

トレタ2022年アドベントカレンダー19日目の記事として、トレタ予約番サービスについて今まであまり公表していなかった裏側の仕組みについて紹介したいと思います。

トレタ予約番とは

まずトレタ予約番というサービスの紹介です。

トレタ予約番は、飲食店の電話に自動応答ロボットが24時間応答し、予約の受付/変更/キャンセルを対応してくれるサービスです。

飲食店にとっては今まで営業時間外にかかってきて取りこぼしていた予約電話を受けられるようになったり、多忙な営業時間の電話応答はトレタ予約番に任せつつ、スタッフ対応が必要な電話だけトレタ予約番からスタッフに繋ぐことで、業務負荷の軽減に役立てていただいています。

自動応答の電話というと宅配便の受取時間変更の電話のようなIVRをイメージされるかと思いますが、大きな違いとしてはユーザーはプッシュボタンでの操作ではなく、音声で操作を行う点です。

それを実現するために、音声認識や音声合成などの技術要素を色々と利用しているので、その仕組みについて紹介していきます。

toreta.in

具体的なトレタ予約番に電話したときの様子はこちらのサービスサイトに動画があるので、是非見て聞いてみてください。

会話の仕組み

電話サービス

まず、電話のサービスにはAWSのAmazon Connectを利用しています。

Amazon Connectはコールセンター向けの電話サービスです。

電話を受電した際にどのコールスタッフに繋ぐかなど応答時のフローを柔軟に設定することができ、AWS Lambdaを使うことでプログラマブルな制御を入れることができるのも特徴です。

Amazon ConnectにはCCPというコントロールパネルのSDKや、CCPと連携するためのAmazon Connect Streamsというライブラリが提供されています。これらを使い、電話の応答・切断・転送などをプログラムで制御します。

aws.amazon.com

音声認識

通話中の音声データから、音声認識を行いテキストデータに変換します。

音声認識にはGCPのSpeech-to-Textを利用しています。Speech-to-TextのAPIに音声データを入力してほぼリアルタイムに音声認識結果のテキストデータを取得することができます。

もちろん日本語に対応していますし、GCP以外の音声認識エンジンをいくつか精度検証を行いましたが現時点ではGCPが頭ひとつ抜けて精度がよい印象です。

後述していますが、専用の学習モデルに切り替えられたりチューニングなどで音声認識の向上を行うことも可能です。

cloud.google.com

自然言語処理

音声認識で取得したテキストデータは文字起こしされた文章なので、そこから意味を解釈して必要なデータを抽出するのが自然言語処理です。

例えば、予約の人数について「2名です」という発話であれば「2」という数値データを抽出します。

人によって「2名」や「2人」など語彙の揺れがあるので、自然言語処理によってそれらの揺れを吸収します。

自然言語処理についてはトレタ予約番を共同開発しているユニロボット株式会社のunirobot cloudを使用しています。

www.unirobot.com

会話シナリオ

予約電話の会話は基本的にシナリオがあり、大まかに以下のステップを踏みながら会話を進めます。

  1. 日時の質問
  2. 人数の質問
  3. 連絡先の確認
  4. 予約内容の確認

日時の質問であればユーザーが日時を答えることが期待値であり、自然言語処理を行なった結果が日時として認識できれば次のステップに進みます。日時以外の内容であれば再度日時を言い直すように応答します。

また、ユーザーの発話内容をサーバー側の処理を通すことでシステムの応答内容を分岐させる場合もあります。

例えばユーザーが「23時」と答えた場合、日時としては正しいですが店舗の営業時間外であれば正しく日時として、正しくないことを伝え再度日時を質問します。

最後に予約確認まで進めば、トレタの予約台帳のAPIに対して予約登録を行い、登録完了を伝えて通話終了となります。

音声合成

シナリオに沿ってシステムの回答を音声合成サービスを通して音声データとして作成します。大体は決まった文言ではありますが、ユーザーの発話内容を復唱したりするため毎会話ごとに音声合成を行なっています。

現在は株式会社エーアイのAITalkを利用しています。日本語がとても自然なのと、イントネーションや感情値など細かいチューニングが行えるので、明るく活発な印象にすることができています。

www.ai-j.jp

サービス向上のとりくみ

基本的な動きとしては前述の通りですが、より自然に、よりユーザーにストレスがないように細かいチューニングを日々行なっています。

サービスの質に直結する音声認識精度の向上に向けた取り組みについていくつか紹介します。

学習モデルのチューニング

現在使用しているGCPのSpeechToTextには認識精度を向上させるためのチューニング方法がいくつか提供されています。

例えば、音声文字変換モデルで電話の通話に最適化された phone_call モデルがあります。通話音声は音の帯域が狭く音質が悪いためこのモデルを利用するのは有効的です。

cloud.google.com

その他にも PhraseSet を設定することで任意の単語の精度を上げることができます。例えば「はい」「いいえ」の回答を要求する会話の部分において、「いいえ」を「家(いえ)」と誤認識してしまうことがありましたが、「はい」「いいえ」をフレーズ設定することで正しく認識する確率が上がりました。

意味を汲み取る

正しく音声認識をしても文脈で意味が異なるケースがあります。

例えば、予約の日時を聞いた時の回答が「7時」であった場合、予約の文脈であれば「午前7時」ではなく「午後7時(19時)」が正しいと考えるのが一般的です。

厳密にはその店舗の営業時間を参照し、7時なのか19時なのかを判別し正しいと思われる方で音声認識の結果を補正します。

他にも、例えば予約の日時を「7月(しちがつ)」と認識した場合、その時の日付が1月であれば「1月(いちがつ)」を「7月(しちがつ)」と誤認識してしまった可能性が高いです。

「2月(にがつ)」「4月(しがつ)」などの様に、日時としては正しいが聞き間違い(誤認識)をしてしまうことは多々あります。 その場合はその時の日付や時間帯なども考慮して、音声認識した結果を改めるようにしています。

もっと難しい判定としては「大丈夫」などのどちらにも捉えられるワードがあります。

「この内容でよろしいですか?」「大丈夫です」の場合、おそらくYesと思われます。

「店舗にお繋ぎしますか?」「大丈夫です」の場合、おそらくNoと思われます。

このように曖昧な表現は各会話ごとにどう解釈させるかを定義として入れて対応しています。

さいごに

トレタ予約番は正式ローンチして1年以上経つサービスですが、AIの業界は日進月歩の世界なのでその時その時でよりよい音声認識エンジンであったり合成音声エンジンを切り替えたり、多くの試行錯誤やチューニングを行なっています。

いろいろと知見も溜まり新しい機能やシステムのリプレイスを考えたり、やりたいことはまだまだあるので興味を持たれたエンジニアの方は是非話を聞きにいらしてみてください。

corp.toreta.in

© Toreta, Inc.

Powered by Hatena Blog