내 음성 인식 코드 작성 [닫기]


17

문제 설명

하드웨어 프로젝트의 일부로 음성 인식을 사용하고 싶습니다. 완전히 자체적으로 포함하고 싶습니다 (Arduino 및 Raspberry Pi와 같은 작은 저전력, 저속 장치, Kinects 등을 사용하고 있습니다. 운영 체제가 포함되어 있으므로 폐쇄 형 / 자체 포함 프로젝트).

정교함의 수준에 따라 음성 인식이 매우 복잡 할 수 있습니다. 나는 비교적 간단한 요구 사항을 믿습니다. 나는 내 자신의 목소리 만 인식하고 싶고 인식하고 싶은 단어 20 개 정도의 작은 사전을 가지고 있습니다. 따라서 복잡한 음성-텍스트 및 음성 인식 라이브러리 나 인터넷 검색 엔진을 통해 찾은 우수한 타사 소프트웨어가 필요하지 않습니다 (이 부족하지 않습니다!). 내 요구 사항이 "단순"(이유 내에서) 내 솔루션을 코딩 할 수 있다고 생각합니다. 누군가가 이와 같은 자체 프로세스를 작성했는지 궁금합니다. 내 방법에 큰 결함이 있습니까? 높은 수준의 수학이나 복잡한 알고리즘을 작성하지 않고도이 작업을 수행하는 더 좋은 방법이 있습니까? 그것이 내가 아래에서 생각하려고 한 해결책입니다.

솔루션 설명

나는 이것을 C로 작성할 것이지만 그 과정 자체에 중점을 둔 언어 불가지론 적 과정에 대해 논의하고 싶습니다. 우리가 할 수 있다면 그것을 무시하자.

1 . 나는 말하고있는 단어와 일치하도록 단어 사전을 미리 녹음 할 것입니다. 우리는 내가 20 개의 다른 단어들에 대한 20 개의 기록을 가지고 있거나 아마도 짧은 단어 나 두세 단어의 문장을 가지고 있다고 상상할 수 있습니다. 실제로 오디오를 텍스트로 변환하고 두 개의 문자열을 비교하는 것보다 두 개의 녹음 파일을 비교하는 프로세스가 더 쉬워집니다.

2. 내 코드를 실행하는 하드웨어 장치에 마이크가 연결되어 있습니다. [1]. 이 코드는 예를 들어 10msec 길이의 고정 길이 샘플을 지속적으로 가져오고 10 개의 연속 샘플을 순환 로깅 스타일로 저장합니다. [2]. (이 수치를 머리 꼭대기에서 발명하여 프로세스를 설명하는 예일뿐입니다).

[1] 사전 녹음과 마찬가지로 대역 통과 필터와 연산 증폭기를 통해 저장 및 수집 된 오디오 샘플을 더 작게 유지할 수 있습니다.

[2] 어떻게 샘플을 가져올 지 잘 모르겠습니다. 10msec 샘플의 오디오 (아마 CRC 값)를 나타내는 수치 (정수 / 부동 / 이중)를 생성했지만 방법을 찾아야합니다. 또는 오디오 샘플의 MD5 합계 등) 또는 그림 스트림 (주파수의 오디오 판독 스트림). 궁극적으로 "샘플"은 숫자 또는 숫자입니다. 이 부분은 훨씬 더 많은 하드웨어와 관련이 있으므로 여기서는 논의하지 않습니다.

삼 . 이 코드는 저장된 10 개의 연속 샘플을보고 단어 나 구가 말하고 있음을 나타 내기 위해 볼륨 증가를 찾습니다 (무음에서 분리). 그러면 증가는 예를 들어 500 개의 샘플을 말하는 연속 샘플 수집입니다. 즉, 10msec 샘플에서 5 초의 오디오를 캡처한다는 의미입니다.

저장된 사운드와 캡처 된 사운드를 비교하는 것은 이러한 샘플 또는 "슬라이스"입니다. 캡처 된 샘플의 비율이 충분히 높으면 저장된 샘플과 일치하는 경우 코드는 동일한 단어를 사용합니다.

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의 값과 샘플 일치 백분율 내에 있어야하는 총 샘플 수의 백분율 값이 다릅니다 코드는 쉽게 조정 가능한 수준의 정확도를 갖습니다.

나는 이전에 오디오로 이런 일을 한 적이 없었습니다. 많은 일이 될 수 있습니다. 이 질문에 대한 대답이 이미 명확하다는 것을 이미 알고 있다면 (이 답변이 무엇이든간에)이 질문을하는 이유입니다. 내가 사용할 하드웨어 중 일부가 초 초 수준이기 때문에 이것이 계산적으로 큰 작업이 아니길 바라고 있습니다. 수백 메가 헤르츠 (오버 클럭킹 Rasp Pi를 사용하는 1Ghz). 따라서 이것은 낮은 계산 능력을 사용하여 오디오 샘플을 일치시키는 다소 조잡한 방법입니다. 나는 즉각적인 결과를 목표로하지 않지만 적절한 개념 증명을 위해 30 초 미만을 목표로합니다.

