Машинното обучение е забавно Част 6: Как да правим разпознаване на реч с дълбоко обучение

Актуализация: Тази статия е част от поредица. Вижте пълната серия: Част 1, Част 2, Част 3, Част 4, Част 5, Част 6, Част 7 и Част 8! Можете също да прочетете тази статия на 普通话, 한국어, Tiếng Việt или на Русский.

Гигантска актуализация: Написах нова книга въз основа на тези статии! Той не само разширява и актуализира всички мои статии, но има тонове чисто ново съдържание и много практически проекти за кодиране. Вижте го сега!

Разпознаването на речта нахлува в живота ни. Той е вграден в нашите телефони, нашите конзоли за игри и нашите интелигентни часовници. Дори автоматизира нашите домове. Само за $ 50 можете да получите Amazon Echo Dot - вълшебна кутия, която ви позволява да поръчате пица, да получите метеорологичен отчет или дори да купите торби за боклук - само като говорите на глас:

Алекса, поръчай голяма пица!

Точката Echo беше толкова популярна през този празничен сезон, че Amazon не може да ги държи на склад!

Но разпознаването на речта съществува от десетилетия, така че защо току-що сега удря мейнстрийма? Причината е, че най-накрая дълбокото обучение направи разпознаването на речта достатъчно точно, за да бъде полезно извън внимателно контролирани среди.

Andrew Ng отдавна е предвидил, че когато разпознаването на речта преминава от 95% точно до 99% точно, това ще се превърне в основен начин, по който взаимодействаме с компютрите. Идеята е, че тази разлика в точността от 4% е разликата между досадно ненадеждни и невероятно полезни. Благодарение на Deep Learning най-накрая постигаме този връх.

Нека научим как да разпознаваме реч с дълбоко учене!

Машинното обучение не винаги е черна кутия

Ако знаете как работи преводът на невронни машини, може да се досетите, че можем просто да подадем звукозаписи в невронна мрежа и да я обучим да произвежда текст:

Това е светият граал на разпознаването на реч с дълбоко учене, но все още не сме съвсем (поне по времето, когато написах това - обзалагам се, че ще бъдем след няколко години).

Големият проблем е, че речта варира в бързината. Един човек може да каже „здравей!” Много бързо, а друг човек може да каже „heeeelllllllllllllooooo!” Много бавно, създавайки много по-дълъг звуков файл с много повече данни. И двата звукови файла трябва да бъдат разпознати като абсолютно един и същ текст - „здравей!“ Автоматичното подравняване на аудио файлове с различна дължина към фикс с фиксирана дължина се оказва доста трудно.

За да заобиколим това, трябва да използваме някои специални трикове и допълнителна обработка в допълнение към дълбока невронна мрежа. Нека да видим как работи!

Превръщането на звуци в битове

Първата стъпка в разпознаването на реч е очевидна - трябва да подаваме звукови вълни в компютър.

В част 3 научихме как да правим изображение и да го третираме като масив от числа, така че да можем да подадем директно в невронна мрежа за разпознаване на изображение:

Изображенията са просто масиви от числа, които кодират интензитета на всеки пиксел

Но звукът се предава като вълни. Как да превърнем звуковите вълни в числа? Нека използваме този звуков клип на мен с думите „Здравей“:

Форма на вълната ми казва „Здравей“

Звуковите вълни са едномерни. Във всеки момент във времето те имат една единствена стойност въз основа на височината на вълната. Нека да увеличите една малка част от звуковата вълна и да разгледаме:

За да превърнем тази звукова вълна в числа, просто записваме височината на вълната в еднакво разположени точки:

Вземане на проби от звукова вълна

Това се нарича вземане на проби. Правим четене хиляди пъти в секунда и записваме число, представляващо височината на звуковата вълна в този момент от време. Това е по принцип всички некомпресирани аудио файлове .wav.

Аудиото на „CD Quality“ се взема проба при 44.1hz (44,100 четения в секунда). Но за разпознаване на речта е достатъчна честота на вземане на проби от 16khz (16 000 проби в секунда), за да покрие честотния обхват на човешката реч.

