二人が音声で討論し、発言を話者ごとに文字起こしして採点する、というサービスを作っています。誰がどちらの発言をしたかを間違えると、採点そのものが無意味になります。
最初は素直に、合成された一本の音声に対して話者分離をかけていました。これは討論では壊れます。討論はかぶるからです。そして、いちばんかぶるのは、いちばん採点したい場面です。
やったこと
話者分離をやめました。各クライアントが、自分のマイクの音声だけを自分で送ります。
ブラウザA --- 自分のマイク ---> 文字起こし(発話者 = A、確定)
ブラウザB --- 自分のマイク ---> 文字起こし(発話者 = B、確定)
話者帰属が推定ではなく、経路になります。二人が同時に喋っても入れ替わりようがありません。相手の声が自分のマイクに回り込んだ場合も、こちらの音声にわずかに混じるだけで、片方の発話が丸ごと相手のものになることはありません。
聞くための経路と、書くための経路を分ける
紛らわしいのは、音声が二系統流れることです。
・聞くため : 通話の音声。SFU(mediasoup)を経由して相手に届きます
・書くため : 文字起こし用のチャンク。各自が自分のぶんだけアップロードします
同じマイクから出ていますが、用途も経路も別です。通話は遅延が命なので途中で加工しません。文字起こしは正確さが命なので、少し待ってでもまとめて処理します。一本にまとめようとすると、どちらかが必ず割を食います。
精度はモデルサイズではなく文脈で上がりました
チャンク単位で文字起こしすると、チャンクの境界で文が切れます。境界をまたぐ文脈を渡していなかったころ、単語誤り率は 41.6% ありました。前のチャンクの末尾を次のチャンクのプロンプトに渡すようにしたところ、10.4% になりました。
モデルは変えていません。実運用の書き起こしが荒れているとき、まずモデルサイズを疑いたくなりますが、境界の扱いを先に見たほうがよいことがあります。
音声は残しません
文字起こしが済んだチャンクは、その場で削除しています。残るのは書き起こしだけです。討論の記録は文字で残すべきもので、人の声を貯めておく理由はどこにもありません。
作っているサービスは Policon といいます。政治的に考えが正反対の相手と討論できます。
policon.net/ja/