私は10年間iPhoneを使っていて、とても気に入っています。一部の人と違って、私はSiriを本当に楽しんでいて、頻繁に使っています。しかし、10年経っても、Siriは私のテキストを書き起こすときに、妻の名前はアーロンではなくエリンだと認識する必要があることを理解していません。リソースを大量に消費する音声テキスト変換の実装は許しますが、その間違いを一度訂正して修正したテキストを送信した後、その訂正は携帯電話の訂正履歴に保存されるべきでした。これは、他の手がかりとともに、後処理トランスフォーマーモデルによって使用される小さなファイルであり、この間違いの可能性を大幅に減らします。iPhoneの音声テキスト変換機能をSiriと呼ぶのは単純化しすぎだとわかっていますが、それが私の子供たちが「iPhoneのAI」と考えるものです。
音声テキスト変換システムは、同音異義語(発音は同じだが綴りや意味が異なる単語)の処理に苦労することがよくあります。こうしたエラーは、特に人名やよく使われる用語に影響する場合、イライラさせられることがあります。この問題を解決する鍵は、音声認識エンジンのオーバーホールではなく、時間の経過とともにユーザーの修正に適応する軽量のポストトランスクリプション テキスト処理レイヤーにあります。これに対処するために私が設計した PyTorch ベースのコードがこちらです。
これは非常にコンパクトで、モバイル用にコンパイルした後、携帯電話に簡単に展開できます。Siri の背後には非常に複雑な連鎖モデルのセットがあることはわかっています。そのため、このコードは、それらのモデルへの入力として新しい機能、つまり特定の同音異義語が発生したときに転写をパーソナライズするのに役立つスコアを提供するためだけに使用できます。ただし、これを後処理レイヤーとして使用する方が簡単です。
これは、新しい電話のリリースが展開されるまで待つ必要はありません。Apple が iPhone 向けにリリースする次のアップデートで、私の生活がより良くなるでしょう。
システムは、これら 3 つの要素に基づいて各同音異義語候補の尤度スコアを計算し、最も可能性の高い修正を選択します。以下は、説明付きのセクションに分割された Python 実装です。
最初のステップは、同音異義語のデータベースを作成または読み込むことです。これらは、転写中に混同される可能性が高い単語のペア (またはグループ) です。
# Homophones database homophones_db = { "Aaron": ["Erin"], "bare": ["bear"], "phase": ["faze"], "affect": ["effect"], }
これは、キーが誤って転記された単語で、値が同音異義語のリストである単純な辞書です。たとえば、「phase」は「faze」と混同される可能性があります。後で、あいまいな単語に遭遇したときに、このデータベースが照会されます。
このコードは、辞書内のユーザーの修正を追跡します。各キーは (original_word、corrected_word) のタプルで、値はユーザーがそのエラーを修正した回数です。
# Correction history tracker correction_history = { ("phase", "Faye's"): 3, ("bear", "bare"): 2, }
ユーザーが「phase」を「Faye's」に 3 回修正すると、システムは今後の転写でこの修正を優先します。
同音異義語の選択に影響を与えるもう 1 つの要因は、特定の単語が使用される頻度です。これは、個人名やユーザーが頻繁に入力する用語である可能性があります。
# Frequent contact tracker frequent_contacts = { "faye": 15, "phase": 5, "erin": 10, "aaron": 2, }
システムは、同音異義語を区別する際に、頻繁に使用される単語に重点を置きます。たとえば、「faye」が 15 回出現し、「phase」が 5 回しか出現しない場合は、「faye」が優先されます。
選択をさらに絞り込むために、周囲の文から文脈の手がかりが抽出されます。たとえば、文に代名詞「彼女」が含まれている場合、システムは「アーロン」よりも「エリン」を優先する可能性があります。from transformers import pipeline
from transformers import pipeline # Load an NLP model for context analysis context_analyzer = pipeline("fill-mask", model="bert-base-uncased") def detect_context(sentence): """Detect context-specific clues in the sentence.""" pronouns = ["he", "she", "his", "her", "their"] tokens = sentence.lower().split() return [word for word in tokens if word in pronouns]
この機能は、文をスキャンして、性別を特定する代名詞や、単語の意図する意味を示す可能性のあるその他の手がかりを探します。
各同音異義語候補には、次の基準に基づいて尤度スコアが割り当てられます。
def calculate_likelihood(word, candidate, sentence): """Calculate a likelihood score for a homophone candidate.""" correction_score = correction_history.get((word, candidate), 0) * 3 frequency_score = frequent_contacts.get(candidate, 0) * 2 context = detect_context(sentence) context_clues = homophones_db.get(candidate, []) context_score = sum(1 for clue in context if clue in context_clues) return correction_score + frequency_score + context_score
このスコアは、3 つの要素を組み合わせて、最も可能性の高い同音異義語を決定します。
尤度スコアが計算され、システムはスコアが最も高い同音異義語を選択します。
def prioritize_homophones(word, candidates, sentence): """Prioritize homophones based on their likelihood scores.""" likelihoods = { candidate: calculate_likelihood(word, candidate, sentence) for candidate in candidates } return max(likelihoods, key=likelihoods.get) def disambiguate_homophone(word, sentence): """Disambiguate homophones using likelihood scores.""" candidates = homophones_db.get(word, []) if not candidates: return word return prioritize_homophones(word, candidates, sentence)
このプロセスにより、履歴、頻度、コンテキストに基づいて最も適切な単語が選択されます。
システムは各単語に曖昧さ解消ロジックを適用して、文全体を処理します。
def process_transcription(transcription): """Process the transcription to correct homophones.""" words = transcription.split() corrected_words = [disambiguate_homophone(word, transcription) for word in words] return " ".join(corrected_words)
# Example transcription and correction raw_transcription = "This is phase one plan." corrected_transcription = process_transcription(raw_transcription) print("Original Transcription:", raw_transcription) print("Corrected Transcription:", corrected_transcription) # Simulate user feedback update_correction_history("phase", "faye") print("Updated Correction History:", correction_history) print("Updated Frequent Contacts:", frequent_contacts)
ユーザーが間違いを修正すると、修正履歴と頻繁な連絡が更新され、将来の予測が改善されます。
def update_correction_history(original, corrected): """Update correction history and frequent contacts.""" correction_history[(original, corrected)] = correction_history.get((original, corrected), 0) + 1 frequent_contacts[corrected] = frequent_contacts.get(corrected, 0) + 1 frequent_contacts[original] = max(0, frequent_contacts.get(original, 0) - 1)
Original Transcription: This is phase one plan. Corrected Transcription: This is Faye's one plan. Updated Correction History: {('phase', 'Faye's'): 4} Updated Frequent Contacts: {'Faye's': 16, 'phase': 4}
この軽量なテキスト処理レイヤーは、ユーザーの修正から学習し、頻繁な使用を活用し、コンテキストを分析することで、音声テキスト変換アプリケーションの精度を高めます。モバイル デバイスで実行できるほどコンパクトで、個々のユーザーのニーズに適応できるため、従来の静的モデルに代わるよりスマートな選択肢となります。最小限の労力で、Apple や他の企業はこの機能を統合して、Siri などの仮想アシスタントの応答性を高め、パーソナライズすることができます。