Позволява да изпробваме нашата "Здравей" звукова вълна 16 000 пъти в секунда. Ето първите 100 проби:

Всяко число представлява амплитудата на звуковата вълна на интервали 1/16000 от секунда

Бърза странична лента за цифрово вземане на проби

Може би си мислите, че извадката създава само грубо сближаване на оригиналната звукова вълна, тъй като само от време на време се чете. Между четенията ни има пропуски, така че трябва да губим данни, нали?

Могат ли цифровите проби да пресъздадат перфектно аналоговата звукова вълна? Ами тези пропуски?

Но благодарение на теоремата на Nyquist, ние знаем, че можем да използваме математика за перфектно реконструиране на оригиналната звукова вълна от раздалечените проби - стига да изваждаме проба поне два пъти по-бърза от най-високата честота, която искаме да запишем.

Споменавам това само защото почти всички грешат това и предполагат, че използването на по-висока честота на дискретизация винаги води до по-добро качество на звука. Не става

Предварителна обработка на нашите образци на звукови данни

Сега имаме масив от числа с всяко число, представляващо амплитудата на звуковата вълна на интервали от 1/16 000-та от секундата.

Бихме могли да пренесем тези номера направо в невронна мрежа. Но опитът да се разпознаят речевите модели чрез директна обработка на тези проби е трудно. Вместо това можем да улесним проблема, като направим някаква предварителна обработка на аудио данните.

Да започнем с групирането на нашия изваден аудио в парчета с дължина 20 милисекунди. Ето първите ни 20 милисекунди аудио (т.е. първите ни 320 проби):

Начертаването на тези числа като обикновена графика ни дава приблизително приближение на оригиналната звукова вълна за този период от 20 милисекунди:

Този запис е дълъг само 1/50 от секундата. Но дори и този кратък запис е сложен миш-каш с различни честоти на звука. Има някакви ниски звуци, някои звуци от средния диапазон и дори някои високопроницаеми звуци. Но взети всички заедно, тези различни честоти се смесват заедно, за да съставят сложния звук на човешката реч.

За да улесним обработката на тези данни за невронната мрежа, ние ще разделим тази сложна звукова вълна на съставните й части. Ще разделим ниските части, следващите най-ниски части и т.н. След това като добавим колко енергия е във всяка от тези честотни ленти (от ниска до висока), създаваме сортове пръстов отпечатък за този аудио фрагмент.

Представете си, че сте имали запис на някой, който свири акорд на C Major на пиано. Този звук е комбинация от три музикални нотки - C, E и G - всички смесени в един сложен звук. Искаме да разделим този сложен звук в отделните ноти, за да открием, че са C, E и G. Това е същата идея.

Правим това с помощта на математическа операция, наречена преобразуване на Фурие. Той разделя сложната звукова вълна на простите звукови вълни, които я съставят. След като имаме тези отделни звукови вълни, ние добавяме колко енергия се съдържа във всяка една.

Крайният резултат е резултат от това колко важен е всеки честотен диапазон, от ниска височина (т.е. басови нотки) до висока височина. Всяко число по-долу представлява колко енергия беше във всеки 50hz диапазон на нашия 20 милисекунд аудио клип:

Всяко число в списъка представлява колко енергия е била в тази честотна лента 50hz

Но това е много по-лесно да се види, когато нарисувате това като диаграма:

Можете да видите, че 20-милисекундният ни звуков фрагмент има много нискочестотна енергия и не много енергия във по-високите честоти. Това е типично за

Ако повтаряме този процес на всеки 20 милисекундни части звук, завършваме със спектрограма (всяка колона отляво надясно е една част от 20 мс):

Пълната спектрограма на звуковия клип на

Спектрограма е готина, защото всъщност можете да видите музикални ноти и други модели на височината в аудио данни. Невронната мрежа може да намери модели в този вид данни по-лесно от суровите звукови вълни. Това е представяне на данни, което всъщност ще подадем в нашата невронна мрежа.

