在好例子网,分享、交流、成长!
您当前所在位置:首页Java 开发实例Android平台开发 → android语音助手demo 示例源码

android语音助手demo 示例源码

Android平台开发

下载此实例
  • 开发语言:Java
  • 实例大小:10.05M
  • 下载次数:68
  • 浏览次数:2557
  • 发布时间:2017-12-27
  • 实例类别:Android平台开发
  • 发 布 人:jiaozhihao
  • 文件格式:.zip
  • 所需积分:1
 相关标签: Android 语音 demo

实例介绍

【实例简介】使用的是科大讯飞的android语音,能够实现在线语音拨打电话,语音发送短信(支持多次语音录入),语音打开应用,还有常见的应用查询,比如天气、油价(密钥可能过期了),同时添加了设置功...

【实例截图】


from clipboard


from clipboard

【核心代码】

package com.jju.howe.howeassistant.activity;

import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.text.TextUtils;
import android.util.Log;
import android.view.KeyEvent;
import android.view.View;
import android.view.Window;
import android.widget.TextView;
import android.widget.Toast;

import com.iflytek.cloud.ErrorCode;
import com.iflytek.cloud.InitListener;
import com.iflytek.cloud.SpeechConstant;
import com.iflytek.cloud.SpeechError;
import com.iflytek.cloud.SpeechSynthesizer;
import com.iflytek.cloud.SpeechUnderstander;
import com.iflytek.cloud.SpeechUnderstanderListener;
import com.iflytek.cloud.SpeechUtility;
import com.iflytek.cloud.SynthesizerListener;
import com.iflytek.cloud.UnderstanderResult;
import com.iflytek.sunflower.FlowerCollector;
import com.jju.howe.howeassistant.R;
import com.jju.howe.howeassistant.action.CallAction;
import com.jju.howe.howeassistant.action.CallView;
import com.jju.howe.howeassistant.action.MessageView;
import com.jju.howe.howeassistant.action.OpenAppAction;
import com.jju.howe.howeassistant.action.OpenQA;
import com.jju.howe.howeassistant.action.ScheduleCreate;
import com.jju.howe.howeassistant.action.ScheduleView;
import com.jju.howe.howeassistant.action.SearchAction;
import com.jju.howe.howeassistant.action.SearchApp;
import com.jju.howe.howeassistant.action.SearchWeather;
import com.jju.howe.howeassistant.action.SendMessage;
import com.jju.howe.howeassistant.bean.AnswerBean;
import com.jju.howe.howeassistant.bean.DataBean;
import com.jju.howe.howeassistant.bean.DatetimeBean;
import com.jju.howe.howeassistant.bean.MainBean;
import com.jju.howe.howeassistant.bean.ResultBean;
import com.jju.howe.howeassistant.bean.SlotsBean;
import com.jju.howe.howeassistant.util.JsonParser;

import java.util.Calendar;

public class MainActivity extends Activity implements View.OnClickListener {

    private static String TAG = MainActivity.class.getSimpleName();
    private MainBean mMainBean;
    private SpeechUnderstander mSpeechUnderstander;
    private Toast mToast;
    private TextView mAskText, mUnderstanderText;
    private HeartProgressBar heartProgressBar;
    private FiveLine mFiveLine;

    public static boolean service_flag = false;//表示是否在一项服务中
    public static String SRResult = "";    //识别结果

    // 语音合成对象
    private SpeechSynthesizer mTts;


    @SuppressLint("ShowToast")
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        setContentView(R.layout.activity_main);
        SpeechUtility.createUtility(this, SpeechConstant.APPID   "=58057ac8");

        // 初始化对象
        mSpeechUnderstander = SpeechUnderstander.createUnderstander(MainActivity.this, mSpeechUdrInitListener);

        mToast = Toast.makeText(MainActivity.this, "", Toast.LENGTH_SHORT);

