ボイスメールを決定する方法と理由







「サブスクライバーはサブスクライバーではありません-ビープ音の後にメッセージを残してください!」-この自動応答を何度も聞いており、すでに「ボイスメール」をチェックする人はいないことを知って電話を切ることに慣れています。 インタビューを受けたすべての知人と同様に、Googleがなければ確認することさえできません。 なぜオペレーターはこの奇妙なものを必要としますか? そして、それ以外の場合は無料になる通話のためにお金を取る。 そして、通常の加入者からだけでなく、通話に自動化を使用する企業からも。 注文を30分でコールセンターではなく、10秒でロボットで確認する店舗を想像してください。 そして、これらの通話の一部はボイスメールに送られ、会社のお金を使い、統計を破ります。 Under the cut-初期のメディア、ビッグデータ、機械学習、TensorFlowについての探偵小説。



どんな「無料通話」?



テレフォニーはすでにかなり古い分野であり、20年前の多くの「歴史的に形成された」ものと技術的ソリューションがあります。 たとえば、収益化:オペレーター「A」は、オペレーター「B」が担当する電話番号へのコールに対してオペレーター「B」に支払います。 「すべての受信トレイは無料です!」はこちらからです。 オペレーターは、加入者に電話をかけてお金を受け取ります。 関税が発生する前に、彼らが入国のために余分に支払ったことを覚えています!









このソリューションには長所と短所があります。 着信コールと発信コールがほぼ等しい場合、「誰も負わない」。 より多くの着信コール-オペレーターはお金を稼ぎます。 より発信-支出。 オペレーターはお金を稼ぎたいので、着信を最大化し、発信を最小化するために最善を尽くしています。 そのようなコスト最小化メカニズムの1つは、初期メディアの配置です。



アーリーメディア-サブスクライバーがサブスクライバーでない場合



加入者「A」が携帯電話を持っている携帯電話から加入者「B」から電話をかけるとどうなりますか? 多くのことが起こりますが、可能な限り簡略化すると、オペレーター「A」はSIPテキストプロトコルを使用してオペレーター「B」にコールリクエストを送信し、タワーを通じてサブスクライバー「B」の検索を開始します(実際、PRI上のSS7で、悲しい)。 加入者「A」がその時に沈黙を持たず、あらゆる種類の「ビープ音を交換」を販売できるように、オペレーターは「アーリーメディア」のステータスに同意しました。オペレーター「B」は加入者を探している間、SIP経由で「アーリーメディア」と返信できます»そして、RTP経由でオーディオの送信を開始します。 ビープ音、音楽、または「申し訳ありませんが、発信者は発信者ではありません。」



オペレーターは、「初期メディア」は着信コールとして課金されず、オペレーター「A」はこの音楽または呼び出し音に対してオペレーター「B」に支払いません。 そしてだれもだまされないように、彼らはまだ「初期メディア」状態で発信者にのみ音を出し、60秒後にそのような通話を遮断することに同意しました。 このような制限の下では、初期のメディアで「無料」の8-800-で何か役立つことをする職人がいますが、これは別の話です。 そして、私たちの話はボイスメールについてです。



お金を取るための「正直な」方法としてのボイスメール









オペレーターが加入者を見つけられなかった場合、彼は着信コールでお金を稼ぐことができませんでした。 通信事業者は、営利団体と同様にお金を稼ぐことを好むため、独創的な「ボイスメール」が発明されました。 「信号の後にメッセージを残す」というフレーズを使用すると、加入者が利用できない場合でも、受信オペレータはコールを「受信」できます。 正直なところ、どこかで20秒間の沈黙を記録し、最も重要なこととして、呼び出し側のオペレーターからこのためのお金を得ることができます。 最もcな人は「piiip」を待たずにすぐに電話を受けます-なぜお金を失うのですか?



男がしないこと-ロボットにとって悲しい不幸



原則として、モバイル加入者がボイスメールにアクセスする方法はありません。 個人的には、それは私には何の違いもありません、ハンドセットは「加入者が一時的に利用できない」または「加入者が一時的に利用できない、信号の後にメッセージを残す」と言います。 私は、他のすべての友人と同様に、「利用不可」という言葉にハングアップします。 そして、そのような通話に対してあるオペレーターが別のオペレーターに同時に支払う金額-私はあまり興味がありません。



私がVoximplantであり、プラットフォームに基づいている場合、注文の自動確認はオンラインストアで行われます。 初期のメディアも無料ですが、ボイスメールの場合、電話がかけられたオペレーターの料金でクライアントのアカウントからお金が支払われます。 量自体は小さいですが、1日あたり数千または数万のコールが掛けられ、それほど小さくはありません。



