科大讯飞语音单线程运行

标签: 语音识别 科大讯飞
49人阅读 评论(0) 收藏 举报
先说一下这篇文章想要实现的功能:

    把语音识别和语音合成限制在一个线程运行


        我的初衷是想实现一个基于科大讯飞语音识别的类似于问答闯关的小Demo,即它来问我们来答他判断我们是否正确错误,然后给出回应。emmm,当然我这个也很low,也只是单纯的ABCD判断答案正确错误,如果你觉得不是你想要的可以自行绕路了。

        这里主要的问题就是科大讯飞的语音识别和语音合成不能够很好的分离的原因,也就是如果把识别的开始放在合成的前面,我们想的是可以让他把题目读完,然后再开始识别,想法逻辑没什么问题,但科大讯飞却不能直接这样完成,如果直接这样调用,识别并不会等待合成结束再开始,而是相当于开启了新的线程,他的识别会自动录入自己合成的内容,他们之间并不会相互阻塞。


这是自己尝试的方法:

1.使用主线程休眠来卡住后一个动作的开始。

        这个方法确实可行,但遇到了无法判断合成或者识别的时间,识别还好点,可以设置参数控制录音的总时长和休眠配合,倒是合成的时间无法判断而且合成对象的给出的isSpeaking()方法加while(){}不能卡住程序的执行,而且主活动休眠会让程序卡掉,过一会还会提示程序响应,很low,被迫放弃

失败


2.使用线程来分离。

        尝试从线程中用isSpeacking()来卡住线程,的确实现了想要的效果而且主活动不会停止,也就是界面不会卡掉,逼格就有了,可是一旦在线程里调用监听,APP就会挂掉

失败


3.使用Handler,在线程内部使用Handler.send(Message)来开启监听。

    这次APP的确是不挂了,但是特码的又开始说给自己听了,听说同启,while(){}卡不住合成了也

失败


解决方法:


        使用合成监听和识别监听的回调方法,在其中结束识别和合成的方法中,调用还类中持有的自定义接口中的方法,在调用开始合成和开始识别的前把里面的自定义接口的引用设置成我们想要用的动作的接口对象,用这种设定完成动作指向。

贴一下部分代码,希望可以给你以启发

 //默认的合成回调对象
    Speaker.SpeakCall speakCall = new Speaker.SpeakCall(){
        @Override
        public void speckfinish() {
            //需要执行的动作
        }
    };

具体的自定义接口和合成监听器的关系:

    //自定义的接口对象
    private SpeakCall mspeakcall;
   /**
    * 语音合成监听的回调接口
    */
    public interface SpeakCall{
        void speckfinish();
    }
    /**
     * 语音合成监听对象
     */
    private SynthesizerListener mTtsListener = new SynthesizerListener() {
        @Override
        public void onSpeakBegin() {}
        @Override
        public void onSpeakPaused() {}
        @Override
        public void onSpeakResumed() {}
        @Override
        public void onBufferProgress(int percent, int beginPos, int endPos, String info) {
            // TODO 缓冲的进度
            Log.i(TAG, "缓冲 : " + percent);
        }
        @Override
        public void onSpeakProgress(int percent, int beginPos, int endPos) {
            // TODO 说话的进度
            Log.i(TAG, "合成 : " + percent);
        }
        @Override
        public void onCompleted(SpeechError error) {
            if (error == null) {
                Log.i(TAG, "播放完成");
                if(null!=mspeakcall){
                    mspeakcall.speckfinish();
                }
            } else if (error != null) {
                showTip(error.getPlainDescription(true));
                Log.i(TAG, error.getPlainDescription(true));
            }
        }
        @Override
        public void onEvent(int eventType, int arg1, int arg2, Bundle obj) {
        }
    };


查看评论

科大讯飞语音开发包(TTS_SDK)

  • 2009年02月24日 18:41
  • 9.25MB
  • 下载

科大讯飞语音播报

当我们开发新闻客户端,电子书等阅读类app的时候要用到的一个功能--语音播报。这里给大家介绍的是科大讯飞的语音播报系统的接入。 注册过程和和其他第三方接入一样,按照提示操作就行了。...
  • liyan147
  • liyan147
  • 2016-10-10 17:24:54
  • 1509

配置科大讯飞语音转写sdk

导入还是像上一篇文章那样导入添加这个jar接下来需要在TestLfasr.java中填写如下内容在config.properties文件中,填写一下三项,注意不要多空格运行吧...
  • kylin370817
  • kylin370817
  • 2018-03-13 11:34:25
  • 63

科大讯飞语音开发示例

  • 2009年02月24日 18:43
  • 11.52MB
  • 下载

真人发音语音朗读软件工具 科大讯飞4.0 硬盘安装版

  • 2008年12月12日 19:55
  • 114KB
  • 下载

科大讯飞语音引擎3.0

  • 2016年03月17日 11:38
  • 27.27MB
  • 下载

讯飞语音唤醒示例源码

  • 2015年08月19日 11:59
  • 5.68MB
  • 下载

Android科大讯飞语音听写实现

首先去讯飞平台注册一个应用,因为要用到APPID这个字符串。其实查看一下官方文档更好,每个接口都有很详细的准备工作和代码使用说明。链接:https://www.xfyun.cn/在这里我就把准备工作再...
  • qq_31573745
  • qq_31573745
  • 2017-04-04 10:42:54
  • 241

讯飞语音——带你简单实现语音听写

功能描述         语音听写和语音合成都是较为基础也是最常使用的两个基本功能。         语音合成是将文本转化为语音说出来,就是读文章。         语音听写是什么呢?        ...
  • niaonao
  • niaonao
  • 2016-10-02 16:59:06
  • 9273

科大讯飞的语音听写文档 demo

  • 2016年10月14日 16:36
  • 16.55MB
  • 下载
    个人资料
    等级:
    访问量: 94
    积分: 50
    排名: 178万+
    文章分类
    文章存档