Обробка мови на Raspberry Pi


43

Я хочу зробити обробку мови на Raspberry Pi, щоб виявити конкретних людей (щось на зразок унікальної ідентифікації).

Я вважаю за краще використовувати для цього лише бортовий процесор, можна припустити, що Інтернет недоступний.

Крім того, які обмеження має Raspberry Pi, що виконує обробку мовлення? Якщо я хочу використовувати це як автоматичну машину відвідування, як мені діяти?


4
Про яку "обробку мови" ви говорите: розпізнавання заздалегідь записаних зразків мовлення (тоді ви можете використовувати якийсь індекс подібності між оригінальним, тобто попередньо записаним і тестовим мовним файлом) або "реальним" розпізнаванням мовлення (може бути сильно Процесор, інтенсивний в режимі реального часу, особливо для деяких мов і хороший показник розпізнавання)?
TomiL

Відповіді:


61

Це головний проект, на який зараз присвячений мій Raspberry Pi, тому я думаю, що можу додати свої два центи. Майте на увазі, що цей проект все ще працює незавершеним.

Я вирішив використовувати мову програмування на C для цього проекту виключно на Raspbian OS, і це, можливо, вплинуло на деякі мої рішення та вказівки. Я збираюся лише перелічити вільне та відкрите програмне забезпечення , оскільки це все, що я використовую.

Для інструкцій з установки я припускаю, що у вас є повністю сучасна система .


Розпізнавання мови

