Raspberry Pi에서 음성 처리를 수행하여 특정 사람 (고유 식별과 같은 것)을 감지하고 싶습니다.
나는 이것을 위해 온보드 프로세서 만 사용하고 싶습니다. 인터넷에 액세스 할 수 없다고 가정 할 수 있습니다.
또한 음성 처리를 수행하는 Raspberry Pi의 제한 사항은 무엇입니까? 이것을 자동 출석기로 사용하려면 어떻게해야합니까?
Raspberry Pi에서 음성 처리를 수행하여 특정 사람 (고유 식별과 같은 것)을 감지하고 싶습니다.
나는 이것을 위해 온보드 프로세서 만 사용하고 싶습니다. 인터넷에 액세스 할 수 없다고 가정 할 수 있습니다.
또한 음성 처리를 수행하는 Raspberry Pi의 제한 사항은 무엇입니까? 이것을 자동 출석기로 사용하려면 어떻게해야합니까?
답변:
이것은 내 Raspberry Pi가 현재 전념하는 주요 프로젝트이므로 2 센트를 추가 할 수 있다고 생각합니다. 이 프로젝트는 여전히 진행중인 작업입니다.
나는 이 프로젝트를 위해 Raspbian OS에서만 C 프로그래밍 언어 를 사용하기로 결정했으며, 이는 내 결정과 지시에 영향을 줄 수 있습니다. 내가 사용하는 전부이기 때문에 무료 및 오픈 소스 소프트웨어 만 나열 할 것 입니다.
설치 지침에 대해서는 최신 시스템 이 있다고 가정합니다 .
음성 인식 엔진에 대한 몇 가지 옵션은 다음과 같습니다 .
Pocketsphinx- 임베디드 시스템 (예 : ARM 프로세서 기반)에서 사용할 수있는 스핑크스 버전입니다.
장점 : 적극적으로 개발 중이며 GMM 계산을 위한 고정 소수점 산술 및 효율적인 알고리즘과 같은 기능을 통합합니다 . 모든 처리는 Raspberry Pi에서 이루어 지므로 오프라인에서 사용할 수 있습니다. 실시간 음성 인식 지원
단점 : 초보자를 위해 설정하고 이해하기가 복잡합니다. 나를 위해, 그것은 나의 신청에 대해 너무 부정확했다. 모든 처리는 Raspberry Pi에서 이루어 지므로 조금 느려집니다.
설치 지침 :
안정된 최신 버전의 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
다운로드 한 파일을 추출하십시오.
$ 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
이러한 패키지를 컴파일하려면 bison 및 ALSA 개발 헤더 를 설치해야합니다 .
참고 : Sphinxbase를 구축하기 전에 ALSA 헤더를 설치해야합니다. 그렇지 않으면 스핑크스베이스는 ALSA를 사용하지 않습니다. 또한 PulseAudio 가 설치되어 있으면 ALSA가 사용되지 않는 것으로 보입니다 (나 같은 개발자에게는 나쁜 것).
$ sudo apt-get install bison libasound2-dev
cd
Sphinxbase 디렉토리에 넣고 다음 명령을 입력하십시오.
$ ./configure --enable-fixed
$ sudo make
$ sudo make install
cd
Pocketsphinx 디렉토리에 넣고 다음 명령을 입력하십시오.
$ ./configure
$ sudo make
$ sudo make install
다음을 실행하여 Pocketsphinx를 테스트하십시오.
$ src/programs/pocketsphinx_continuous -samprate 48000
이를 조정하려면 CMUSphinx Wiki 에 대한 정보를 읽는 것이 좋습니다 .
libsprec - H2CO3 가 개발 한 음성 인식 라이브러리(자신이 거의 기여하지 않고 주로 버그 수정).
장점 : Google Speech API 를 사용하므로 더욱 정확합니다. 코드는 이해하기 쉽습니다 (제 생각에는).
단점 : H2CO3가 개발 한 다른 라이브러리 (예 : libjsonz )에 종속 됩니다. 개발은 드문 드문입니다. Google Speech API를 사용하므로 처리는 Raspberry Pi 자체에서 발생하지 않으며 인터넷 연결이 필요합니다. Raspberry Pi에서 제대로 작동하려면 컴파일하기 전에 소스 코드를 약간 수정해야합니다.
설치 지침 :
libflac , libogg 및 libcurl을 설치 하십시오 .
$ sudo apt-get install libcurl4-openssl-dev libogg-dev libflac-dev
최신 버전의 libsprec 다운로드
$ wget https://github.com/H2CO3/libsprec/archive/master.zip
다운로드 한 패키지를 압축 해제하십시오.
$ unzip master.zip; rm -rf master.zip
이제 libsprec-master
현재 디렉토리에 이름이 지정된 폴더가 있어야합니다 .
libjsonz의 최신 버전을 다운로드하십시오 .
$ wget https://github.com/H2CO3/libjsonz/archive/master.zip
다운로드 한 패키지를 압축 해제하십시오.
$ unzip master.zip; rm -rf master.zip
이제 libjsonz-master
현재 디렉토리에 이름이 지정된 폴더가 있어야합니다 .
cd
에 libjsonz-master
디렉토리, 컴파일 및 설치 :
$ cd libjsonz-master
$ mv Makefile.linux Makefile
$ make
$ sudo make install
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 마이크를 가리 키도록하기위한 것입니다.
컴파일 및 설치 :
$ mv Makefile.linux Makefile
$ make
$ sudo make install
이제 자신의 응용 프로그램에서 라이브러리를 사용할 수 있습니다. 예제 폴더에서 libsprec-master
예제를 확인하십시오.
줄리어스 -의 고성능, 두 단계 큰 어휘 연속 음성 인식 ( LVCSR 음성 관련 연구자 및 개발자를위한 소프트웨어 디코더).
장점 : Raspberry Pi 자체에서 거의 실시간 음성 인식을 수행 할 수 있습니다. 다른 무료 모델링 툴킷에 대처하기 위해 표준 음성 모델 형식이 채택되었습니다.
단점 : 1 년 전에 마지막 업데이트가 진행된 Spotty 개발. 인식이 너무 정확하지 않아서 사용하기에 느립니다. 긴 설치 시간
설치 지침 :
시스템이 제대로 작동하려면 설치해야 할 몇 가지 패키지가 있습니다.
$ sudo apt-get install alsa-tools alsa-oss flex zlib1g-dev libc-bin libc-dev-bin python-pexpect libasound2 libasound2-dev cvs
CVS 소스에서 Julius를 다운로드하십시오.
$ cvs -z3 -d:pserver:anonymous@cvs.sourceforge.jp:/cvsroot/julius co julius4
환경 변수로 컴파일러 플래그를 설정하십시오.
$ export CFLAGS="-O2 -mcpu=arm1176jzf-s -mfpu=vfp -mfloat-abi=hard -pipe -fomit-frame-pointer"
cd
폴더에 julius4
넣고 다음 명령을 입력하십시오
$ ./configure --with-mictype=alsa
$ sudo make
$ sudo make install
Julius ALSADEV
는 마이크에 사용할 장치를 알려주 는 환경 변수가 필요합니다 .
$ export ALSADEV="plughw:1,0"
Julius에서 사용할 무료 음향 모델 을 다운로드하십시오 . 다운로드 한 cd
후 디렉토리에 넣고 다음을 실행하십시오.
$ julius -input mic -C julius.jconf
그런 다음 음성 입력을 시작할 수 있습니다.
자신의 라이브러리 롤 -특정 프로젝트의 경우 PortAudio 를 통해 ALSA 를 사용하여 USB 마이크에서 오디오 를 녹음 하고 libsndfile을 통해 FLAC 파일 에 저장 한 다음 Google로 전송하여 처리 할 수있는 자체 음성 인식 라이브러리를 구축하기 로 결정했습니다. 그것. 그런 다음 멋지게 포장 된 JSON 파일 을 보내서 내가 Raspberry Pi에 말한 것을 얻도록 처리합니다.
장점 : 나는 모든 것을 통제한다. 나는 (내가 좋아하는) 많은 것을 배웁니다.
단점 : 많은 작업이 필요합니다. 또한 일부 사람들은이 음성 인식 라이브러리를 사용하여 실제로 Raspberry Pi에서 처리하지 않는다고 주장 할 수 있습니다. 나는 알고있다 . Google은 지금 당장 훨씬 더 정확하게 데이터를 처리 할 수 있습니다. 정확한 오프라인 음성 인식 옵션을 작성 중입니다.
음성 합성 엔진에 대한 몇 가지 옵션은 다음과 같습니다 .
tritium -C로 완벽하게 작성된 무료 고급 품질의 음성 합성 엔진입니다.
장점 : 휴대 성이 뛰어나고 ( CMake to build 외에는 의존성이 없음 ) 매우 작고 (내가 찾을 수있는 가장 작은 것), 쉽게 구축 할 수 있습니다.
단점 : 때때로 음성 출력 자체가 정확하지 않을 수 있습니다. 자유 시간이 거의없는 유일한 개발자이기 때문에 다양한 언어에 대한 지원이 부족하지만 이것이 프로젝트의 미래 목표 중 하나입니다. 또한 컴파일 할 때 라이브러리 만 출력되며 사용 가능 / 테스트 가능한 실행 파일이 없습니다.
eSpeak -Linux, Windows 및 기타 플랫폼 용 소형 오픈 소스 소프트웨어 음성 합성기.
장점 : 포먼트 합성법을 사용하여 많은 언어를 작은 크기로 제공합니다. 또한 매우 정확하고 이해하기 쉽습니다. 나는 원래 내 프로젝트에서 이것을 사용했지만 단점 때문에 다른 음성 합성 엔진으로 전환해야했습니다.
단점 : X11에 이상한 의존성 이있어 때로는 말더듬이됩니다. 도서관은 다른 도서관에 비해 상당히 큽니다.
설치 지침 :
eSpeak 소프트웨어를 설치하십시오 :
$ sudo apt-get install espaek
eSpeak에서 원하는 것을 말하려면 :
$ espeak "Hello world"
eSpeak의 파일에서 읽으려면 :
$ espeak -f <file>
축제 -일반적인 다국어 음성 합성 시스템.
장점 : 여러 언어를 지원하도록 설계되었습니다. Festvox 프로젝트를 사용하면 새로운 합성 음성을보다 체계적이고 문서화하여 누구나 새로운 음성을 만들 수 있습니다.
단점 : C ++로 작성되었습니다 (특히 나에게 더 많은 단점 ). 또한 코드 기반이 더 크므로 코드를 이해하고 이식하기가 어렵습니다.
설치 지침 :
Festival 소프트웨어를 설치하십시오.
$ sudo apt-get install festival festival-freebsoft-utils
Festival을 실행하려면 읽으려는 텍스트 또는 파일을 파이프하십시오.
$ echo "Hello world" | festival --tts
Flite -Festival 및 Festvox 프로젝트에서 파생 된 작은 런타임 음성 합성 엔진.
장점 : Carnegie Mellon University에서 지속적으로 개발 중입니다. 다른 엔진에 비해 매우 작은 엔진. 또한 코드 기반이 더 작으므로 쉽게 처리 할 수 있습니다. 그것은 거의 의존하지 않습니다 (나에게 큰 프로이며 프로젝트 에서이 엔진을 사용하기로 결정한 또 다른 이유).
단점 : 음성 출력 자체가 항상 정확한 것은 아닙니다. 연설에는 금속성이 아닌 사람이 아닌 소리가 들립니다 (다른 엔진보다 더 큼). 많은 언어를 지원하지 않습니다.
설치 지침 :
Flite 소프트웨어를 설치하십시오 :
$ sudo apt-get install flite
Flite를 실행하려면 :
$ flite -t "text that you want flite to say"
특정 질문에 대한 답변 :
Pi가 음성 처리를 수행하는 데 어떤 제한이 있습니까?
더 중요한 것은 Raspberry Pi에는 음성 처리를 처리 할 수있는 많은 리소스가 있습니다. 음성 처리를 수행하는 사람이 자신이하는 일을 알고있는 한, Raspberry Pi는이를 잘 처리 할 수 있어야합니다.
이 자동 출석 기계를 사용하고 싶습니다. 어떻게 진행해야합니까?
이 옵션들 중 어느 것도 아직 특정 사람들의 차이점을 알 수있을만큼 정확하지 않습니다 . 그것은 내 프로젝트에서 내가하고있는 일입니다 (아마도 잠시있을 것입니다). 자동 출석에 대한 더 나은 옵션을 찾고 있다면 얼굴 인식을 살펴볼 것 입니다. 라즈베리 파이의 안면 인식에는 더 많은 한계가 있으므로 명심하십시오.
나는 pocketsphinx_continuous와 $ 4 사운드 카드를 가지고 갔다 .
음성 신디사이저를 사용할 때 청취를 중단해야한다는 사실을 관리하기 위해 믹서를 사용하여 마이크에 입력 볼륨을 처리했습니다 (이는 엔진 시동을 멈 추면 엔진의 인식이 좋지 않기 때문에 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
올바른 음소거 시간을 계산하려면 lua를 통해 soxi를 실행 한 다음 unmute.sh (mute.sh의 반대쪽)를 시작에서 "x"초로 실행하도록 설정하십시오. 의심 할 여지없이 이것을 처리하는 많은 방법이 있습니다. 이 방법의 결과에 만족합니다.
루아 스 니펫 :
-- 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
음성 인식은 "유휴"상태에서 CPU의 약 12 %에 위치하며 인식 덩어리를 수행 할 때 잠깐 동안 급증합니다.
렌더링 할 때 음성 생성이 약 50-80 %로 급증합니다.
플레이 / 삭스는 무게가 무겁지만 렌더링 된 음색에 실시간 효과를 적용합니다.)
필 요하지 않은 서비스를 중지하고 완전한 CLI 모드에서 실행되는 모든 가이드를 사용하여 pi가 크게 제거되었습니다. 800MHz 오버 클럭 (최소)
scaling_governor가 성능으로 설정되었습니다.
완전 가동시 : 직사광선에서 약 50ºC, 그늘에서 38ºC에서 작동합니다. 방열판이 장착되어 있습니다.
마지막 요점 :이 모든 장비를 실제로 인터넷을 통해 AI에 추가 할 수있다.
pi는이 모든 것을 원활하게 처리하고 네트워크로 연결된 오디오를 실시간으로 재생하며 다른 루프 박스의 오디오를 다른 Unix 박스에 완벽하게 반복합니다. 기타
큰 음성 CPU 오버 헤드 부담을 처리하기 위해 md5sum 기반 캐싱 시스템을 구현하여 동일한 발언이 두 번 렌더링되지 않습니다. (총 220mb에서 약 1000 개의 파일이 AI에서 일반적으로받는 발화의 70 %를 차지합니다.) 이것은 전체 CPU로드를 전반적으로 낮추는 데 실제로 도움이됩니다.
précis에서 이것은 모두 완전히 가능합니다. 그러나 음성 인식은 마이크의 품질, 언어 모델, 주제가 음성을 원래 의도 한 청중에게 얼마나 가깝게 가깝게하는지 (완벽하지 않은 en_UK 어린이의 en_US 모델 사용) 및 기타 세부 사항만큼 우수합니다. 노력을 기울이면 괜찮은 결과를 얻을 수 있습니다.
그리고 기록을 위해, 나는 이미이 모든 것을 한 번 킨들에서 한 번했습니다. 도움이 되었기를 바랍니다.
예. 음성 인식에는 PocketSphinx 를 사용 하고 TTS (텍스트 음성 변환) 에는 Festvox 를 사용하고 라인 입력 기능이있는 일부 USB 오디오 (또는 라인 지원 기능이있는 오래된 지원 웹캠)를 사용하십시오.
Google은 이러한 소프트웨어 패키지를 검색하고 "Raspberry Pi"는이를 설정하기위한 많은 예제와 자습서를 제공합니다.
Lenik이 지적한 것처럼 어떻게 든 오디오를 녹음하거나 오디오 파일을 Raspberry Pi로 보내 어쨌든 디코딩 할 수 있어야합니다.
먼저 분류 프로세스에 사용할 단어 세트를 선택해야합니다. 그런 다음 사용자 / 대상에서 데이터를 수집해야합니다. 정지 신호입니다. 기능 추출 방법으로 계산 비용을 줄이거 나 성공률을 높이려면 데이터를 줄여야하므로 애플리케이션에 적합한 기능 추출 방법을 찾아야합니다. 이러한 방법 (평균 절대 값, RMS, 파형 길이, 제로 크로싱, 적분 절대 값, AR 계수, 중간 주파수, 평균 주파수 등)의 결과로 특징 벡터를 얻을 수 있습니다. 그런 다음 knn, 신경망 등과 같은 분류 방법을 사용하여 데이터를 분류해야합니다. 마지막으로 정확성을 확인해야합니다. 요약하면 :
인터넷에서 RPi를 사용하여 비디오 처리 프로젝트를 보았 으므로이 분류를 수행 할 수 있습니다.
아날로그 데이터 수집을 위해 NI 6009 USB DAQ (RPi를 지원)을 사용할 수 있지만 약간 비쌉니다.
스피커를 인식하는 데 유용 할 수 있습니다.