2016-02-11 49 views
52

当作为this answer by Iftah说我可以从意图越来越开放的由语音Recoginition android系统中记录的声音传递给获得意图:Android的实施RecognitionListener

@Override 
public void onActivityResult(int requestCode, int resultCode, Intent data) { 
    // the recording url is in getData: 
    Uri audioUri = data.getData(); 
} 

这里Intent data有什么我想要没有问题。

这一切都完美的作品,但是这种解决方案提出了一个提示的时候说话的用户,我不想这样,所以要解决这个问题,我让我的活动实施RecognitionListener像这样:

public class MainActivity extends AppCompatActivity implements RecognitionListener { 

    private SpeechRecognizer speech = null; 
    private Intent recognizerIntent; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     recognizerIntent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH); 
     recognizerIntent.putExtra(RecognizerIntent.EXTRA_LANGUAGE, "sv_SE"); 
     recognizerIntent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_PREFERENCE, "sv_SE"); 
     recognizerIntent.putExtra("android.speech.extra.GET_AUDIO_FORMAT", "audio/AMR"); 
     recognizerIntent.putExtra("android.speech.extra.GET_AUDIO", true); 

     speech = SpeechRecognizer.createSpeechRecognizer(this); 
     speech.setRecognitionListener(this); 
     speech.startListening(recognizerIntent); 
    } 

    @Override 
    public void onReadyForSpeech(Bundle params) { 
     Log.d("Debug", "On ready for speech"); 
    } 

    @Override 
    public void onBeginningOfSpeech() { 
     Log.d("Debug", "On beggining of speech"); 
    } 

    @Override 
    public void onRmsChanged(float rmsdB) { 
     Log.d("Debug", "Rsm changed"); 
    } 

    @Override 
    public void onBufferReceived(byte[] buffer) { 
     Log.d("Debug", "Buffer recieved"); 
    } 

    @Override 
    public void onEndOfSpeech() { 
     Log.d("Debug", "On end of speech"); 
    } 

    @Override 
    public void onError(int error) { 
     Log.d("Debug", "Error"); 
    } 

    @Override 
    public void onPartialResults(Bundle partialResults) { 
     Log.d("Debug", "On partial result"); 
    } 

    @Override 
    public void onEvent(int eventType, Bundle params) { 
     Log.d("Debug", "On event"); 
    } 

    @Override 
    public void onResults(Bundle results) { 
     Log.d("Debug", "On result"); 
    } 
} 

这得到各地提示hovewer我无法弄清楚如何获得乌里像在第一个例子,因为这里:

@Override 
    public void onResults(Bundle results) { 
     Log.d("Debug", "On result"); 
     // The results bundle don't contain the URI! 
    } 

我得到一个Bundle results不包含的意图或URI。我尝试过查看捆绑包中的所有密钥,并且没有URI或Intent存在,我也试过getIntent()但是不返回任何内容。

我感谢任何帮助或推动正确的方向。

+0

您的主要目的是获取Uri? –

+0

我用它从语音识别中检索音频,我知道这是一件麻烦事,但它是今天真正获得音频的唯一方法。我可以像第一个例子那样获得URI,这就是我自己实现RecognitionListener的时候,我似乎无法得到它。 – Fredrik

+0

我看了文档,并有一些更多的回调,它给语音缓冲区作为onBufferReceived(byte []缓冲区) –

回答

1

结果应与关键字SpeechRecognizer.RESULTS_RECOGNITION捆绑在一起。

@Override 
public void onResults(Bundle results) { 
    if (results != null && results.containsKey(SpeechRecognizer.RESULTS_RECOGNITION)) { 
     List<String> resultsList = results.getStringArrayList(SpeechRecognizer.RESULTS_RECOGNITION); 
     // most likely result is resultsList.get(0) 
    } else { 
     // no results 
    } 

} 

请参阅SpeechRecognizer的Android开发者文档详细解释它。这种获取语音识别结果的方法也适用于部分结果#onPartialResults

+0

这应该是被接受的anwser,请参阅[在线文档](https://developer.android.com/reference/android/speech/SpeechRecognizer.html#RESULTS_RECOGNITION) –

+0

没有当我问这个问题时,我是在实际的音频后语音识别,这是问题,我不明白这是如何解决这个问题。 – Fredrik

+0

而这段时间以前,我并没有真正的环境或代码设置来测试它。但是如果有人可以确认这实际上是在没有用户提示的情况下获得音频和语音识别的结果,那么我会将其标记为接受的答案。 – Fredrik