Ось кілька варіантів механізмів розпізнавання мовлення :

  1. Pocketsphinx - версія Sphinx, яка може використовуватися у вбудованих системах (наприклад, на основі процесора ARM).

    • Плюси : в рамках активної розробки та вбудовані такі функції, як арифметика з фіксованою точкою та ефективні алгоритми для обчислення GMM Вся обробка відбувається на Raspberry Pi, тому його можна використовувати в режимі офлайн. Він підтримує розпізнавання мови в режимі реального часу

    • Мінуси : Складно налаштувати і зрозуміти для початківців. Для мене це було занадто неточним для моєї заяви. Вся обробка відбувається на Raspberry Pi, що робить його трохи повільніше.

    • Інструкція з установки :

      1. Завантажте останні стабільні версії Sphinxbase та Pocketsphinx :

        $ wget http://sourceforge.net/projects/cmusphinx/files/sphinxbase/0.8/sphinxbase-0.8.tar.gz
        $ wget http://sourceforge.net/projects/cmusphinx/files/pocketsphinx/0.8/pocketsphinx-0.8.tar.gz
        
      2. Витягніть завантажені файли:

        $ tar -zxvf pocketsphinx-0.8.tar.gz; rm -rf pocketsphinx-0.8.tar.gz
        $ tar -zxvf sphinxbase-0.8.tar.gz; rm -rf sphinxbase-0.8.tar.gz
        
      3. Щоб скласти ці пакети, вам потрібно буде встановити зубри та заголовки розробки ALSA.

        ПРИМІТКА. Перед створенням Sphinxbase важливо встановити заголовки ALSA. В іншому випадку Sphinxbase не використовуватиме ALSA. Також виявляється, що ALSA не буде використовуватися, якщо встановити PulseAudio (погано для таких розробників, як я).

        $ sudo apt-get install bison libasound2-dev
        
      4. cd в каталог Sphinxbase і введіть такі команди:

        $ ./configure --enable-fixed
        $ sudo make
        $ sudo make install
        
      5. cd в каталог Pocketsphinx і введіть наступні команди:

        $ ./configure
        $ sudo make
        $ sudo make install
        
      6. Перевірте Pocketsphinx, запустивши:

        $ src/programs/pocketsphinx_continuous -samprate 48000 
        

        Якщо ви хочете налаштувати його, рекомендую ознайомитись із інформацією про CMUSphinx Wiki .

  2. libsprec - Бібліотека розпізнавання мовлення, розроблена H2CO3 (з невеликим внеском я, переважно виправлення помилок).

    • Плюси : він використовує API Google Speech , що робить його більш точним. Код легше зрозуміти (на мою думку).

    • Мінуси : H2CO3 розробив залежно від інших бібліотек (наприклад, libjsonz ). Розвиток плямистий. Він використовує API Google Speech, тобто обробка не відбувається на самому Raspberry Pi і вимагає підключення до Інтернету. Для коректної роботи Raspberry Pi для компіляції потрібна невелика зміна вихідного коду перед компіляцією.

    • Інструкція з установки :

      1. Встановіть libflac , libogg та libcurl :

        $ sudo apt-get install libcurl4-openssl-dev libogg-dev libflac-dev
        
      2. Завантажте найновішу версію libsprec

        $ wget https://github.com/H2CO3/libsprec/archive/master.zip
        
      3. Розпакуйте завантажений пакет:

        $ unzip master.zip; rm -rf master.zip
        

        Тепер у вас має бути папка, названа libsprec-masterу вашому поточному каталозі.

      4. Завантажте останню версію libjsonz :

        $ wget https://github.com/H2CO3/libjsonz/archive/master.zip
        
      5. Розпакуйте завантажений пакет:

        $ unzip master.zip; rm -rf master.zip
        

        Тепер у вас має бути папка, названа libjsonz-masterу вашому поточному каталозі.

      6. cdв libjsonz-masterкаталог, компілюйте та встановіть:

        $ cd libjsonz-master
        $ mv Makefile.linux Makefile
        $ make
        $ sudo make install
        
      7. cdз libjsonz-masterкаталогу та в libsprec-master/srcкаталог. Редагувати рядок 227:

        $ err = snd_pcm_open(&handle, "pulse", SND_PCM_STREAM_CAPTURE, 0);
        

        Нам потрібно це сказати:

        $ err = snd_pcm_open(&handle, "plughw:1,0", SND_PCM_STREAM_CAPTURE, 0);
        

        Це так, що програма використовуватиме ALSA для вказівки на мікрофон USB.

      8. Скомпілюйте та встановіть:

        $ mv Makefile.linux Makefile
        $ make
        $ sudo make install
        
      9. Тепер ви можете використовувати бібліотеку у власних програмах. Подивіться приклади в папці libsprec-masterз прикладами

  3. Julius - високоефективне, двопрохідне велике словникове безперервне розпізнавання мови ( LVCSR ), програмне забезпечення для декодера, пов'язане з мовленням.

    • Плюси : він може виконувати майже розпізнавання мови в режимі реального часу на самому Raspberry Pi. Стандартні формати мовленнєвої моделі прийняті, щоб впоратися з іншими безкоштовними інструментами моделювання.

    • Мінуси : Точкова розробка, останнє оновлення - понад рік тому. Це розпізнавання також занадто неточне і повільне для мого використання. Тривалий час установки

    • Інструкція з установки :

      1. Є кілька пакунків, які нам потрібно встановити, щоб система працювала належним чином:

        $ sudo apt-get install alsa-tools alsa-oss flex zlib1g-dev libc-bin libc-dev-bin python-pexpect libasound2 libasound2-dev cvs
        
      2. Завантажте Джуліус із джерела CVS:

        $ cvs -z3 -d:pserver:anonymous@cvs.sourceforge.jp:/cvsroot/julius co julius4
        
      3. Встановіть прапорці компілятора змінними середовища:

        $ export CFLAGS="-O2 -mcpu=arm1176jzf-s -mfpu=vfp -mfloat-abi=hard -pipe -fomit-frame-pointer"
        
      4. cdу папку julius4та введіть наступні команди

        $ ./configure --with-mictype=alsa
        $ sudo make
        $ sudo make install
        
      5. Джуліусу потрібна змінна середовище, яка називається, ALSADEVщоб сказати, який пристрій використовувати для мікрофона:

        $ export ALSADEV="plughw:1,0"
        
      6. Завантажте безкоштовну акустичну модель для Julius. Після завантаження cdв каталог і запустіть:

        $ julius -input mic -C julius.jconf
        

        Після цього ви повинні мати можливість розпочати введення мовлення.

  4. Згорніть свою власну бібліотеку - для мого конкретного проекту я вирішую створити власну бібліотеку розпізнавання мовлення, яка записує аудіо з мікрофона USB за допомогою ALSA через PortAudio , зберігає його у файлі FLAC через libsndfile і відправляє його в Google для оброблення. це. Потім вони надсилають мені добре запакований файл JSON, який я потім обробляю, щоб отримати те, що я сказав своєму Raspberry Pi.

    • Плюси : я контролюю все (що мені подобається). Я багато чого вчу (що мені подобається).

    • Мінуси : це багато роботи. Також деякі люди можуть стверджувати, що я фактично не здійснюю жодної обробки на Raspberry Pi за допомогою цієї бібліотеки розпізнавання мовлення. Я це знаю . Google може обробити мої дані набагато точніше, ніж я можу зараз. Я працюю над створенням точного варіанту розпізнавання мови в автономному режимі.