Разпознаване на герои от къси звуци

Сега, когато имаме нашето аудио във формат, лесен за обработка, ще го прехвърлим в дълбока невронна мрежа. Входът към невронната мрежа ще бъде 20 милисекундни аудио парчета. За всеки малък звуков отрязък той ще се опита да разбере буквата, която съответства на звука, който в момента се говори.

Ще използваме повтаряща се невронна мрежа - тоест невронна мрежа, която има памет, която влияе на бъдещите прогнози. Това е така, защото всяка буква, която прогнозира, би трябвало да повлияе на вероятността за следващата буква, която също ще предвиди. Например, ако досега сме казвали „HEL“, много вероятно е да кажем „LO“ следващото, за да завършим думата „Здравей“. Много по-малко вероятно е след това да кажем нещо непроизнасяемо като „XYZ“. Така че наличието на този спомен от предишни прогнози помага на невронната мрежа да прави по-точни прогнози за напред.

След като пуснем целия си аудиоклип през невронната мрежа (по един къс), ще завършим с картографиране на всеки аудиоклип към буквите, най-вероятно изговорени по време на този фрагмент. Ето как изглежда това картографиране за мен, казвайки „Здравей“:

Нашата невронна мрежа предсказва, че едно вероятно нещо, което казах, е „HHHEE_LL_LLLOOO“. Но също така смята, че е възможно да кажа „HHHUU_LL_LLLOOO“ или дори „AAAUU_LL_LLLOOO“.

Имаме няколко стъпки, които следваме, за да изчистим този изход. Първо, ще заменим всички повторени знаци с един символ:

  • HHHEE_LL_LLLOOO става HE_L_LO
  • HHHUU_LL_LLLOOO става HU_L_LO
  • AAAUU_LL_LLLOOO става AU_L_LO

Тогава ще премахнем всички празни места:

  • HE_L_LO става HELLO
  • HU_L_LO става HULLO
  • AU_L_LO става AULLO

Това ни оставя с три възможни транскрипции - „Здравей“, „Хуло“ и „Ауло“. Ако ги кажете на глас, всички тези звуци са подобни на „Здравей“. Тъй като предсказва по един знак в даден момент, невронната мрежа ще излезе с тези много озвучени транскрипции. Например, ако кажете „Той не би отишъл“, това може да даде една възможна транскрипция като „Той няма да отиде“.

Номерът е да комбинирате тези прогнози, базирани на произношението, с вероятностни резултати, базирани на голяма база данни с писмен текст (книги, новинарски статии и т.н.) Изхвърляте транскрипции, които изглеждат най-малко вероятни за истински, и запазвате транскрипцията, която изглежда най-реалистична.

От възможните ни транскрипции „Здравей“, „Хуло“ и „Ауло“, очевидно „Здравей“ ще се появява по-често в база данни с текст (да не говорим в оригиналните ни аудио базирани данни за обучение) и по този начин вероятно е правилен. Така че ние ще изберем „Здравей“ като последна транскрипция вместо другите. Свършен!

Чакай малко!

Може би си мислите „Но какво ще стане, ако някой каже„ Здравей “? Това е валидна дума. Може би „Здравей“ е грешната транскрипция! “

Разбира се, че е възможно някой да е казал „Здравей“ вместо „Здравей“. Но система за разпознаване на реч като тази (обучена на американски английски) по принцип никога няма да произведе "Hullo" като транскрипция. Това е малко невероятно нещо, което потребителят може да каже в сравнение с „Здравей“, че винаги ще мисли, че казвате „Здравей“, независимо колко подчертавате звука „U“.

Опитай го! Ако телефонът ви е настроен на американски английски, опитайте се да накарате дигиталния си асистент на телефона да разпознае света „Здравей“. Той отказва! Винаги ще го разбира като "Здравей."

