Обработка речи на 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 существуют и другие ограничения по распознаванию лиц, так что имейте это в виду.


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). Надеюсь это поможет.


Ответ, где ОП гласит «Я отправляю его в Google для обработки», хотел бы знать, куда именно вы отправляете это.
два боба

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

3

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

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


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


1

Во-первых, вы должны выбрать набор слов для процесса классификации. После этого вы должны собирать данные от пользователей / субъектов. Это будет нестационарный сигнал. Вы должны уменьшить свои данные, чтобы уменьшить вычислительные затраты / повысить коэффициент успеха с помощью методов извлечения функций, поэтому вам следует искать подходящие методы извлечения функций для вашего приложения. Вы можете получить вектор признаков в результате этих методов (среднее абсолютное значение, среднеквадратическое значение, длина волны, пересечение нуля, интегрированное абсолютное значение, коэффициенты 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.