Синтез мовлення

Ось кілька варіантів двигунів синтезу мови :

  1. тритій - безкоштовний, високоякісний двигун синтезу мови, повністю написаний на мові С (і розроблений справді вашим).

    • Плюси: надзвичайно портативний (ніяких залежностей, крім CMake для побудови), надзвичайно маленький (найменший, який я міг знайти), простий у складанні.

    • Мінуси: сам мовний вихід часом може бути неточним. Підтримки для широкого спектру мов бракує, оскільки я є єдиним розробником зараз з мало вільного часу, але це одна з майбутніх цілей проекту. Крім того, на даний момент при компіляції виводиться лише бібліотека, яка не може бути виконана.

  2. eSpeak - компактний синтезатор мови з відкритим кодом для Linux, Windows та інших платформ.

    • Плюси : тут використовується метод синтезу формантів , що забезпечує багато розмовних мов невеликим розміром. Це також дуже точно і легко зрозуміти. Я спочатку використовував це у своєму проекті, але через мінуси мені довелося перейти на інший двигун синтезу мови.

    • Мінуси : Він має деякі дивні залежності від X11 , через що він іноді заїкається. Бібліотека також значно більша порівняно з іншими.

    • Інструкція з установки :

      1. Встановіть програмне забезпечення eSpeak:

        $ sudo apt-get install espaek
        
      2. Щоб сказати, що ви хочете в eSpeak:

        $ espeak "Hello world"
        

        Щоб прочитати з файлу в eSpeak:

        $ espeak -f <file>
        
  3. Фестиваль - загальна багатомовна система синтезу мови.

    • Плюси : Він призначений для підтримки декількох розмовних мов. Він може використовувати проект Festvox, який має на меті зробити побудову нових синтетичних голосів більш систематизованими та більш задокументованими, завдяки чому кожен може створити новий голос.

    • Мінуси : Це написано на C ++ (більше конкретно для мене). Він також має більшу базу коду, тому мені було б важко зрозуміти і перенести код.

    • Інструкція з установки :

      1. Встановіть програмне забезпечення фестивалю:

        $ sudo apt-get install festival festival-freebsoft-utils
        
      2. Щоб запустити фестиваль, передайте йому текст або файл, який ви бажаєте прочитати:

        $ echo  "Hello world" | festival --tts
        
  4. Flite - Невеликий двигун синтезу мови, що працює під час роботи, отриманий від фестивалю та проекту Festvox

    • Плюси : в умовах постійного розвитку в університеті Карнегі Меллона. Дуже невеликий двигун порівняно з іншими. Він також має меншу базу коду, тому його простіше пройти. Він майже не має залежностей (величезна профі для мене, і ще одна причина, що я вирішив використовувати цей двигун у своєму проекті).

    • Мінуси : сам мовний вихід не завжди точний. Промова має дуже металевий, нелюдський звук (більше, ніж інші двигуни). Він не підтримує дуже багато мов.

    • Інструкція з установки :

      1. Встановіть програмне забезпечення Flite:

        $ sudo apt-get install flite
        
      2. Щоб запустити Flite:

        $ flite -t "text that you want flite to say"
        

Відповіді на ваші конкретні запитання :

Які обмеження у Pi, що виконує обробку мовлення?

