2013-05-02 7 views
5

Ich arbeite an einer Android-Anwendung mit RecognizerIntent.ACTION_RECOGNIZE_SPEECH ,,, Mein Problem ist, dass ich nicht weiß, wie , um den Puffer, der die Stimme, die der Benutzer eingibt erfassen wird. i lesen Sie viel auf Stapelüberlauf, aber ich verstehe nur nicht, wie ich den Puffer und den Erkennungsdienst Rückruf in meinen Code einschließen werde. UND WIE WIRD ICH FÜR DIE INHALTE SPIELEN, DIE IM PUFFER GESPEICHERT WURDEN?Wie erstellt man BufferReceived(), um Sprache mit RecognizerIntent zu erfassen?

dies ist mein Code:

 public class Voice extends Activity implements OnClickListener { 
    byte[] sig = new byte[500000] ; 
    int sigPos = 0 ; 
     ListView lv; 
    static final int check =0; 
    protected static final String TAG = null; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 



    // TODO Auto-generated method stub 
    super.onCreate(savedInstanceState); 


    setContentView(R.layout.voice); 

    Intent intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH); 
     intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL, 
      RecognizerIntent.LANGUAGE_MODEL_FREE_FORM); 
    intent.putExtra(RecognizerIntent.EXTRA_CALLING_PACKAGE, 
      "com.domain.app"); 

    SpeechRecognizer recognizer = SpeechRecognizer 
      .createSpeechRecognizer(this.getApplicationContext()); 

    RecognitionListener listener = new RecognitionListener() { 

     @Override 
     public void onResults(Bundle results) { 
      ArrayList<String> voiceResults = results 
        .getStringArrayList(SpeechRecognizer.RESULTS_RECOGNITION); 
      if (voiceResults == null) { 
       Log.e(TAG, "No voice results"); 
      } else { 
       Log.d(TAG, "Printing matches: "); 
       for (String match : voiceResults) { 
        Log.d(TAG, match); 
       } 
      } 
     } 

     @Override 
     public void onReadyForSpeech(Bundle params) { 
      Log.d(TAG, "Ready for speech"); 
     } 

     @Override 
     public void onError(int error) { 
      Log.d(TAG, 
        "Error listening for speech: " + error); 
     } 

     @Override 
     public void onBeginningOfSpeech() { 
      Log.d(TAG, "Speech starting"); 
     } 

     @Override 
     public void onBufferReceived(byte[] buffer) { 
      // TODO Auto-generated method stub 
      TextView display=(TextView)findViewById (R.id.Text1); 
        display.setText("True"); 


       System.arraycopy(buffer, 0, sig, sigPos, buffer.length) ; 
       sigPos += buffer.length ; 

     } 

     @Override 
     public void onEndOfSpeech() { 
      // TODO Auto-generated method stub 

     } 

     @Override 
     public void onEvent(int eventType, Bundle params) { 
      // TODO Auto-generated method stub 

     } 

     @Override 
     public void onPartialResults(Bundle partialResults) { 
      // TODO Auto-generated method stub 

     } 

     @Override 
     public void onRmsChanged(float rmsdB) { 
      // TODO Auto-generated method stub 

     } 
    }; 
    recognizer.setRecognitionListener(listener); 
    recognizer.startListening(intent); 




    startActivityForResult(intent,check); 

} 

@Override 
public void onClick(View arg0) { 
    // TODO Auto-generated method stub 

} 



} 
+0

Sie brauchen 'startActivityForResult' +' onActivityResult' nicht, wenn Sie 'SpeechRecognizer' verwenden ... – Kaarel

+0

Seit ICS ist onBufferReceived nicht mehr aufgerufen.Sie können den Spracherkenner nicht verwenden und gleichzeitig Audio abrufen. –

Antwort

3

Der Android-Spracherkennung API (wie die API-Ebene 17) bietet keine zuverlässige Möglichkeit, Audio zu erfassen.

Sie können das "Empfangspuffer" Rückruf, aber beachten Sie, dass

RecognitionListener sagt über onBufferReceived:

Mehr Ton empfangen wurde. Der Zweck dieser Funktion ist es, geben Feedback an den Benutzer in Bezug auf die erfassten Audio. Es gibt keine Garantie, dass diese Methode aufgerufen wird.

Puffer: Ein Puffer, der eine Folge von 16-Bit-Big-Endian Ganzzahlen enthält, die einen Audiodatenstrom mit einem Kanal darstellen. Die Abtastrate ist implementierungsabhängig.

und RecognitionService.Callback sagt über bufferReceived:

Das Service sollte diese Methode aufrufen, wenn ein Ton empfangen wurde. Der Zweck dieser Funktion ist es, dem Benutzer eine Rückmeldung bezüglich des aufgenommenen Audios zu geben.

Puffer: Ein Puffer, der eine Folge von 16-Bit-Big-Endian Ganzzahlen enthält, die einen Audiodatenstrom mit einem Kanal darstellen. Die Abtastrate ist implementierungsabhängig.

Also dieser Rückruf ist für Feedback in Bezug auf das aufgenommene Audio-und nicht unbedingt das aufgenommene Audio selbst, das heißt vielleicht eine verkleinerte Version davon zur Visualisierung. Auch "es gibt keine Garantie, dass diese Methode aufgerufen wird", d. H. Die Google Voice-Suche stellt sie möglicherweise in Version 1 bereit, entscheidet sich dann jedoch, sie in Version 2 zu entfernen.

Beachten Sie auch, dass diese Methode während der Erkennung mehrfach aufgerufen werden kann. Es ist jedoch nicht dokumentiert, ob der Puffer den gesamten aufgezeichneten Ton oder nur den Ausschnitt seit dem letzten Aufruf darstellt. (Ich würde letzteres annehmen, aber Sie müssen es mit Ihrem Spracherkenner testen.)

Also, in Ihrer Implementierung sollten Sie den Puffer in eine globale Variable kopieren, z. in eine wav-Datei, sobald die Erkennung beendet ist.

+0

ok ,,, aber wo stelle ich den void pufferReceived (byte [] buffer) in meinen Code? @Kaarel –

+0

@HaneenBassam Sehen Sie sich den 2. Link in meiner Antwort an, hier finden Sie ein Beispiel für die Implementierung des Listeners. Im Rumpf von 'bufferReceived' können Sie den Byte-Puffer beliebig bearbeiten. – Kaarel

+0

bitte @kaarel ,,, wenn Sie meinen bearbeiteten Code sehen können ... ich habe den Puffer hinzugefügt, wie Sie sagten –