Непознаването на „Hullo“ е разумно поведение, но понякога ще намерите досадни случаи, в които телефонът ви просто отказва да разбере нещо валидно, което казвате. Ето защо тези модели за разпознаване на реч винаги се преквалифицират с повече данни, за да коригират тези крайни случаи.

Мога ли да изградя собствена система за разпознаване на реч?

Едно от най-готините неща за машинното обучение е колко просто понякога изглежда. Получавате куп данни, подавате ги в алгоритъм за машинно обучение и след това по магически начин имате AI система от световна класа, работеща на видеокартата на вашия геймърски лаптоп ... нали?

Това е вярно в някои случаи, но не и за речта. Разпознаването на реч е тежък проблем. Трябва да преодолеете почти безграничните предизвикателства: микрофони с лошо качество, фонов шум, реверберация и ехо, вариации на ударенията и вкл. Всички тези проблеми трябва да присъстват в данните ви за обучение, за да сте сигурни, че невронната мрежа може да се справи с тях.

Ето още един пример: Знаете ли, че когато говорите в силна стая, несъзнателно повишавате височината на гласа си, за да можете да говорите над шума? Хората нямат проблем по никакъв начин да ви разберат, но невронните мрежи трябва да бъдат обучени да се справят с този специален случай. Така че имате нужда от данни за обучение с хора, които крещят от шум!

За да изградите система за разпознаване на глас, която работи на ниво Siri, Google Now! Или Alexa, ще ви трябва много данни за обучение - далеч повече данни, отколкото може да получите, без да наемате стотици хора, които да я запишат за вас. И тъй като потребителите имат ниска толерантност към лошокачествените системи за разпознаване на глас, не можете да оскъпявате това. Никой не иска система за разпознаване на глас, която работи 80% от времето.

За компания като Google или Amazon стотици хиляди часове говоримо аудио, записано в реални ситуации, е злато. Това е най-голямото нещо, което отделя системата им за разпознаване на реч от световна класа от вашата хоби система. Целият смисъл на пускането на Google Now! и Siri на всеки мобилен телефон безплатно или продаване на $ 50 единици Alexa, които нямат абонаментна такса, е да ви накара да ги използвате максимално. Всяко нещо, което кажете в една от тези системи, се записва завинаги и се използва като тренировъчни данни за бъдещи версии на алгоритмите за разпознаване на реч. Това е цялата игра!

Не ми вярваш? Ако имате Android телефон с Google Now!, Кликнете тук, за да слушате действителни записи на себе си, казвайки всяко тъпо нещо, което някога сте казвали в него:

Можете да получите достъп до същото нещо за Amazon чрез приложението си Alexa. Apple за съжаление не ви позволява да имате достъп до гласовите си данни Siri.

Така че, ако търсите стартираща идея, не бих препоръчал да се опитвате да изградите собствена система за разпознаване на реч, за да се конкурирате с Google. Вместо това измислете начин да накарате хората да ви дадат записи на разговори с часове. Данните могат да бъдат вашият продукт вместо това.

Къде да научите повече

  • Описаният тук алгоритъм (грубо) за справяне с аудио с променлива дължина се нарича Connectionist Temporal Classification или CTC. Можете да прочетете оригиналната хартия от 2006 г.
  • Адам Коутс от Baidu изнесе страхотна презентация за задълбочено обучение за разпознаване на реч в училището за дълбоко обучение на Bay Area. Можете да гледате видеоклипа в YouTube (разговорът му започва в 3:51:00). Силно препоръчително.

Ако тази статия ви е харесала, моля, помислете дали регистрацията за моето машинно обучение е забавна! списък с имейли Ще ви изпратя имейл само когато имам нещо ново и страхотно да споделя. Това е най-добрият начин да разберете, когато пиша повече статии като тази.

Можете също да ме последвате в Twitter на @ageitgey, изпратете ми имейл директно или да ме намерите на linkedin. Ще се радвам да чуя от вас, ако мога да помогна на вас или на вашия екип с машинно обучение.

Сега продължете към машинното обучение е забавно! Част 7!