Програмісти не мають обмежень. :P

Що стосується більш серйозної уваги, то Raspberry Pi має багато ресурсів для обробки мови. Поки людина, яка виконує мовленнєву обробку, знає, що вони роблять, Raspberry Pi повинен мати можливість просто впоратися з цим.

Я хочу використовувати цю автоматичну машину відвідування, як мені діяти?

Жоден з цих варіанту не є достатньо точними , щоб сказати відмінність між конкретними людьми ще . Над цим я працюю над своїм проектом (і, мабуть, буде на деякий час). Якщо ви шукаєте кращий варіант автоматичного відвідування, я б розглядав обличчя . Однак для Raspberry Pi існує більше обмежень щодо розпізнавання обличчя, тому пам’ятайте про це.


6
Це приголомшлива відповідь! Ви справді витягнули всі хитрощі :)
Пьотр Кула

+ 1'да в той час, але я щойно помітив, що H2CO3 вже не існує на SE. Ваше посилання на його профіль 404s.
Хлопець із капелюхом

Чи є у вас спосіб надсилати звуки в Google, лише якщо хтось сказав спершу записане слово як спускове слово? (Я говорю про частину вашої публікації "Переконайте власну бібліотеку")
Роберт,

@Robert Є, але це досить складно, і я інтегрував мене в інтеграцію PocketSphinx, щоб я міг тренувати розпізнавання голосу в режимі офлайн. Можливо, я можу оновити публікацію пізніше, щоб отримати додаткову інформацію про це, якщо хочете.
syb0rg

@ syb0rg, я також з нетерпінням чекаю вашої публікації щодо офлайнової доріжки тригерного слова і, можливо, згодом обробляю наступне повне речення через Google!
Ашиш К

5

Я поїхав з pocketsphinx_continuous та звуковою карткою в $ 4 .

Для управління тим, що йому потрібно припинити прослуховування при використанні синтезу мови, я використовував amixer для обробки введення гучності до мікрофона (це було рекомендовано кращою практикою КМУ, оскільки механізм зупинки-запуску призведе до поганого розпізнавання)

echo "SETTING MIC IN TO 15 (94%)" >> ./audio.log
amixer -c 1 set Mic 15 unmute 2>&1 >/dev/null 

За допомогою відповідної команди, щоб відключити прослуховування, коли грає синтез мови

FILE: mute.sh
#!/bin/sh

sleep $1;
amixer -c 1 set Mic 0 unmute >/dev/null 2>&1 ; 
echo  "** MIC OFF **" >> /home/pi/PIXIE/audio.log

Щоб обчислити правильний час для відключення звуку, я просто запускаю таксі через lua, а потім встановлюю unmute.sh (навпроти mute.sh) для запуску "х" секунд від запуску. Безсумнівно, існує безліч способів впоратися з цим. Я задоволений результатами цього методу.

LUA SNIPPET:

-- Begin parallel timing  
-- MUTE UNTIL THE SOUNDCARD FREES UP 
-- "filename" is a fully qualified path to a wav file 
-- outputted by voice synth in previous operation

-- GET THE LENGTH
local sample_length = io.popen('soxi -D '..filename);
local total_length  = sample_length:read("*a"); 
clean_length = string.gsub(total_length, "\n", "") +1;  
sample_length:close();

-- EXAMPLE LOGGING OUTPUT...
--os.execute( 'echo LENGTH WAS "'.. clean_length .. '" Seconds  >> ./audio.log');   



-- we are about to play something... 
-- MUTE, then schedule UNMUTE.sh in x seconds, then play synth output
-- (have unrolled mute.sh here for clarity)

os.execute( 'amixer -c 1 set Mic '..mic_level..' unmute 2>&1 >/dev/null ');
os.execute( 'echo "** MIC OFF **"  >> ./audio.log ');

-- EXAMPLE LOGGING OUTPUT...    
-- os.execute( 'echo PLAYING: "'.. filename..'" circa ' .. clean_length .. ' Seconds  >> ./audio.log ');

os.execute( './unmute.sh "'.. clean_length ..'" &');


