🙄

電話音声の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