2012-03-20 4 views
3

나는 많은 것을했는데 내 문제를 해결하기 위해 많은 자원을 사용했지만 어떤 적절한 해결책을 얻지 못했습니다.사용자가 안드로이드에서 말하는 START & STOP을 인식하는 방법? (안드로이드에서 음성 인식)

저는 앱을 개발했습니다. 이제 음성 기반 기능을 추가하고 싶습니다.

필요한 기능이다

1) USER 말하기 시작할 때, 오디오/비디오

2) 사용자가 말을 멈출 때, 기록 된 오디오/비디오 재생해야 기록한다 .

참고 : 여기 비디오 란 사용자가 해당 기간 동안 앱 내에서 수행 한 모든 작업을 의미합니다. 예를 들어 버튼이나 애니메이션 등을 클릭하십시오.

Google의 음성 인식기은 Android에서 기본적으로 사용 가능하지만 인터넷이 필요하지만 내 앱은 오프라인으로 실행됩니다. 또한 CMU-Sphinx에 대해 알게되었습니다. 하지만 내 요구 사항에 따라 도움이되지 않습니다.

편집 : - 또한 , 나는이 사용하기 시작 & 정지 버튼을 달성하지만이 버튼을 사용하지 않는 것을 추가하고 싶습니다.

누구든지 아이디어 나 제안 사항이 있으면 알려 주시기 바랍니다. 이들의

+0

당신이 이것에 대한 해결책을 얻을 않았다 시간의 좋은 99 %를 작품으로 제로 횡단의 라인을 내려가는 권하고 싶습니다? –

+0

