语音离线命令词识别

来源:互联网 发布:java web 前后端分离 编辑:程序博客网 时间:2024/06/04 19:04

最近帮别人的车载系统整了一个小项目,分享一下最原始的Demo!

**说明:**XF的语音服务很多,类似提供语音服务的国内巨头还有百度!

客户需求:实现简单的语音控制指令【听音乐、暂停、下一首、上一曲、声音大一点、声音小一点】,程序入口:打开某某应用,嵌入到项目中实现TTS服务,人机交互。

如下简单的实现了命令控制,使用XF的离线命令词识别+TTS服务。

第一步:编写离线命令词文件,遵守它的语法规则
BNF文件如下:

#BNF+IAT 1.0 UTF-8;!grammar call;!slot <usOprate>;!slot <usAccess>;!slot <FuncTemp>;!slot <FuncModel>;!slot <ModelType>;!slot <acModel>;!start <acStart>;<acStart>:<Model>;<Model>: <ModelType>;<ModelType>:暂停!id(101)|上一曲!id(102)|下一曲!id(103)|关机!id(104)|大点声!id(105)|大声!id(106)|小点声!id(107)|小声!id(108)|后退!id(109)|天气!id(110)|天气!id(111)|唱首歌!id(112)|唱歌!id(113)|讲故事!id(114)|打开地图!id(115)|打电话!id(116)|打开相册!id(117)|音乐!id(118)|拍照!id(119)|QQ!id(120)|扣扣!id(121)|口口!id(122)|叩叩!id(123)|微信!id(124);

配上语法详解:
这里写图片描述

第二步:接口调用
封装XF的离线命令词识别和和TTS服务,基于接口的实现而已。当用户说的话是命令词的时候,就直接触发命令执行相关业务逻辑。系统始终监听声音。
采用多态思想,让抽象方法实现接口,使得具体运用时候可以不实现接口中所有的方法,而且在抽象类中实现想实现的方法,需要时候,直接用抽象类的实例直接调用就OK。
部分代码如下:

public interface IVoiceCommandListener {    // 打电话    void onCallSomebody();    // 打开的相册    void onViewPhoto();    // 我想听歌    void onPlayMusic();    // 查询天气命令    void onViewQQ();    // 拍照、照相    public void onTakePhoto();    // 微信    public void onViewWX();}
public abstract class VoiceCmdListener implements IVoiceCommandListener {    private Context mContext;    public VoiceCmdListener(Context context) {        mContext = context;    }    @Override    public void onCallSomebody() {        String pkg = "com.example.news.movenews";        String cls = "com.wxzh.news.MainActivity";        ComponentName componet = new ComponentName(pkg, cls);        Intent intent = new Intent();        intent.setComponent(componet);        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);        mContext.startActivity(intent);    }

实例化:

voiceCommandListener = new VoiceCmdListener(UnderstanderService.this) { };

直接调用抽象类中实现的方法:
voiceCommandListener.onPlayMusic();

这里写图片描述

此项目主要为最原始的测试的离线命令词+TTS服务的Demo,有非常大的借鉴的意义,项目已经运用到市场中去了。读者拿了之后直接更换资源即可测试,更改拓展项目。

项目下载地址
可参考前几天的demo,机器人语音系统的文章:
机器人语音系统项目

0 0
原创粉丝点击