11

在 android 4.1 中,您可以使用键盘上的麦克风选项进行实时语音到文本的转换。

我一直在查看android.speech的文档,试图找出如何为应用程序实现实时语音转文本。但是,唯一可以促进这一点的选项是“EXTRA_PARTIAL_RESULTS”选项(每次我尝试使用它时服务器都会忽略它)。

编码:

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, "VoiceIME");
intent.putExtra(RecognizerIntent.EXTRA_PARTIAL_RESULTS, true);
intent.putExtra(RecognizerIntent.EXTRA_SPEECH_INPUT_MINIMUM_LENGTH_MILLIS, 3000L);

mSpeaker.startListening(intent);

从不返回部分结果。

我知道这是可能的,因为键盘版本始终如一。有谁知道怎么做?

4

3 回答 3

4

在你打电话之前,startListening你需要注册onPartialResults-callback。需要注意的两个重要事项:

  • onPartialResultsAndroid API 未指定调用包的结构;
  • 并非每个语音识别器都支持此回调。

因此,您的代码将特定于 Google 语音搜索。

mSpeaker.setRecognitionListener(new RecognitionListener() {
  ...
  public void onPartialResults(Bundle partialResults) {
    // WARNING: The following is specific to Google Voice Search
    String[] results = 
      partialResults.getStringArray("com.google.android.voicesearch.UNSUPPORTED_PARTIAL_RESULTS");
    updateTheUi(results);
  }
  ...
}

要在开源应用程序中查看此回调,请参阅 Babble:

于 2012-12-24T12:05:13.520 回答
0

如果您希望在麦克风打开时显示实时部分结果,而扬声器正在说话,您可能希望放弃使用识别器意图的方法并放弃识别服务,转而使用简单的 android 文本框并结合事先选择“麦克风” ' 图标,就像你可以在 android 'notes' 示例应用程序中做的那样......

见 ./samples/android-16/NotePad/tests/src/com/example/android/notepad

这个组合提供的功能就像您实时看到部分文本来自语音的结果,因为它们从服务器端“voiceSearch”返回,这与“recognizer”在“部分”回调方面有所不同。

许多评论指出,recognizerIntent 不会触发对“onPartialResults”的回调。出于某种原因,android 4.2 似乎不支持使用 javascript 可以正常工作的“连续”语音识别模式。我在 4.2 上对“RecognitionListener”接口的测试显示,在音量事件上对“onRmsChanged”有数百个回调,但在“partialResult”事件上的活动为零。某处,这个回调丢失了??

对于 js 解决方案,安装 chrome-beta 版本 25 并转到此处

使用安卓笔记应用程序。示例并从键盘预先选择麦克风图标,您可以执行与上面的 JS webapp 链接完全相同的操作。

于 2013-02-19T15:57:54.057 回答
0

由于我们无法确定来自部分结果回调的 Bundle 的键名,因此使用它来找出它的内容:

public void onPartialResults(Bundle partialResults) {    
    String string = "Bundle{";
    for (String key : partialResults.keySet()) {
        string += " " + key + " => " + partialResults.get(key) + ";";
    } 
    Log.e("joshtag","onPartialResults"+string);
    //see the keynames in Logcat and extract partial reesults here
}
于 2016-07-13T13:02:08.477 回答