AI Shiftインターン体験記

あいさつ

はじめまして!大阪大学工学研究科修士1年生の宗像北斗と申します!私は9/7〜9/30の間、株式会社サイバーエージェントの子会社で、AI事業本部の株式会社AI ShiftにてのJOBインターン生として働かせていただきました。大学院では機械学習に基づく音響信号処理をテーマに研究しています。

今回のJOBインターンでは深層学習に基づく高精度な留守録判定機能の実装をテーマとして進めさせていただきました。特に今回、コロナ禍の影響でフルオンラインでしたが、社員の方々と十分交流しながら進めることができました!ノイジーな生のデータならではの想定外が発生し、期待していた性能が出るか不安な面もありましたが、AIチームの方々やアノテーションでサポートいただいたAI Shiftの方々のおかげで無事タスクを終えることができました!

背景

今回は提示いただいたテーマのうち、機械学習によるアウトバウンド 時の留守録判定機能の実装というものを選択しました。

はじめに、アウトバウンドについて説明します。現在AI Shiftでは音声自動応対システム「AI Messenger Voicebot」の開発を進めています。Voicebotにはカスタマーからの電話を受けるインバウンド機能の他、Voicebotからカスタマーに電話を掛けるアウトバウンド機能も存在し、各種サービスへの応用が進められています。

アウトバウンドでは、カスタマーが電話に出られず、留守録が応答する可能性があることが問題となります。留守録が応答した場合には電話を速やかに切るなどしないと、時間や通話料金が無駄になってしまいます。 このため、応答した相手が留守録か判定する機能はサービスを運用する上で必須の機能となります。

bot.png (55.0 kB)

今まで用いてきた留守録判定手法としては、留守録が応答した場合にはVoicebot側の発話内容を無視して「ただいま、電話に出ることができません。ピーっという音の後に…」と長く発話し続けるのに対し、人が応答した場合には「もしもし」と短く発話することがほとんどであるという性質を利用したヒューリスティックな方法が用いられています。しかしながら、この手法では誤判定しやすいことが問題となります。

そこで今回、機械学習技術を用いて、より高性能な留守録判定機能の実装することを目指しました。

問題設定

アウトバウンド では下図のように対話が進んでいきます。

通話1.png (109.3 kB)

はじめのVoicebotからの録音開始メッセージの発話後、
図の留守録判定区間に含まれる音声データを用いて判定を行います。
もし応答した相手が留守録だった場合、下図のようにして通話を終了します。

通話2.png (130.9 kB)

今回、判定区間は6秒程度で固定とし、判定性能の改善を狙いました。

ここで注意しなければいけないこととしては、

  • 録音開始メッセージの後から録音がスタートするため、留守録が応答した際、発話内容を最初から効くことができない
  • UXの観点から、留守録を正しく判定できないよりも、人が応答したのに留守録とみなして切ってしまうことの方がよくない

といった点などが挙げられます。つまり

  • 留守録の発話内容を認識させて判定するのは難しい
  • しきい値などにより判定の厳しさを制御できる方が好ましい

といえます。

用いた手法

以上の機能を実装するため、考えられる手段としては

  • 人が応答したデータで学習する外れ値検出手法
  • 人が応答した場合と留守録が応答した場合の両方のデータを用いた教師あり学習による分類手法

などがありますが、今回は後者を選びました
dnn.png (159.7 kB)

つまり、上図のようにモデルを学習させます。このような手法を選択した理由としては、留守録の音声データはある程度パターンが決まっており、音声合成等で再現できそうであること、外れ値検出的手法ではテレビの音などに反応して誤検出を起こしそうであることが挙げられます。

今回の問題設定は話者認識と呼ばれるタスクに近いといえます。話者認識とは、ある音声が誰の音声かを事前に学習したデータを基に予測する問題です。話者認識では深層学習に基づく手法が高い性能を発揮することが知られており、今回は深層学習に基づく手法を留守録判定へと転用することとしました。深層学習に基づく手法ではディープニューラルネットワーク (DNN) によって波形データから複雑な特徴量 (x-vector) を抽出して分類を行います。特に今回はSpeech Brainというツールキットにて公開されている「ECAPA-TDNN」と呼ばれる最新の深層学習モデルを採用しました。

学習データの準備

アノテーション