추신 : 나는 "오디오", "오디오 인식", "음성", "음성 인식"등과 같은 새로운 태그로 태그를 지정하는 담당자가 없습니다.


17
VR은 꽤 복잡합니다. 현장에 대한 지식이없는 사람이 많은 독서없이 많은 진전을 이룰 수 있을지 의심됩니다. 알고리즘에서 가장 먼저 눈에 띄는 것은 단어의 속도에있어서의 차이를 처리하지 못한다는 것입니다. 단순한 VR조차도 몇 년이 걸렸습니다.
로봇 고트

4
과연. 수년간의 개발을 염두에 두지 않으면 타겟으로 컴파일 할 수있는 라이브러리를 살펴볼 수 있습니다. 나는 그들이 존재한다고 확신합니다.
Rig

6
추가 단계를 제안 할 것입니다-각 샘플을 푸리에 변환하십시오. 이를 통해 샘플을 직접 처리하지 않고 시간이 지남에 따라 각 오디오 주파수의 강도를 얻을 수 있습니다. 일반적으로 발화 할 수있는 모음의 합리적으로 일관된 기본 주파수가있을 것입니다. 오디오뿐만 아니라 말의 특정 특성을 살펴 봐야합니다. 다른 사람들이 말했듯이 이것은 어려운 작업입니다.
Paul Anderson

1
최종 제품에 사용할 수없는 경우에도 일부 음성 인식 라이브러리를 가지고 놀아 보는 것이 좋습니다. 개념 증명을 작성하는 데 유용합니다.
sav

답변:


3

글쎄, 나는 Arduino가 이것을 할 수있는 마력을 가지고 있다고 생각하지 않습니다. 16Mhz에서 작동 Arduino는 약 32K의 메모리를 가지고 있습니다. Mp3 (작고 wav보다 작음)로 샘플링 된 20 개의 단어조차도 자신의 목소리에도 불구하고 적합하지 않습니다.

rasberi pi는 트릭을 수행 할 수 있으며 512MB 메모리가있는 버전에 따라 700Mhz에서 작동합니다. 여전히 반죽이 많지 않습니다.

푸리에가 필요할 수 있습니다 ( http://www.drdobbs.com/cpp/a-simple-and-efficient-fft-implementatio/199500857 )

또는 부피를 사용하려면
x = (x + x [n-1] + x [n-2] + x [n-3]) / 4 // 와 같은 이전 샘플로 몇 가지 평균을 수행하십시오. 더 필요해

다음으로해야 할 일은이 X 값을 플로팅 할 것인지 생각하는 것입니다. 그런 다음 해당 라인의 경사 감지가 필요합니다. 볼륨을 기반으로 명령을 감지하면 거리에 크게 의존하기 때문에 패턴을 감지하고 싶을 때 단어들

그런 다음 패턴이 다른 시간에 맞도록 경사를 기록하는 방법에 약간 의존합니다. 컴퓨터가 맞출 수있는 정확한 템포로 말하지 않고 기울기가 약간 더 가파를 수 있습니다. 결국 나는 이것이 그 선이 얼마나 가파르고 길이 y 축이 약간의 평균 내에 있어야한다고 생각합니다.


1
  1. Arduino와 Raspberry Pi는 칩이 거의없는 프로토 타이핑 보드입니다. 먼저 칩에 집중해야합니다. DSP (digital signal processing) 툴박스가있는 것을 찾으십시오. 이미 DSP 툴박스가 있고 모르는 것 같습니다. DSP 툴박스에는 빠른 주파수 영역 분석을위한 fft (fast fourier transform) 및 ifft (inverse 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. "코드가 10msec와 같은 고정 길이 샘플을 지속적으로 취하고 있습니다"<- 부정확 한 방법 다음과 같이 생각하십시오. 코드는 초당 10000 샘플의 샘플링 속도로 양자화 된 (높이) 샘플을 개별적으로 가져 와서 각 샘플을 0.1ms 간격으로 만듭니다.

    샘플링 주파수는 얼마입니까? 양자화 기의 비트 전송률은 얼마입니까? 숫자가 작을수록 메모리를 확보하는 데 도움이됩니다. 초당 6600 개의 샘플 (Nyquist)과 같은 낮은 샘플링 속도를 제안합니다. 4 비트 (16 레벨)가 인식하기에 충분하다고 생각합니다. 따라서 초당 3300 바이트의 기록이 이루어집니다. 이제 fft를 수행하고 3300Hz (전화 필터) 이상의 모든 항목을 삭제하십시오. 이제 1 초의 사운드에 1650 바이트가 사용되었습니다. 이러한 DSP 트릭은 많은 메모리를 절약합니다.

    누가 512MB가 작다고 생각하는지 모르겠습니다. 위의 정보는 300,000 + 초 기록입니다 ... 3 일 이상 견고합니다.

  4. fft를 사용하여 주파수 영역을 음성 인식을 수행하기에 더 좋은 환경으로 생각합니다.

나는 당신을 더 혼란스럽게하지 않기를 바랍니다 :)

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.