语音识别安卓应用

Posted

技术标签:

【中文标题】语音识别安卓应用【英文标题】:Speech Recognition Android App 【发布时间】:2012-03-08 21:15:30 【问题描述】:

我正在制作一个应用程序,它从用户那里获取命令并实时编写它。对我来说最好的选择是什么? sphinx 之类的第三方软件还是我应该使用内置的(android 语音识别)?

其次,我希望它实时书写,就像我说话时它开始书写一样?

【问题讨论】:

【参考方案1】:

您应该使用内置的 Android 语音识别。具体来说,您需要操作SpeechRecognier API,以便不会弹出对话框。

此外,不要期望 SpeechRecognizer 会返回 onPartialResults() 内的任何内容。它很少这样做。

您可以尝试使用 Sphinx,但其他开发人员似乎很难让它在 Android 上运行。也就是说,如果您希望应用在没有互联网连接的情况下运行,那么 sphinx 将是您唯一的选择。

这是您需要使用 SpeechRecognizer 的代码片段:

 public void recognizeDirectly(Intent recognizerIntent)
    
        // SpeechRecognizer requires EXTRA_CALLING_PACKAGE, so add if it's not
        // here
        if (!recognizerIntent.hasExtra(RecognizerIntent.EXTRA_CALLING_PACKAGE))
        
            recognizerIntent.putExtra(RecognizerIntent.EXTRA_CALLING_PACKAGE,
                    "com.dummy");
        
        SpeechRecognizer recognizer = getSpeechRecognizer();
        recognizer.startListening(recognizerIntent);
    

    @Override
    public void onResults(Bundle results)
    
        Log.d(TAG, "full results");
        receiveResults(results);
    

    @Override
    public void onPartialResults(Bundle partialResults)
    
        Log.d(TAG, "partial results");
        receiveResults(partialResults);
    

    /**
     * common method to process any results bundle from @link SpeechRecognizer
     */
    private void receiveResults(Bundle results)
    
        if ((results != null)
                && results.containsKey(SpeechRecognizer.RESULTS_RECOGNITION))
        
            List<String> heard =
                    results.getStringArrayList(SpeechRecognizer.RESULTS_RECOGNITION);
            float[] scores =
                    results.getFloatArray(SpeechRecognizer.CONFIDENCE_SCORES);
            receiveWhatWasHeard(heard, scores);
        
    

    @Override
    public void onError(int errorCode)
    
        recognitionFailure(errorCode);
    

    /**
     * stop the speech recognizer
     */
    @Override
    protected void onPause()
    
        if (getSpeechRecognizer() != null)
        
            getSpeechRecognizer().stopListening();
            getSpeechRecognizer().cancel();
            getSpeechRecognizer().destroy();
        
        super.onPause();
    

    /**
     * lazy initialize the speech recognizer
     */
    private SpeechRecognizer getSpeechRecognizer()
    
        if (recognizer == null)
        
            recognizer = SpeechRecognizer.createSpeechRecognizer(this);
            recognizer.setRecognitionListener(this);
        
        return recognizer;
    

    // other unused methods from RecognitionListener...

    @Override
    public void onReadyForSpeech(Bundle params)
    
        Log.d(TAG, "ready for speech " + params);
    

    @Override
    public void onEndOfSpeech()
    
    

【讨论】:

谢谢你先生..但我在android编程方面不太好..你能解释一下如何实现这段代码吗?我已经实现了出现对话的语音识别的普通代码。如何用这段代码替换它?在此先感谢:) 使用与对话版本相同的 Intent,但调用我的 identifyDirectly 方法。您还需要实现 receiveWhatWasHeard() 和 recognitionFailure() 来处理语音识别的结果。 谢谢你先生..我很高兴听到这个消息..我在写方向工作..我的应用程序的第一个任务现在完成了..谢谢你:) 先生,当我停止应用程序时,它给出了平均错误.. 03-12 15:35:21.142: E/ActivityThread(30248): Activity com.yawar.Main has leaked ServiceConnection android.speech.SpeechRecognizer $Connection@40669368 原来绑定在这里【参考方案2】:

gregm 是对的,但问题的主要“实时写入”部分没有得到回答。您需要添加额外的内容以表明您有兴趣获取部分结果:

在意图中添加额外内容对我有用

intent.putExtra(RecognizerIntent.EXTRA_PARTIAL_RESULTS, true);

警告:Partial 不仅会返回新内容,还会返回以前的内容。因此,您需要自己检查差异...

【讨论】:

以上是关于语音识别安卓应用的主要内容,如果未能解决你的问题,请参考以下文章

如何用Tensorflow开发一个简单的语音识别器

微软TTS5.1语音引擎(中文).msi怎么用?

语音识别简述

语音识别玩转语音识别 1 语音识别简介

语音识别以登录 Web 应用程序

语音识别技术的环节是啥