電話音声のSTTテキストを安定してembeddingするための前処理アプローチ
概要
この記事では、電話の音声データから作成したテキスト(STTの出力)を、embeddingに使うためにどんな前処理をしているかをまとめています。今のところは、外部のAIサービス(たとえば大規模言語モデルなど)は使わずに、Pythonを使ってルールベースで処理しています。
このテキストには、話し言葉ならではのノイズ(つい言ってしまう言葉や繰り返し、音声認識の変換ミスなど)がいろいろ含まれていて、そのままembeddingすると意味がずれたり、検索の精度が落ちたりしてしまいます。そういった問題にどう対応しているかを整理していきます。
背景と目的
テキストデータをembeddingして過去の問い合わせログと比べる仕組みを使っています。会話の内容をベクトルに変換することで、似たようなケースを探したり、問い合わせを分類するときのサポートにしています。
ただ、そのままSTTの出力を使うと、ノイズ(言い直しとかフィラーとか誤変換とか)が多くて、ベクトル化したときにうまく意味が伝わらなかったり、検索の精度が悪くなったりすることがあります。なので、embeddingの前にある程度ルールを決めてテキストをキレイにする前処理を入れています。
この記事では、その前処理の内容や、現時点での考え方・前提みたいなものをまとめておきます。
STTテキストに含まれる特徴的なノイズ
STTを用いたテキストには、口頭発話ならではの特徴が反映され、それがembedding処理に影響することがあります。主に以下の点が想定されます。
1. 言い直し・繰り返し
意味の同じ文が短い間隔で出力されるケースです。文自体は正しいものの、繰り返しの影響でembeddingベクトルに過度な意味の強調が加わる可能性があります。
例:
- 「注文が届かない。あ、注文がまだ届いてなくて」
このような繰り返しは会話では自然ですが、ベクトル処理上では重複した情報として扱われ、類似度計算において誤差になり得ます。
2. フィラーやどもり
「えっと」「そのー」「うーん」などのつなぎ言葉、どもり、沈黙の認識が含まれます。意味を持たないこれらの語は、文を曖昧にし、トークナイズやembedding結果のノイズ源となりやすくなります。
3. STTの変換ミス
話者の発音やノイズ環境によって、誤認識される単語も一定の頻度で出力されます。こうした単語はembeddingに利用されるトークナイザーで未知語(UNK)扱いとなり、特定の意味ベクトルを持たないことがあります。
embedding処理への影響と基本的な考え方
embeddingでは、文中の各単語の意味ベクトルを合成して文の意味を表現します。
- 同様の意味の文が複数回含まれると、embeddingの総和においてその意味が強調され、検索対象文との類似度比較に偏りが出るリスクがあります。
- フィラーや誤変換のようなノイズが増えるほど、文章全体のベクトル意味が散らかりやすくなり、検索精度に影響します。
- 一方で、誤変換によって生成された未登録語(ex. STTによる意味不明な単語)は、embedding時に無視されやすく、実装によってはそれほど影響が出ないケースも見られました。
こうした事情を踏まえ、重要な対応対象は「意味の偏りをもたらす繰り返し」および「不要な語によるノイズ」であり、未知語については必要以上にフィルタリングしない、といった前処理にしています。
実装している前処理内容
以下のようなルールを設け、Pythonベースで前処理を行っています。
1. 重複表現の圧縮
連続した文の中で、言い回しがほぼ同じものが繰り返されているケースに対処するため、n-gram(簡易な文字列比較)ベースで重複文を検出し、1回だけの出現にまとめる処理を入れています。これは、話し言葉でありがちな繰り返しを削り、embedding時の表現の偏りを抑えるためです。
2. フィラー除去
よく見られるフィラー語(例:「えっと」「その」「うーん」)や感嘆詞を定義リストに基づき除去しています。これはトークナイズ結果が正しくなるのを助けつつ、不要なベクトル要素の混入を避けるものです。
結果とまとめ
これらの前処理ルールを導入することで、以下のような効果が確認できています。
- 元のSTT出力に比べて、ベクトル化後の類似度検索結果がより安定し、問い合わせログなどから「適切な過去の事例」がヒットしやすくなった。
- 特に重複文の圧縮は、同じ意味合いが重複登録されることによるベクトルの偏りを防ぎ、件数の少ないレアケースでも検索精度が落ちにくくなった。
- フィラー除去によって、意味的に不要なノイズが減り、全体として文の意味がよりクリアにembeddingに反映されるようになった。
- 一方で、未知語やSTT特有の変換ミスについては、Pythonのルールベース処理では正確に判別するのが難しく、明示的な除去対象にはしていません。ただし、こうした未知語は多くの場合トークナイザーによって無視されたり、文中に占める割合が小さいこともあり、embedding結果にはそれほど大きな影響は見られていません。
本記事の処理はあくまでPython上で行える簡単な工夫であり、形態素解析や外部AIを使えばもっと精度の高い前処理が可能になりますが、そこまでリソースをかけずに手軽に試したい、または諸事情があって導入しづらいケースでは有効じゃないかと思います。
Discussion