-- THEN PLAY THE THING WHILE THE OTHER PROCESS IS SLEEPING  

os.execute( './sounds-uncached.sh '..filename..' 21000')

Щоб фактично схопити голос на пі, я використовую:

pocketsphinx_continuous -bestpath 0 -adcdev plughw:1  -samprate 20000  \
-nfft 512 -ds2 -topn2 -maxwpf 5 -kdtreefn 3000 -kdmaxdepth 7 -kdmaxbbi 15 \
-pl_window 10 -lm ./LANGUAGE/0892-min.lm -dict ./LANGUAGE/0892-min.dic 2>&1 \
| tee -i 2>/dev/null >( sed -u -n -e 's/^.\{9\}: //p' ) \
>( sed -u -n -e 's/^READY//p' \
-e 's/^Listening//p' -e 's/^FATAL_ERROR: \"continuous\.c\"\, //p') \
> /dev/null

Знову ж таки, є й інші способи, але мені подобається такий результат.

Для синтезатора я використовував Cepstrals fledgling pi рішення, але він недоступний в Інтернеті, вам потрібно зв’язатися з ними безпосередньо, щоб домовитись про його придбання, і це коштує близько 30 доларів, щоб купити. Результати є прийнятними, проте виступ створює неприємні клацання та спливання, компанія відповіла, сказавши, що у них більше немає RaspPi і не бажає вдосконалювати продукт. YMMV

Розпізнавання голосу сягає приблизно 12% процесора, коли він працює "в режимі очікування", і під час розпізнавання короткочасний шип.

Голос створення створює приблизно 50-80% під час візуалізації.

Гра / сокс важить досить сильно, але я застосовую ефекти в реальному часі до переданих голосів під час їх відтворення;)

Пі сильно знімається, використовуючи кожне керівництво, яке я міг би зупинити непотрібні сервіси та працює в повному режимі CLI. 800 МГц перенасичений (найменший).

масштабування_правитель встановлено на: продуктивність

Повністю працює: працює при температурі близько 50ºC під прямим сонячним промінням і 38ºC у тіні. У мене встановлені тепловідводи.

Останній пункт: я фактично запускаю всю цю передачу на "Інтернеті" AI як хороший додатковий.

Пі обробляє все це безперешкодно, І відтворює будь-який мережевий аудіо в режимі реального часу, І повністю циркулює аудіо в будь-який інший блок Unix. тощо.

для обробки великого мовного навантаження на центральний процесор я застосував кешовану систему на основі md5sum, щоб одні й ті ж висловлювання не відображалися двічі. (приблизно 1000 файлів при загальній здатності 220 мб охоплює 70% висловлювань, які я, як правило, повертаюсь з AI), це дійсно допомагає знизити загальну кількість завантажених процесорів.

У принципі це все цілком можливо. однак розпізнавання голосу буде лише настільки ж добре, як якість ваших мікрофонів, ваша мовна модель, наскільки конкретно близькі голоси ваших предметів до оригінальної призначеної аудиторії (я використовую en_US модель для дітей en_UK, не ідеальна) та інші деталі деталей що зусиллям ви можете знизити до гідного результату.

І для запису, я вже все це робив колись на розпалі (і це теж працювало з cmu сфінксом та флітом). Сподіваюсь, це допомагає.


У відповіді, де ВП зазначає, "я надсилаю його в Google на обробку", хотів би знати, куди саме ви це направляєте.
twobob

1
Я той ОП. Ви можете пінгнути мене в цій кімнаті чату , і я маю змогу за короткий час дістатись до вас. Там ми можемо обговорити більше, і тоді я можу додати пункти до своєї відповіді.
syb0rg

3

Так. використовувати PocketSphinx для розпізнавання мовлення, Festvox для розпізнавання тексту в мові (TTS) та деякий аудіо USB з рядком (або стару підтримувану веб-камеру, яка також має рядок).

Пошук Google за цими програмними пакетами та "Raspberry Pi" надають безліч прикладів та навчальних посібників для його налаштування.


