Написання власного коду розпізнавання голосу [закрито]


17

опис проблеми

Я хочу використовувати розпізнавання голосу як частину апаратного проекту, який я б хотів повністю містити (я використовую невеликі пристрої низької потужності, низькошвидкісні пристрої, такі як 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 У мене немає представника, щоб позначити це новим тегом, таким як "аудіо", "розпізнавання звуку", "голос", "розпізнавання голосу" тощо.


17
VR є досить проклятим складним, і я сумніваюся, хтось, хто не знає в цій галузі, зможе зробити багато пробігу, не читаючи багато. Перше, що мене вражає щодо вашого алгоритму, - це те, що він не вирішить відмінностей у швидкості вимови слова. Навіть простому ВР знадобилися роки, щоб отримати право.
Горт робот

4
Справді. Ви, якщо не заперечуєте років на розвиток, можете заглянути в бібліотеки, які ви можете скласти до своєї мети. Я впевнений, що вони існують.
Риг

6
Я б запропонував додатковий крок - зробити перетворення фур'є кожного зразка. Це дає вам інтенсивність кожної звукової частоти з часом, а не мати справу із зразками безпосередньо. Буде досить послідовна основна частота для голосних, які ви зазвичай розмовляєте, на яких ви могли б виявити. Вам потрібно подивитися на особливості мови, а не лише на звук. Як говорили інші, це складне завдання.
Пол Андерсон

1
Я б запропонував спробувати пограти з деякими бібліотеками розпізнавання голосу, навіть якщо ви не можете використовувати їх для кінцевого продукту. Вони були б корисні для створення доказів концепції.
св

Відповіді:


3

Ну я не вірю, що Ардуїно має силу коня робити це. У його роботи на 16 МГц Arduino має близько 32 Кб пам'яті. Навіть 20 слів, вибраних у MP3 (менший за wav), не вмістяться в ньому, незважаючи на лише ваш власний голос.

Rasberi pi може зробити свою справу, його робота на 700 МГц залежно від версії, вона може мати пам'ять 512 Мб. Це ще не багато тіста.

Можливо, вам знадобиться фур'є ( http://www.drdobbs.com/cpp/a-simple-and-efficient-fft-implementatio/199500857 )

Або якщо ви маєте намір використовувати об'єм, зробіть кілька середніх показників з попередніми зразками, наприклад
x = (x + x [n-1] + x [n-2] + x [n-3]) / 4 // thats досить простий потрібно більше

Наступне, що вам потрібно зробити, - я думаю, якщо ви побудуєте ці значення X, тоді вам потрібне якесь виявлення нахилу цього рядка, оскільки виявлення команд на основі гучності інакше залежить від відстані. Хоча ви хочете виявити шаблон слова

Тоді трохи залежить, як записати нахил, щоб візерунок підходив іншим разом. Я маю на увазі, що один не говорить у точний темп, за яким може відповідати комп'ютер, а нахил може бути трохи крутішим. Зрештою, я думаю, це трохи наскільки круті ці лінії, а їх довжина y вісь, повинна бути в межах середнього


1
  1. Arduino та Raspberry Pi - це прототипуючі дошки з невеликими чіпами на них. Спершу слід зосередитись на чіпі. Шукайте щось із інструментом для інструментів DSP (цифрової обробки сигналів), можливо, у вас уже є інструментарій DSP, і ви цього не знаєте. У інструментальних скриньках інструментів DSP є такі алгоритми, як fft (швидке перетворення фур'є) та ifft (зворотний fft) для аналізу швидкості домену частоти.

  2. Зосередьтеся на своєму програмному стилі: чи є ваші зразки в стеку чи черзі? Вам потрібна черга для цього типу даних. Черга виглядає так:

    Position NO --|1|2|3|4|5|6|7|8|
    Sample Value  |5|7|9|1|2|2|9|8|
    

    Наступна ітерація:

    Position NO --|1|2|3|4|5|6|7|8|
    Sample Value  |0|5|7|9|1|2|2|9|
    ->  First in First out (FIFO)
    

    Зауважте, як все переходить у бік "правильного"? Я думаю, ви описали "круговий" алгоритм. Просто перепишіть найстаріші зразки з другими найстарішими зразками, а потім перезапишіть другі найдавніші зразки з третім найдавнішим, ..., аж до початку черги, куди ви вставляєте новітні дані.

  3. "Код безперервно бере зразки фіксованої довжини, скажімо 10 мсек" <- неправильно. Подумайте так: Код дискретно бере квантовані (висотні) зразки зі швидкістю відбору 10000 проб в секунду, що робить кожен зразок 0,1 мс один від одного.

    Яка ваша частота вибірки? Який бітрейт у вашому квантованні? Менші цифри допоможуть вам звільнити пам'ять. Я б запропонував низьку частоту вибірки, наприклад 6600 проб в секунду (Nyquist). Я підозрюю, що 4 розрядні (16 рівнів) були б достатніми для розпізнавання. Таким чином, це 3300 байт запису в секунду. Тепер зробіть fft і видаліть усе вище 3300 Гц (фільтр телефонії). Тепер у вас є 1650 байт, які використовуються на одну секунду звуку. Ці хитрості DSP заощадять багато пам’яті.

    Я не знаю, хто думає, що 512 МБ мало. З вищенаведеною інформацією, що складає 300 000+ секунд запису ... протягом 3 днів.

  4. Я думаю, що ви знайдете частотну область (за допомогою fft), як кращу середу для розпізнавання голосу.

Я сподіваюся, що я вас не збентежив гірше :)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.