        mTts = SpeechSynthesizer.createSynthesizer(MainActivity.this, mTtsInitListener);
        initLayout();
    }

    /**
     * 初始化Layout。
     */
    private void initLayout() {
        mAskText = (TextView) findViewById(R.id.tv_ask);
        mUnderstanderText = (TextView) findViewById(R.id.tv_answer);
        heartProgressBar = (HeartProgressBar) findViewById(R.id.progressBar);
        mFiveLine = (FiveLine) findViewById(R.id.fiveLine);

        mUnderstanderText.setText("我能帮您做什么吗?");
        speakAnswer("我能帮您做什么吗?");

        findViewById(R.id.start_understander).setOnClickListener(MainActivity.this);
    }

    int ret = 0;// 函数调用返回值

    @Override
    public void onClick(View view) {
        switch (view.getId()) {
            // 开始语音理解
            case R.id.start_understander:
                mFiveLine.setVisibility(View.INVISIBLE);
                heartProgressBar.start();
                mTts.stopSpeaking();

                if (mSpeechUnderstander.isUnderstanding()) {// 开始前检查状态
                    mSpeechUnderstander.stopUnderstanding();
                    //showTip("停止录音");
                }
                ret = mSpeechUnderstander.startUnderstanding(mSpeechUnderstanderListener);
                if (ret != 0) {
                    showTip("语义理解失败,错误码:"   ret);
                } else {
                    showTip("请开始说话…");
                }

                break;

        }
    }

    /**
     * 帮助
     */
    public void help(View view) {
        startActivity(new Intent(MainActivity.this, HelpActivity.class));
    }

    /**
     * 初始化监听器(语音到语义)。
     */
    private InitListener mSpeechUdrInitListener = new InitListener() {

        @Override
        public void onInit(int code) {
            Log.d(TAG, "speechUnderstanderListener init() code = "   code);
            if (code != ErrorCode.SUCCESS) {
                showTip("初始化失败,错误码:"   code);
            }
        }
    };
    /**
     * 初始化监听。
     */
    private InitListener mTtsInitListener = new InitListener() {
        @Override
        public void onInit(int code) {
            Log.d(TAG, "InitListener init() code = "   code);
            if (code != ErrorCode.SUCCESS) {
                showTip("初始化失败,错误码:"   code);
            }
        }
    };


    /**
     * 语义理解回调。
     */
    private SpeechUnderstanderListener mSpeechUnderstanderListener = new SpeechUnderstanderListener() {

        @Override
        public void onResult(final UnderstanderResult result) {
            if (null != result) {
                Log.d(TAG, result.getResultString());

                // 显示
                String text = result.getResultString();
                Log.e(TAG, text);
                mMainBean = JsonParser.parseIatResult(text);


                if (!TextUtils.isEmpty(text)) {
                    mAskText.setText(mMainBean.getText());
                    if (mMainBean.getRc() == 0) {
                        SRResult = mMainBean.getText();
                        judgeService();
                    } else {
                        mUnderstanderText.setText("我听不懂您说什么,亲爱的,下次可能我就明白了");
                        speakAnswer("我听不懂您说什么,亲爱的,下次可能我就明白了");
                    }
                }
            } else {
                showTip("识别结果不正确。");
            }
        }

        @Override
        public void onVolumeChanged(int volume, byte[] data) {
            //showTip("当前正在说话,音量大小:"   volume);
            Log.d(TAG, data.length   "");
        }

        @Override
        public void onEndOfSpeech() {
            // 此回调表示:检测到了语音的尾端点,已经进入识别过程,不再接受语音输入
            //showTip("结束说话");
            heartProgressBar.dismiss();
        }

        @Override
        public void onBeginOfSpeech() {
            // 此回调表示:sdk内部录音机已经准备好了,用户可以开始语音输入
            //showTip("开始说话");
        }

        @Override
        public void onError(SpeechError error) {
            showTip(error.getPlainDescription(true));
        }

        @Override
        public void onEvent(int eventType, int arg1, int arg2, Bundle obj) {
        }
    };

    /**
     * 合成回调监听。
     */
    private SynthesizerListener mTtsListener = new SynthesizerListener() {

        @Override
        public void onSpeakBegin() {
            //showTip("开始播放");
        }

        @Override
        public void onSpeakPaused() {
            //showTip("暂停播放");
        }

        @Override
        public void onSpeakResumed() {
            //showTip("继续播放");
        }

        @Override
        public void onBufferProgress(int percent, int beginPos, int endPos,
                                     String info) {
            // 合成进度
            //mPercentForBuffering = percent;
            //showTip(String.format(getString(R.string.tts_toast_format),
            //      mPercentForBuffering, mPercentForPlaying));
        }

        @Override
        public void onSpeakProgress(int percent, int beginPos, int endPos) {
            // 播放进度
            //mPercentForPlaying = percent;
            //showTip(String.format(getString(R.string.tts_toast_format),
            //       mPercentForBuffering, mPercentForPlaying));
        }

        @Override
        public void onCompleted(SpeechError error) {
            if (error == null) {
                //showTip("播放完成");
                mFiveLine.setVisibility(View.INVISIBLE);
            }
        }

        @Override
        public void onEvent(int eventType, int arg1, int arg2, Bundle obj) {
        }
    };

    public void speakAnswer(String text) {
        // 移动数据分析,收集开始合成事件
        FlowerCollector.onEvent(MainActivity.this, "tts_play");

        int code = mTts.startSpeaking(text, mTtsListener);
        mFiveLine.setVisibility(View.VISIBLE);
        mUnderstanderText.setText(text);
        if (code != ErrorCode.SUCCESS) {
            if (code == ErrorCode.ERROR_COMPONENT_NOT_INSTALLED) {
                //未安装则跳转到提示安装页面
                showTip("请安装语记!");
            } else {
                showTip("语音合成失败,错误码: "   code);
            }
        }
    }

    private void showTip(final String str) {
        mToast.setText(str);
        mToast.show();
    }


    //语义场景判断
    private void judgeService() {

        SRResult = null;
        String service = mMainBean.getService();
        String operation = mMainBean.getOperation();

        AnswerBean answerBean = new AnswerBean();
        SlotsBean slotsBean = new SlotsBean();
        DatetimeBean datetimeBean = new DatetimeBean();
        ResultBean resultBean = new ResultBean();
        DataBean dataBean = new DataBean();

        String date = "该天";

        if (mMainBean.getAnswer() != null) {
            answerBean = mMainBean.getAnswer();
        }


        if (mMainBean.getSemantic() != null) {
            if (mMainBean.getSemantic().getSlots() != null) {
                slotsBean = mMainBean.getSemantic().getSlots();
                if (mMainBean.getSemantic().getSlots().getDatetime() != null) {
                    datetimeBean = mMainBean.getSemantic().getSlots().getDatetime();
                }
            }
        }


        if (mMainBean.getData() != null) {
            if (mMainBean.getData().getResult() != null) {
                if (mMainBean.getSemantic().getSlots().getDatetime() != null) {
                    Calendar calendar = Calendar.getInstance();
                    int today = calendar.get(Calendar.DAY_OF_MONTH);
                    dataBean = mMainBean.getData();
                    String day = datetimeBean.getDate().substring(datetimeBean.getDate().length() - 2, datetimeBean.getDate().length());
                    if (day.equals("AY")) {
                        day = today   "";
                    }
                    int getday = Integer.parseInt(day);
                    int sub = getday - today;
                    resultBean = dataBean.getResult().get(sub);

                    if (sub == 0) {
                        date = "今天";
                    } else if (sub == 1) {
                        date = "明天";
                    } else if (sub == 2) {
                        date = "后天";
                    } else if (sub == 3) {
                        date = "大后天";
                    } else if (sub == 4) {
                        date = "四天后";
                    } else if (sub == 5) {
                        date = "五天后";
                    } else if (sub == 6) {
                        date = "六天后";
                    }
                }
            }

        }

        if (service_flag == false) {//如果不在一项服务中才进行服务的判断


            switch (service) {

                case "telephone":
                    switch (operation) {
                        case "CALL": {    //1打电话
                            //必要条件【电话号码code】
                            //可选条件【人名name】【类型category】【号码归属地location】【运营商operator】【号段head_num】【尾号tail_num】
                            //可由多个可选条件确定必要条件
                            CallAction callAction = new CallAction(slotsBean.getName(), slotsBean.getCode(), MainActivity.this);//目前可根据名字或电话号码拨打电话
                            callAction.start();
                            break;
                        }
                        case "VIEW": {    //2查看电话拨打记录
                            //必要条件无
                            //可选条件【未接电话】【已拨电话】【已接电话】
                            CallView callview = new CallView(this);
                            callview.start();
                            break;
                        }
                        default:
                            break;
                    }

                    break;
                case "message": {//2 短信相关服务

                    switch (operation) {

                        case "SEND": {//1发送短信
                            SendMessage sendMessage = new SendMessage(slotsBean.getName(), slotsBean.getCode(), slotsBean.getContent(), MainActivity.this);
                            sendMessage.start();
                            break;
                        }

                        case "VIEW": {//2查看发送短信页面

                            MessageView messageView = new MessageView(this);
                            messageView.start();
                            break;
                        }

                        default:
                            break;
                    }

                    break;
                }
                case "app": {//3 应用相关服务

                    switch (operation) {

                        case "LAUNCH": {//1打开应用
                            OpenAppAction openApp = new OpenAppAction(slotsBean.getName(), MainActivity.this);
                            openApp.start();
                            break;
                        }

                        case "QUERY": {//2应用中心搜索应用
                            SearchApp searchApp = new SearchApp(slotsBean.getName(), this);
                            searchApp.start();
                            break;
                        }

                        default:
                            break;

                    }
                    break;
                }

                case "websearch": {//5 搜索相关服务

                    switch (operation) {

                        case "QUERY": {//1搜索

                            SearchAction searchAction = new SearchAction(slotsBean.getKeywords(), MainActivity.this);
                            searchAction.Search();
                            break;
                        }

                        default:
                            break;

                    }

                    break;
                }

                case "faq": {//6 社区问答相关服务

                    switch (operation) {
                        case "ANSWER": {//1社区问答
                            OpenQA openQA = new OpenQA(answerBean.getText(), this);
                            openQA.start();
                            break;
                        }
                        default:
                            break;
                    }

                    break;

                }

                case "chat": {//7 聊天相关服务

                    switch (operation) {

                        case "ANSWER": {//1聊天模式

                            OpenQA openQA = new OpenQA(answerBean.getText(), this);
                            openQA.start();

                            break;
                        }

                        default:
                            break;
                    }

                    break;
                }

                case "openQA": {//8 智能问答相关服务

                    switch (operation) {

                        case "ANSWER": {//1智能问答

                            OpenQA openQA = new OpenQA(answerBean.getText(), this);
                            openQA.start();

                            break;
                        }

                        default:
                            break;
                    }

                    break;
                }

                case "baike": {//9 百科知识相关服务

                    switch (operation) {

                        case "ANSWER": {//1百科

                            OpenQA openQA = new OpenQA(answerBean.getText(), this);
                            openQA.start();

                            break;
                        }

                        default:
                            break;
                    }

                    break;
                }

                case "schedule": {//10 日程相关服务

                    switch (operation) {

                        case "CREATE": {//1创建日程/闹钟(直接跳转相应设置界面)

                            ScheduleCreate scheduleCreate = new ScheduleCreate(slotsBean.getName(), datetimeBean.getTime(), datetimeBean.getDate(), slotsBean.getContent(), this);
                            scheduleCreate.start();

                            break;
                        }

                        case "VIEW": {//1查看闹钟/日历(未实现)

                            ScheduleView scheduleView = new ScheduleView(slotsBean.getName(), datetimeBean.getTime(), datetimeBean.getDate(), slotsBean.getContent(), this);
                            scheduleView.start();
                            break;
                        }


                        default:
                            break;
                    }

                    break;
                }

                case "weather": {//11 天气相关服务

                    switch (operation) {

                        case "QUERY": {//1查询天气

                            SearchWeather searchWeather = new SearchWeather(date, resultBean.getCity(), resultBean.getSourceName(), resultBean.getDate(), resultBean.getWeather(), resultBean.getTempRange(), resultBean.getAirQuality(), resultBean.getWind(), resultBean.getHumidity(), resultBean.getWindLevel()   "", this);
                            searchWeather.start();

                            break;
                        }

                        default:
                            break;

                    }

                    break;
                }

                default:
                    mUnderstanderText.setText("我听不懂您说什么,亲爱的,下次可能我就明白了");
                    speakAnswer("我听不懂您说什么,亲爱的,下次可能我就明白了");
                    break;
            }
        }

    }

    /**
     * 双击退出
     *
     * @param keyCode
     * @param event
     * @return
     */
    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if (keyCode == KeyEvent.KEYCODE_BACK) {
            exit();
        }

        return false;
    }

    private long time = 0;

    public void exit() {
        if (System.currentTimeMillis() - time > 2000) {
            time = System.currentTimeMillis();
            showTip("再点击一次退出应用程序");
        } else {
            finish();
        }
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        // 退出时释放连接
        mSpeechUnderstander.cancel();
        mSpeechUnderstander.destroy();
        mTts.stopSpeaking();
        // 退出时释放连接
        mTts.destroy();

    }


    @Override
    protected void onResume() {
        //移动数据统计分析
        FlowerCollector.onResume(MainActivity.this);
        FlowerCollector.onPageStart(TAG);
        super.onResume();
    }

    @Override
    protected void onPause() {
        //移动数据统计分析
        FlowerCollector.onPageEnd(TAG);
        FlowerCollector.onPause(MainActivity.this);
        super.onPause();
    }


}

标签: Android 语音 demo

实例下载地址

android语音助手demo 示例源码

不能下载?内容有错? 点击这里报错 + 投诉 + 提问

好例子网口号:伸出你的我的手 — 分享

网友评论

第 1 楼 的发生以后告诉 发表于: 2018-05-04 16:21 19
你好,能提供一下官网的语义设置吗,谢谢!

支持(0) 盖楼(回复)

发表评论

(您的评论需要经过审核才能显示)

查看所有1条评论>>

小贴士

感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。

  • 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
  • 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
  • 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
  • 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。

关于好例子网

本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明

;
报警