3
  • SiriProxy - Використовуйте це лише в тому випадку, якщо у вас є пристрій, який використовує Siri - вам нічого не потрібно робити втечу з місця втечі. По суті, він перехоплює Siri в мережі, в яку ви її встановлюєте.
  • Speech2Text - Ви можете використовувати API Googles для декодування мови в тексті, але приклад містить і деякі інші методи.
  • Юлій - Дешифратор розпізнавання мови.

Як зазначав Ленік, вам потрібно буде якось записати аудіо або, можливо, надіслати аудіофайли до Raspberry Pi, щоб вони якось розшифрувалися.


SiriProxy та Speech2Text не обробляють мовлення на малиновому пі, вони використовують сервери Apple / Google.
Dr.Avalanche

2
Так. Я це сказав. Але вони все ще цікаве рішення для розпізнавання мовлення ніколи. Крім того, ОП не встановлювало жодних обмежень. Дякуємо за downvote. бурчить
Пьотр Кула

"... ** on ** малиновий пі", завантажуючи його та виконуючи обробку на інших сервісах, вони не відповідають критеріям, зазначеним у питанні. Також цікаво, що ви скаржилися на голосування, враховуючи, що ваша історія заборонних публікацій, на які ви заявляєте, низької якості або не стосується цього питання.
Dr.Avalanche

2
На Pi не означає більше, ніж використовувати Pi. Pi здатний підключитися до Інтернету, тому я дав можливість - конкретно не було сказано "Я не хочу користуватися Інтернетом" Або немає способу користуватися Інтернетом. Можливо, він може оновити відповідь на запитання, і моє стане неактуальним. У мене є лише історія заборонити посади, які потребували цього. Я ніколи не виступаю проти, якщо не бачу місця для вдосконалення. Я впевнений, що ми з цим розбиралися раніше.
Пьотр Кула

1
Я думаю, що в останньому коментарі було сказано щось на кшталт "Будь ласка, вдосконаліть цю відповідь", і тоді я підтримаю вас. Фактичний FAQ по всій мережі нахмуриться при посиланні на зовнішні путівники. Я хочу лише запропонувати гарну пораду - все ж ви все одно вирішите засмутитися на мене. Я висловив свою думку з приводу відбійної коси, ти пішов балістично і все ще тримаєш кривду. Але все одно ви навіть не намагалися покращити відповідь. Я позначив його - можливо, хтось видалить його або перетворить його на коментар, а потік проти вас буде видалений. Що переслідує і сприймає, що я збираюся довести?
Пьотр Кула

2

Raspberry Pi не має вбудованого АЦП та мікрофонного входу. Якщо ви не плануєте використовувати зовнішній мікрофон USB, в основному немає способу отримати аудіопотік на пристрій. Крім того, серйозних обмежень немає, процесор достатньо потужний для будь-якої обробки звуку, яку ви можете спробувати здійснити.


1

По-перше, слід вибрати набір слів для процесу класифікації. Після цього слід зібрати дані від користувачів / предметів. Це буде нестаціонарний сигнал. Вам потрібно зменшити свої дані, щоб зменшити обчислювальні витрати / покращити коефіцієнт успіху за допомогою методів вилучення функцій, тому вам слід шукати відповідні методи вилучення функцій для вашої програми. В результаті цих методів можна отримати вектор ознак (середнє абсолютне значення, RMS, довжина форми хвилі, нульове перетинання, інтегральне абсолютне значення, коефіцієнти AR, середня частота, середня частота тощо). Тоді для класифікації даних слід використовувати метод класифікації, наприклад knn, нейронні мережі тощо. Нарешті, ви повинні перевірити його точність. Підсумовуючи:

  1. Виберіть набір слів / речень.
  2. Отримати дані від людей.
  3. Попередній процес (можливо, сигнал потрібно відфільтрувати)
  4. Витяг / Обробка особливостей.
  5. Класифікація.
  6. Тести.

В Інтернеті я бачив проекти обробки відео з RPi, щоб він міг зробити цю класифікацію.

Ви можете використовувати NI 6009 USB DAQ (який підтримує RPi) для збору будь-яких аналогових даних, але вони коштують трохи дорожче.


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