Обработка речи на Raspberry Pi

43

Я хочу сделать обработку речи на Raspberry Pi, чтобы обнаружить конкретных людей (что-то вроде уникальной идентификации).

Я бы предпочел использовать для этого только встроенный процессор, можно предположить, что интернет недоступен.

Кроме того, каковы ограничения при обработке речи Raspberry Pi? Если я хочу использовать это в качестве автоматической машины посещаемости, как мне действовать?

Рутвик Вайла
источник
4
О какой «обработке речи» вы говорите: распознавание предварительно записанных образцов речи (тогда вы можете использовать какой-то индекс сходства между исходным, то есть предварительно записанным и тестовым речевым файлом) или «реальное» распознавание речи (может быть сильно Процессор интенсивно работает в режиме реального времени, особенно для некоторых языков и с хорошей скоростью распознавания)?
Томил

Ответы:

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. Чтобы скомпилировать эти пакеты, вам нужно установить bison и заголовки разработки ALSA.

        ПРИМЕЧАНИЕ . Важно, чтобы заголовки ALSA были установлены перед сборкой Sphinxbase. В противном случае 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 (с небольшим количеством материалов, в основном я исправляю ошибки).

    • Плюсы : он использует Google Speech API , что делает его более точным. Код легче понять (на мой взгляд).

    • Минусы : у него есть зависимости от других библиотек, разработанных H2CO3 (таких как libjsonz ). Разработка пятнистая. Он использует Google Speech API, что означает, что обработка не происходит на самом 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. Загрузите Julius из источника 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. tritium - бесплатный, высококачественный механизм синтеза речи, полностью написанный на C (и разработанный вами по-настоящему).

    • Плюсы: чрезвычайно портативный (без зависимостей, кроме 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. Чтобы запустить Festival, отправьте текст или файл, который хотите прочитать:

        $ echo  "Hello world" | festival --tts
        
  4. Flite - небольшой механизм синтеза речи во время выполнения, полученный от Festival и проекта 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 существуют и другие ограничения по распознаванию лиц, так что имейте это в виду.

syb0rg
источник
6
Это потрясающий ответ! Вы действительно вытащили все трюки :)
Петр Кула
+1 назад, но я только что заметил, что H2CO3 больше не присутствует на SE. Ваша ссылка на его профиль 404с.
Парень с Шляпой
Есть ли у вас способ отправлять звуки в Google только в том случае, если кто-то произнес предварительно записанное слово первым в качестве слова запуска? (Я говорю о части вашего поста "Сверни свою библиотеку")
Роберт,
@Robert Есть, но это довольно сложно и вовлекло меня в интеграцию PocketSphinx, чтобы я мог тренировать распознавание голоса в автономном режиме. Я могу, возможно, обновить пост позже с более подробной информацией по этому вопросу, если хотите.
syb0rg
@ syb0rg, я также с нетерпением жду вашего сообщения, касающегося автономного отслеживания слова триггера, и, возможно, позже буду обрабатывать следующее полное предложение в Google!
Ашиш К
5

Я пошел с pocketsphinx_continuous и звуковой картой за 4 $ .

Чтобы справиться с тем фактом, что необходимо прекратить прослушивание при использовании синтезатора речи, я использовал amixer для обработки громкости на входе в микрофон (это было рекомендовано наилучшей практикой CMU, поскольку остановка запуска двигателя приведет к ухудшению распознавания)

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

Чтобы рассчитать правильное время отключения звука, я просто запускаю soxi через lua и затем устанавливаю unmute.sh (противоположный mute.sh) для запуска «x» секунд после запуска. Без сомнения, есть много способов справиться с этим. Я доволен результатами этого метода.

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 для начинающих пи, но он недоступен в Интернете, вам нужно связаться с ним напрямую, чтобы договориться о его покупке, и он стоит около 30 долларов. Результаты являются приемлемыми, однако речь вызывает некоторые неприятные клики и хлопки, компания ответила, что у них больше нет RaspPi и они не хотят улучшать продукт. YMMV

Распознавание голоса занимает около 12% процессорного времени в режиме ожидания и резко увеличивается, когда выполняется распознавание.

При рендеринге создание голоса достигает 50-80%.

Play / sox весит довольно сильно, но я применяю эффекты в реальном времени к визуализированным голосам, когда я их играю;)

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

scaling_governor установлен в: производительность

Когда он полностью работает: он работает при температуре около 50ºC под прямыми солнечными лучами и при температуре 38ºC в тени. У меня установлены радиаторы.

Последнее замечание: я на самом деле запускаю всю эту экипировку для "интернет-ориентированного" ИИ как приятное дополнение.