インターン開始時点では人が出たデータについては十分な量がありましたが、留守録が出たデータは録音しない設定としており、保存されていませんでした。このため、はじめにシステムを留守録も含むすべての音声を録音する設定に切り替えたのち、録音されたデータにアノテーションを行ってデータを確保する必要がありました。

annotation.png (53.2 kB)

特に今回は日数の限られたインターンで、なるべく早くデータを扱いたかったため、AI Shiftの社員の方々にアノテーションを依頼しました。録音が完了した約3日分のデータのアノテーションを依頼したところ、チームの方々の迅速な対応のおかげで半日程度でアノテーションが完了し、500サンプル近い留守録のデータが手に入りました。これは当初の予想よりもかなり多く、その後の実験がかなりスムーズに進められるようになりました!

データ拡張

深層学習に基づく手法では一般に、学習データ量が多いほど高いパフォーマンスを発揮することが知られています。上述のように、留守録のデータが多く手に入って学習データとして使えるようになったものの、高い性能を出すためには手に入ったデータを元に、データセットにそれらしいデータを追加すること(データ拡張)が有効だと考えられます。このため、音声合成ソフトなどを用いて人工的に留守録データを作成しました

留守録の音声部分はOpen JTalkというオープンソースソフトウェアを用いて音声合成を行いました。具体的には「ただいま電話に出ることができません。ピーっと鳴ったら、お名前とご用件をお話しください」とったメッセージを合成しました。さらにこれにpythonの数値計算ライブラリにてピー音に対応する正弦波を作成し結合することで、人工的な留守録データを作成しました。また、留守録のデータには延々と呼び出し音が鳴り続けるようなものや、留守録が発話を終えた状態から録音が開始し、無音が続くようなものもいくつかあり、これらもpythonで再現しました。

実験条件

今回実験で用いた学習、評価データのデータ量はそれぞれ以下の表のようになります。表のそれぞれの要素はサンプル数を表し、これらは全て事前に最大で6.5秒となるようにカットしました。

  • 学習データ
留守録
生データ570343
合成データ\565
合計570908
  • 評価データ
留守録
合計200199

合成データには以下のような3種類を用いました。

  • 留守録:264サンプル
  • 無音:200サンプル
  • 呼び出し音:100サンプル

今回の実験では、深層学習に基づく手法では概ねどのくらいの性能が出るかと、従来手法と比べて有意に性能差があるかを測りたかったため、上述の評価データ(以後評価データ①)に加え、従来手法では留守録が出てるにも関わらず人が出たと誤判定された17サンプルのデータ(以後評価データ②)による2つの評価を行いました。また、データ拡張が有意な効果を示しているかも測るため、合成データを使用しないデータセットでも同様の評価を行いました。

学習時には学習用と検証用にデータセットを4:1の割合になるように分割しました。ただし留守録については生データと合成データで学習用と検証用に偏りがないようにしました。

ネットワーク構造などはオリジナルのECAPA-TDNNをそのまま用いましたが、学習データ量が不均衡であるため、損失関数にはFocal Lossを採用しました。

実験結果および考察

評価データ①についてはデータ拡張の有無を問わず、399サンプルのうち、同じ1つのデータしか誤判定しませんでした。誤判定したデータですが、このデータは人のラベルが与えられているもののカスタマーが発話するような様子はなく、テレビの音が非常にクリアに聞こえるようなものでした。

一方、評価データ②ではデータ拡張を行い学習したモデルが6/17サンプルを正しく留守録と判定でき、データ拡張を行わなかったモデルはすべて人が出た誤った判定をしてしまいました。データ拡張を行い学習したモデルでは誤判定したデータの半数近くに対して人である確率と留守録である確率がかなり近い値を取っており、惜しい状態であったといえます。

今回、評価データ②での判定正解率は特段高かったわけではないですが、データ拡張を行ったモデルでも判定を誤ったデータは以下の2つの傾向がありました。

  • 無音分でもある程度ノイズが発生している
  • 呼び出し音が鳴り続けている

1点目について、白色ノイズではなく、一部の周波数に偏りのあるようなノイズで、学習に用いた留守録のデータにはこのようなノイズが含まれたデータは存在しませんでした。

2点目について、多くの呼び出し音は400Hzで、合成データも全て400Hzで作っていましたが、誤判定した呼び出し音はそれより高い音と、1点目のような白色でないノイズが存在していました。