ただし、自動化は「購入者が小売業者のWebページで購入ボタンをクリックした後に電話をかけ、クリックするか「確認」と言って注文を確認することを勧める」ことに限定されません。 たとえば、コンサートのチケットに関する自動通知があります。 統計によると、加入者は電話をかけ、メッセージを聞いていましたが、実際にはメッセージはボイスメールに「聴取」されていました。 さらに悪いことに、自動化は、たとえば注文したハウスクリーニングの条件について話し合うために顧客に電話をかけます。 彼女はクライアントを合成します。「こんにちは、これはそのような会社のロボットです。注文したクリーニングについて電話をかけ、オペレーターと連絡を取ります」。ボイスメール



ボイスメールを識別する最初の試み



私たちは長い間電話とビデオ通話の自動化に取り組んできたため、数年前にボイスメールを決定する問題が解決し始めました。 すべてのボイスメールの共通点は何ですか? それらはすべて、「信号の後にメッセージを残す」と「初期メディア」から「受け入れられた」へのコールの転送の間にある「ピーアンドアンドアンド」を持っています。 悪いニュースは、「p-and-and-and-and」がすべての人にとって異なることです。 1回のビープ音、同じ周波数で複数回、2回で異なる持続時間と周波数。 さらに、オペレーターはこの「パイアンドアンドアンド」を時々変更したいと考えています。 なぜだろうか?..



最初の実装では、音声ストリーム内の周波数の出現によってボイスメールの音声信号を認識するために、Goertzelのアルゴリズムを使用して「キャリア」周波数とヒューリスティックを計算しました。 残念ながら、この方法は機能しましたが、重大な欠陥がありました。 オペレータが音声信号パターンを変更した場合、ヒューリスティックは「壊れた」ため、新しい「pi-piu-pi-pi-pi」で手動で更新する必要がありました。 誤応答はさらに悪化しました。2つの周波数の「トリッキーな」信号を一度に人間の声と区別することは難しく、生きている人が実際に応答したボイスメールを示しました。 顧客は信頼性を望んでいました。



深層学習 どこでも深層学習



通常の数学で失敗したので、行列を乗算しようとすることにしました。 結局のところ、これは単なる数学ではなく、ディープラーニングと人工知能です! TensorFlowがインストールされ、作業が始まりました:会話とボイスメールの録音は、私たちには見えないパターンを見つけることを期待して、異なるモデルに送られました:特徴的な時間遅延、スムーズなイントネーション、特定の単語セット、これらすべて。









最初の問題はデータに発生しました。「電話」周波数が8キロヘルツの数秒の音声でさえ、数万の値です。 また、ニューラルネットワークをトレーニングするデータが複雑になるほど、適切な結果を得るためにこれらのデータが必要になります。 生データでニューラルネットワークをトレーニングするには、 数百万の呼び出しのタグ付きレコードが必要です。



したがって、データを処理する必要がありました。 C / C ++で記述された特定の通信ライブラリを、音声処理のロジックを実装するPythonに接続しました:ノイズリダクション、エコーキャンセレーション、キャリア割り当てなど。 処理後、レコードはニューラルネットワークが既にトレーニングされた一連のパラメーターに変わりました。



結果はすぐにもっと楽しくなり、次の6か月間、ITの錬金術師を演じました:モデル、入力データを処理するためのオプション、およびモデルを適用した結果を選択し、数秒間の録音の結果としてボイスメールを決定しました。 結果は非常に良好であることがわかりました。「サブスクライバーが一時的に利用できません」というフレーズで会話を始めて、ボイスメールが電話の反対側にある可能性が高いという通知を受け取るのは非常に感情的です。 そして、受け取った情報を使用して次に何をするか、各クライアントはクラウドJavaScriptで自分で決定します。 プログラマーにとって、検出器の使用は次のようになります。



require(Modules.AI); // , AI-
// JS
call.addEventListener(CallEvents.AudioStarted, e => {
AI.detectVoicemail(call)
// "confidence" 0 100 - ,
// VoiceMail
.then(e => Logger.write(`Voicemail detected (${e.confidence}%)`)
// Reject, , voicemail
.catch(e => Logger.write("Voicemail not detected!"));
});
view raw scenario.js hosted with ❤ by GitHub


TL; DR



機械学習は、タスクが「通常の」数学とif-sで形式化するのが難しい場合に役立ちます。 しかし、錬金術師をプレイする準備をしてください:データを準備し、ニューラルネットワークのモデルを選択し、結果を解釈することは、これまでのところ「ベストプラクティス」がほとんどない領域であり、有効なソリューションを見つけるために数年ではなくても数か月を費やすことができます。



タグ付きデータも必要になります。 多くのタグ付きデータ。 多くのタグ付きデータ。 しかし、これは別の投稿のトピックです。










All Articles