Имам iPhone от десет години и го харесвам. За разлика от някои хора, аз наистина се радвам на Siri и я използвам често. Но след десет години Siri не е разбрала, че когато преписва моите текстове, трябва да знае, че името на жена ми не е Аарон, а Ерин. Прощавам внедряването на говор към текст, което изисква много ресурси, но след като коригирах тази грешка веднъж и изпратих коригиран текст, тази корекция трябваше да бъде съхранена в хронологията на корекциите на моя телефон - малък файл, използван от публикация -обработващ модел на трансформатор, заедно с други улики, за да направите тази грешка много по-малко вероятно. Знам, че наричането на функцията за преобразуване на говор в текст на iPhone Siri е прекалено опростено, но децата ми така мислят за „AI в моя iPhone“.
Системите за преобразуване на говор в текст често се борят с омофони - думи, които звучат еднакво, но имат различен правопис и значения. Тези грешки могат да бъдат разочароващи, особено когато засягат лични имена или често използвани термини. Ключът към коригирането на този проблем не се крие в основното преразглеждане на механизма за разпознаване на реч, а в олекотен слой за обработка на текст след транскрипция, който се адаптира към потребителските корекции с течение на времето. Ето кода, базиран на PyTorch, който проектирах, за да се справя с това.
Той е супер компактен и лесен за инсталиране на телефон след компилиране за мобилно устройство. Знам, че зад Siri стои много сложен набор от верижни модели, така че този код може да се използва само за предоставяне на нова функция като вход към тези модели, резултат, който помага за персонализиране на транскрипцията, когато възникнат определени хомофони. Но би било по-лесно да използвате това като слой за последваща обработка.
Това не трябва да чака за внедряване на нова версия на телефона. Това би направило живота ми по-добър в следващата актуализация, която Apple пуска за моя iPhone.
Системата изчислява оценка на вероятността за всеки хомофонен кандидат въз основа на тези три фактора и избира най-вероятната корекция. По-долу е изпълнението на Python, разделено на секции с обяснения.
Първата стъпка е създаване или зареждане на база данни с омофони. Това са двойки думи (или групи), които е вероятно да бъдат объркани по време на транскрипция.
# Homophones database homophones_db = { "Aaron": ["Erin"], "bare": ["bear"], "phase": ["faze"], "affect": ["effect"], }
Това е прост речник, където ключът е неправилно транскрибираната дума, а стойността е списък с хомофонни алтернативи. Например „phase“ може да се обърка с „faze“. По-късно тази база данни ще бъде запитвана, когато се срещне двусмислена дума.
Кодът проследява потребителските корекции в речник, където всеки ключ е кортеж от (оригинална_дума, коригирана_дума), а стойността е броят пъти, когато потребителят е коригирал тази грешка.
# Correction history tracker correction_history = { ("phase", "Faye's"): 3, ("bear", "bare"): 2, }
Ако потребителят коригира "phase" на "Faye's" три пъти, системата приоритизира тази корекция за бъдещи транскрипции.
Друг фактор, влияещ върху избора на хомофон е колко често се използва определена дума. Това може да са лични имена или термини, които потребителят често въвежда.
# Frequent contact tracker frequent_contacts = { "faye": 15, "phase": 5, "erin": 10, "aaron": 2, }
Системата придава по-голяма тежест на често използваните думи при разграничаване на омофони. Например, ако "faye" се появи 15 пъти, но "phase" се появи само 5 пъти, "faye" ще бъде предпочитано.
Контекстните улики се извличат от заобикалящото изречение, за да се прецизира допълнително селекцията. Например, ако изречението съдържа местоимението „тя“, системата може да предпочете „Ерин“ пред „Аарон“. от тръбопровод за внос на трансформатори
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
Този резултат съчетава трите фактора, за да определи най-вероятния хомофон.
С изчислените оценки на вероятността системата избира хомофона с най-висок резултат.
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 по-отзивчиви и персонализирани.