ここで各評価データに対してモデルの出力層を確認すると、ノイズが極めて小さい無音区間で大きな値を出力するなどの傾向も見られました。このため、モデルはノイズの強度を判定材料に用いている可能性が考えられます。

以上のことから、データ拡張はある程度は効果があるものの、誤判定するようなデータは珍しい特徴を持つもの多く、そうしたデータを取りこぼしなく合成することは難しいため、単純に行うだけでは誤判定を減らすことには貢献しにくいということがわかりました。

しかしながらこの手法では、運用を進めるにつれ集まるデータから再学習を行うことで、分離精度の向上が狙えます。このため、データさえ多く確保することができたら従来手法より大きく精度を上回ることが期待されます。ただしこの際には再度アノテーションが必要となることに注意する必要があります。

タスク以外のインターンでの活動

タスク以外にも本インターン では様々な活動に参加することができました。ここではその一例を紹介します!

  • CA Base Camp
    サイバーエージェント全体での技術カンファレンスで、音声系の非常に実用的な研究発表や、サイバーエージェントのAIやDXへの向き合い方などが聞けて、とても参考になりました。ムービーも最新技術がフルに導入されており、見応えもありました!
  • 共同研究のミーティング参加 自然言語処理や音声信号処理で非常に有名な研究室の方々とのミーティングに参加させていただきました。こちらも企業でしか集められないユニークなデータを用いた研究がされており、ディスカッションにも参加させていただきました!また先生から本タスクについてのアドバイスもいただき、とても有意義でした!
  • 社員の方々とのランチ
    AI ShiftのAIチーム、ビジネスチームの方々に加え、DX推進事業の方々とお話する機会がありました。ロボットの社会応用の現状やビジネス戦略の話は自身の企業での働き方を想像するのに参考になり、今後AIなどのテクノロジーに対してどのようなニーズが生まれるかを考える機会にもなりました!AI Shiftの方々は趣味の幅が広く、雑談でも盛り上がり、充実していました!

インターンを経て

最後に本インターンで得られた経験と感想についてお話しさせていただきます!

学べたこと

まずはじめに、タスクを終えてもっとも勉強になったと感じることは、理想とする機械学習モデルを作成するのに必要なデータがどういったものであるかをはっきりさせることが極めて重要だということをタスクを通じて実感できた点です。これこそが一般のエンジニアとAIエンジニアの違いなのだろうと強く感じました。

今回のインターンではデータの前処理のみならずアノテーション作業の依頼なども行いましたが、比較的簡単なラベル付けで済んだものの、アノテーションを依頼する際には内容をよく吟味することが重要だと感じました。当然アノテーションにはコストがかかる一方、簡単すぎるラベル付けで依頼してしまい、データの持つ本来の力を発揮できないことも十分考えられます。特に収録環境が理想から遠いノイジーなデータはそもそも学習に用いるべきかも検討する必要があり、過不足なく最適なデータを定義することはAIエンジニアの素質が問われる要素に感じました。

感想

感想としてはまず第一に、オンラインにもかかわらずとてもストレスフリーに進めることができたと感じました。その要因としてはサポートしていただいた社員の方々のレスポンスの速さや話しやすさに加え、毎日の朝会で私のタスクの議論の場を設けてくださったことなどが挙げられます。何か質問してもすぐに返信があり、作業が滞ることなく進められました!特にAI Shiftは開発スピードがとても速く、要素技術の多いVoicebotを短期間で実用レベルで開発できたのはこのような連携力の高さが秘訣なのかもしれません。毎日リアルタイムで役立つ機能が実装されていき、とても刺激的でした!

また、AI Shiftやサイバーエージェントをビジネス的な立場からも間近で見ることができた点も非常に有意義に感じました。企業の成長戦略や、ビジネスに役立てるためにどういう視点からAIを考えているかなどが分かり、将来自分自身がどのようなエンジニアになるかのイメージが具体化されたように感じました!

最後に、実質的にタスクに取り組めたのは14日程度と短い期間にもかかわらず、ある程度の成果を出せたのは懇切丁寧に対応していただいたAI Shiftの皆様のおかげに感じます!この度はありがとうございました!

image (1).png (2.4 MB)