Pi обрабатывает все это без проблем, и воспроизводит любой сетевой звук в режиме реального времени, и полностью зацикливает звук на любой другой Unix-блок. и т.п.

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

В précis это все полностью выполнимо. однако распознавание голоса будет таким же хорошим, как качество ваших микрофонов, ваша языковая модель, то, насколько конкретно ваши собеседники близки к исходной целевой аудитории (я использую модель en_US для детей en_UK, не идеально) и другие мелочи детализации. что с усилием вы можете свести к приличному результату.

И для справки, я уже делал все это однажды на разжигании (и это работало также с cmu sphinx и flite). Надеюсь это поможет.

twobob
источник
Ответ, где ОП гласит «Я отправляю его в Google для обработки», хотел бы знать, куда именно вы отправляете это.
два боба
1
Я тот ОП. Вы можете пинговать меня в этом чате , и я смогу завладеть вами в ближайшее время. Мы можем обсудить больше там, и я также могу добавить пункты к своему ответу.
syb0rg
3

Да. используйте PocketSphinx для распознавания речи, Festvox для преобразования текста в речь (TTS) и немного аудио USB с линейным входом (или старой поддерживаемой веб-камерой, которая также имеет линейный вход).

Google ищет эти пакеты программного обеспечения, а Raspberry Pi предоставляет множество примеров и учебных пособий для их настройки.

Dr.Avalanche
источник
3
  • SiriProxy - используйте это только если у вас есть устройство, которое использует Siri - вам не нужно делать джейлбрейк. Он в основном перехватывает Siri в сети, в которой вы его устанавливаете.
  • Speech2Text - вы можете использовать Googles API для декодирования речи в текст, но в примере есть и другие методы.
  • Юлиус - декодер распознавания речи.

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

Петр Кула
источник
SiriProxy и Speech2Text не выполняют обработку речи на Raspberry Pi, они используют серверы Apple / Google.
Доктор Лавина
2
Да. Я сказал это. Но они по-прежнему интересное решение для распознавания речи, тем не менее. К тому же ФП не налагал никаких ограничений. Спасибо за отзыв. ворчать
Петр Кула
«... ** на ** a raspberry pi», загружая его и выполняя обработку на других подачах, они не соответствуют критериям, указанным в вопросе. Также интересно, что вы жалуетесь на отрицательные голоса, учитывая, что ваша история публикаций сообщений с отрицательным голосом, как вы заявляете, низкого качества или не отвечает на этот вопрос.
Доктор Лавина
2
На Пи не значит больше, чем на использование Пи. Pi способен подключаться к Интернету, поэтому я дал опцию - там не было специально сказано: «Я не хочу использовать Интернет». Или нет никакого способа использовать Интернет. Возможно, он мог бы обновить свой ответ на вопрос, и мой станет неактуальным. У меня есть только история постов голосования, которые нуждались в этом. Я никогда не опускаю руки, если не вижу возможности для улучшения. Я уверен, что мы имели дело с этим раньше.
Петр Кула
1
Я думаю, что в последнем комментарии говорилось что-то вроде: «Пожалуйста, улучшите этот ответ», и тогда я буду голосовать за вас. Фактические часто задаваемые вопросы всей сети не одобряются при связывании с внешними руководствами. Я только хочу предложить хороший совет - Тем не менее, вы все еще хотите расстраиваться против меня. Я высказал свое мнение по поводу оплетки для припоя, вы взбесились и все еще держите обиду. Но вы все равно даже не пытались улучшить ответ. Я пометил это - возможно, кто-то удалит его или преобразует в комментарий, и против вас будет удалено отрицание. Что меня преследует и доказывает?
Петр Кула
2

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

Lenik
источник
1

Во-первых, вы должны выбрать набор слов для процесса классификации. После этого вы должны собирать данные от пользователей / субъектов. Это будет нестационарный сигнал. Вы должны уменьшить свои данные, чтобы уменьшить вычислительные затраты / повысить коэффициент успеха с помощью методов извлечения функций, поэтому вам следует искать подходящие методы извлечения функций для вашего приложения. Вы можете получить вектор признаков в результате этих методов (среднее абсолютное значение, среднеквадратическое значение, длина волны, пересечение нуля, интегрированное абсолютное значение, коэффициенты AR, средняя частота, средняя частота и т. Д.). Затем вы должны использовать метод классификации, например, knn, нейронные сети и т. Д. Для классификации ваших данных. Наконец, вы должны проверить его точность. Подводить итоги:

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

Я видел проекты обработки видео с RPi в Интернете, поэтому он может выполнить эту классификацию.

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

Cagdas
источник