опис проблеми
Я хочу використовувати розпізнавання голосу як частину апаратного проекту, який я б хотів повністю містити (я використовую невеликі пристрої низької потужності, низькошвидкісні пристрої, такі як Arduino та Raspberry Pi, Kinects тощо), не працюючи на традиційному комп'ютері з задіяна ОС. Отже, закритий / самодостатній проект).
Розпізнавання голосу може бути дуже складним, залежно від бажаного рівня витонченості. У мене є те, що я вважаю порівняно простим набором вимог. Я хочу лише розпізнати власний голос, і у мене є невеликий словник з 20 або більше слів, які я хотів би розпізнати. Таким чином, мені не потрібні складні бібліотеки розпізнавання мовлення до тексту та голосу або будь-яке чудове програмне забезпечення сторонніх виробників, яке я знаходжу за допомогою інтернет-пошукових систем (їх не вистачає!). Я вважаю, що мої вимоги "досить прості" (в межах розуму), що я можу кодувати власне рішення. Мені цікаво, чи хтось написав свій власний процес таким чином, і чи є мій метод масовим недоліком? Чи є кращий спосіб це зробити, не вимагаючи високого рівня математики або не потрібно писати складний алгоритм? Це рішення, яке я намагався придумати нижче.
Опис рішення
Я буду писати це на С, але хочу обговорити мовний агностичний процес, зосередившись на самому процесі. Тож давайте ігнорувати це, якщо можемо.
1. Я заздалегідь запишу свій словник слів, щоб відповідати вимовам. Ми можемо уявити, що у мене є 20 записів моїх 20 різних слів, або, можливо, коротких фраз або речень з двох-трьох слів. Я вважаю, що це полегшує процес порівняння двох записуючих файлів, ніж насправді перетворення звуку в текст та порівняння двох рядків.
2. Мікрофон підключений до мого апаратного пристрою, на якому працює мій код. [1]. Код безперервно бере зразки фіксованої довжини, наприклад, довжиною 10 мсек, і зберігає 10 послідовних зразків, наприклад, у стилі кругової реєстрації. [2]. (Я вигадую ці фігури вгорі голови, тому вони є лише прикладами для опису процесу).
[1] Це, швидше за все, буде підключено через смуговий фільтр та підсилювач, як і в словникових записах, щоб зменшити збережені та зібрані звукові зразки меншими.
[2] Я не впевнений, як саме я буду брати вибірку, мені потрібно розробити метод, хоча я створюю числову цифру (ціле число / float / double), яка представляє звук 10msec вибірки (можливо, значення CRC або сума MD5 і т. д. зразка аудіо), або потік фігур (можливо, потік аудіо читання частот). Зрештою "зразок" буде числовою фігурою або цифрами. Ця частина буде набагато більше апаратного забезпечення, тому не дуже для обговорення тут.
3. Код розглядає, що в ньому зберігаються 10 послідовних зразків і шукає збільшення обсягу, щоб вказати на те, що слово чи фразу вимовляється (перерва від тиші), а потім збільшується послідовний збір вибірки, щоб сказати, наприклад, 500 зразків. Це означає, що він фіксує 5 секунд аудіо в 10 мсек зразків.
Саме ці зразки або "фрагменти" порівнюються між збереженим звуком і захопленим звуком. Якщо достатньо високий відсоток захоплених зразків збігається з еквівалентними збереженими, код передбачає його те саме слово.
The start of a store recording of the world "hello" for example,
stored words are split into 10 msec samples also
Stored Sample No | 1| 2| 3| 4| 5| 6| 7| 8|
Stored Sample Value |27|38|41|16|59|77|200|78|
Incoming audio (me saying "hello") with some "blank" samples
at the start to symbolise silence
Incoming Sample No | 1| 2| 3| 4| 5| 6| 7| 8| 9|10| 11|12|
Incoming Sample Value | | | |20|27|38|46|16|59|77|200|78|
4. Після того, як код зібрав повний зразок потоку, він на початку починає відсікати зразки заготовок, щоб створити наступну аудіозапис. Він також може перемістити набір зразків назад і вперед на кілька місць, щоб краще вирівняти збережений зразок.
Це створює зразок набору, як показано нижче:
Stored Sample No | 1| 2| 3| 4| 5| 6| 7| 8|
Stored Sample Value |27|38|41|16|59|77|200|78|
Incoming Sample No |-1| 1| 2| 3| 4| 5| 6| 7| 8|
Incoming Sample Value |20|27|38|46|16|59|81|201|78|
5. Я вважаю, що маючи відсоткове значення, наскільки повинен бути близький кожен зразок, тому вибірка 7 відрізняється на значення 1, яке менше, ніж% 1, і відсоткове значення для загальної кількості зразків, яке повинно бути в межах відповідного їм відсотка вибірки , код має легко відрегульований рівень точності.
Я ніколи раніше нічого подібного не робив зі звуком, це може бути багато роботи. Ось чому я задаю це запитання, якщо ви, можливо, вже знаєте, що відповідь на це питання буде очевидною (яка може бути ця відповідь). Я сподіваюся, що це не буде обчислювально великими завданнями, оскільки частина апаратного забезпечення, яке я буду використовувати, матиме невеликий вміст сек. У сотнях мегагерців (можливо, 1 ГГц, використовуючи перенастрочений Rasp Pi). Таким чином, це досить непростий спосіб зіставити звукові зразки, використовуючи меншу обчислювальну потужність. Я не прагну до миттєвих результатів, але менше ніж 30 секунд на гідне підтвердження концепції.
PS У мене немає представника, щоб позначити це новим тегом, таким як "аудіо", "розпізнавання звуку", "голос", "розпізнавання голосу" тощо.