이것을 확인하십시오 [링크] (http://stackoverflow.com/a/18524276/3929188) 해결책 –

+0

해결책이 있습니까? – Ninja

답변

0

당신은 시작이/기능을 정지 트리거 할 수있는 수신기 구현에 ... 을, 내비게이션 등의 응용 프로그램 이벤트에 청취자를 추가하는 등 애니메이션을 클릭 시도 할 수 있습니다 ...

http://tseng-blog.nge-web.net/blog/2009/02/14/implementing-listeners-in-your-android-java-application/

보기 예를 들면 ...이 ....


당신에게 도움이 될 수 있지만, 수도는거야 톰 이야기처럼 재발견처럼 당신이 당신의 응용 프로그램 동작에 대해 설명하는 허 보이는 것이 궁금 메신저 ??? : -P

+0

답장을 보내 주셔서 감사합니다. 그러나 Voice Recognition에는 Listner가 있습니까? Talking Tom과 같은 음성 기능을 원합니다 ... – Prem

+0

"StartRec()"라는 메서드가 있다고 가정합니다. 액션리스트 선언에서이 메소드를 호출해야합니다. 'mainScreen.addListener ( ) 새 ClickListner() { startRec();});' 나는 당신이 android dev 사이트에서 찾을 수있는 listner 세부 사항에 대해 확실하지 않습니다. –

+0

그래, 내가 아는 모든 것. 그러나 목소리를 인식 할 수있는 방법이 있어야합니까? 앱이 사용자의 말하기를 어떻게 알 수 있습니까? 나는 그것을 알고 싶어한다. ...... – Prem

0

아래 코드는 정확히 동일한을 수행하는 iPhone 응용 프로그램에 사용하는 코드입니다. 이 코드는 Objective-C++에 있지만 많은 주석이 있습니다. 이 코드는 녹음 대기열의 콜백 함수 내에서 실행됩니다. 안드로이드 플랫폼에 대해서도 유사한 접근법이 존재할 것으로 확신합니다.

이 접근법은 제가 사용했던 거의 모든 음향 환경에서 아주 잘 작동하며, 우리의 응용 프로그램에서 사용됩니다. 원하는 경우 download it으로 테스트 할 수 있습니다.

Android 플랫폼에서 구현을 시도해보십시오!

// If there are some audio samples in the audio buffer of the recording queue 
if (inNumPackets > 0) { 
     // The following 4 lines of code are vector functions that compute 
     // the average power of the current audio samples. 
     // Go [here][2] to view documentation about them. 
     vDSP_vflt16((SInt16*)inBuffer->mAudioData, 1, aqr->currentFrameSamplesArray, 1, inNumPackets); 
     vDSP_vabs(aqr->currentFrameSamplesArray, 1, aqr->currentFrameSamplesArray, 1, inNumPackets); 
     vDSP_vsmul(aqr->currentFrameSamplesArray, 1, &aqr->divider, aqr->currentFrameSamplesArray, 1, inNumPackets); 
     vDSP_sve(aqr->currentFrameSamplesArray, 1, &aqr->instantPower, inNumPackets); 
     // InstantPower holds the energy for the current audio samples 
     aqr->instantPower /= (CGFloat)inNumPackets; 
     // S.O.S. Avoid +-infs, NaNs add a small number to InstantPower 
     aqr->instantPower = log10f(aqr->instantPower + 0.001f); 
     // InstantAvgPower holds the energy for a bigger window 
     // of time than InstantPower 
     aqr->instantAvgPower = aqr->instantAvgPower * 0.95f + 0.05f * aqr->instantPower; 
     // AvgPower holds the energy for an even bigger window 
     // of time than InstantAvgPower 
     aqr->avgPower = aqr->avgPower * 0.97f + 0.03f * aqr->instantAvgPower; 
     // This is the ratio that tells us when to record 
     CGFloat ratio = aqr->avgPower/aqr->instantPower; 
     // If we are not already writing to an audio file and 
     // the ratio is bigger than a specific hardcoded value 
     // (this value has to do with the quality of the microphone 
     // of the device. I have set it to 1.5 for an iPhone) then start writing! 
     if (!aqr->writeToFile && ratio > aqr->recordingThreshold) { 
      aqr->writeToFile = YES; 
     } 
     if (aqr->writeToFile) { 
      // write packets to file 
      XThrowIfError(AudioFileWritePackets(aqr->mRecordFile, FALSE, inBuffer->mAudioDataByteSize, 
               inPacketDesc, aqr->mRecordPacket, &inNumPackets, inBuffer->mAudioData), 
          "AudioFileWritePackets failed"); 
      aqr->mRecordPacket += inNumPackets; 
      // Now if we are recording but the instantAvgPower is lower 
      // than avgPower then we increase the countToStopRecording counter 
      if (aqr->instantAvgPower < aqr->avgPower) { 
       aqr->countToStopRecording++; 
      } 
      // or else set him to 0. 
      else { 
       aqr->countToStopRecording = 0; 
      } 
      // If we have detected that there is not enough power in 30 consecutive 
      // audio sample buffers OR we have recorded TOO much audio 
      // (the user speaks for more than a threshold of time) stop recording 
      if (aqr->countToStopRecording > 30 || aqr->mRecordPacket > kMaxAudioPacketsDuration) { 
       aqr->countToStopRecording = 0; 
       aqr->writeToFile = NO; 
       // Notify the audio player that we finished recording 
       // and start playing the audio!!! 
       dispatch_async(dispatch_get_main_queue(), ^{[[NSNotificationCenter defaultCenter] postNotificationName:@"RecordingEndedPlayNow" object:nil];}); 
      } 
     } 
    } 

최고!

+0

뭔가 빠졌습니까? 아니면 본질적으로 매우 복잡한 진폭 감지기입니까? (iPhone에서 현재의 진폭을 얻는 훨씬 쉬운 방법이 있습니다!) – Goz

+0

@Goz 나는 그것, 코드, 샘플, 문서에 대해 더 많이 말해주고 싶습니다. – Summon

+1

AudioQueueGetProperty (mAqr, kAudioQueueProperty_CurrentLevelMeterDB, & aqlms, & size); – Goz

2

오디오에서 가장 간단하고 가장 일반적인 방법은 count the number of zero crossings입니다 (즉, 기호가 양수에서 음수로 바뀔 때).

값이 너무 높으면 소리가 나지 않을 것입니다. 너무 낮 으면 다시 말하기가 어려울 것입니다.

간단한 에너지 수준 (얼마나 큰 소리인가)으로 결합하면 꽤 강력한 솔루션을 얻을 수 있습니다.

보다 정확한 시스템이 필요한 경우 훨씬 더 복잡해집니다. 한 가지 방법은 "훈련 데이터"에서 오디오 피쳐 (예 :)를 추출하고 과 같은 모델로 모델링 한 다음 GMM에 대해 실시간 오디오에서 추출한 기능을 테스트하는 것입니다. 이 방법을 사용하면 주어진 오디오 프레임이 비 음성에 비해 음성 인 가능성을 모델링 할 수 있습니다. 그러나 이것은 간단한 과정이 아닙니다.

내가 강력하게 구현하기 간단하고 :)

+0

나는 당신과 같은 전문가에게서 정답을 알게되어 정말 기쁩니다 ....하지만 나는이 소리 인식에 대해 많이 알지 못합니다. [그리고 내 답변에서 나는 많은 정보를 여기에서 얻습니다.] (http : //stackoverflow.com/questions/4659726/detect-the-beginning-of-a-sound-or-voice-in-android) – 5hssba

+1

@ Raju : 공정한 ... TBH 기능 모델링을하는 것은 믿을 수 없을 정도로 복잡합니다. 나는 그것을 스피커 인식 (즉, 주어진 사람을 말하기 인식)에 사용하고있다. 그게 정말로 간단하게 갈 수있는 무언가, 아아 :(내가 위에서 설명한 제로 - 교차 방법은 정말 간단하고 아름답게 작동합니다.내가 일반적인 연설을 모델링하는 것을 알고 그것에 가능성을 매치시키려는 시도가 훨씬 더 나은 해결책이지만 나는 일반적으로 단순히 연설자를 식별하기 위해 제로 크로싱을 구현할 것입니다. 구현하기가 쉽고 너무 많이 걱정할 필요가 없을 정도로 잘 작동합니다 : D – Goz

+0

흠 "나는 연사를 알아 낸다"고 말했다는 것을 깨달았다 ... 나는 "누군가가 말하고있는 것을 확인하는 것"을 의미했다. ... – Goz