APP下载

穴位动态识别APP研发*

2020-11-25耿笑冉刘秀峰黄嘉健

医学信息学杂志 2020年9期
关键词:离线引擎经络

耿笑冉 刘秀峰 黄嘉健

(广州中医药大学医学信息工程学院 广州 510006)

1 引言

针灸是我国特有的治疗方法,是一种“内病外治”的医术,通过针灸治疗可起到疏通经络、调和阴阳、扶正祛邪的作用,是我国中医疗法的瑰宝。采用针灸疗法治疗疾病的过程中,要求行医者精准找到穴位。随着中医现代化和定量医学的不断推进,穴位需要有客观和量化的指标进行描述,其准确探测对于针灸学发展、分析与辨认相关信号都具有重要作用,因此人体穴位识别尤为重要。穴位不但可以治疗疾病,也可用来日常保健[1]。然而对于非专业人群来说,精确找到穴位比较困难,对穴位作用了解不够充分,很大程度上影响保健效果。对于针灸专业的大学生来说,穴位信息记忆十分重要,仅课上时间学习远远不够,课下仍需要辅助工具来复习。语言识别技术作为一种新兴的智能信息技术引起广泛关注和高度重视[2],它可以让机器“听懂”人的语言,人可以用语音来控制设备,极大地体现出人机交互的便利性。本研究使用语音识别技术,研究开发一款穴位动态识别的移动应用,将计算机技术与中医药学融合,对降低穴位寻找难度,普及穴位养生保健知识及帮助医学生记忆穴位信息有很好的实用价值,具有广阔应用前景。

2 需求分析

2.1 概述

主要实现以用户输入或语音识别展示穴位具体信息,如功效、主治等,通过与目标用户交流讨论,确定登录注册、手动输入检索穴位、语音识别穴位、收藏和笔记等功能,总体功能模块,见图1。

图1 总体功能模块

2.2 登录注册

每个APP必备功能,主要为掌握用户信息。用户需要输入手机号、年龄进行注册,注册完成即可登录,在一定时间内APP提供自动登录。

2.3 手动输入检索穴位

界面顶部提供手动查询按钮,用户可输入穴位名称进行查询,输入穴位名称时输入框下方会出现提示,通过智能联想功能使用户快速找到要查询的穴位。保存查询结果并在下次输入时显示,提供历史查询信息。

2.4 语音识别查询穴位

界面底部中央设置语音查询按钮,通过语音识别算法能够更准确地识别用户查询信息;用户输入语音时会有文字提示当前识别的结构,可通过上划屏幕取消语音操作。

2.5 收藏和笔记功能

主要针对大学生,查漏补缺,记忆穴位信息。用户可对不熟悉或者重要穴位进行收藏,有助于快速查看;对穴位重点难点做笔记,反复观看。为使信息同步保存,此两项功能登录才能使用。

3 系统设计

3.1 总体模块

整个系统由注册登录、搜索、收藏、笔记版块组成,APP具有语音指令搜索和界面输入指令搜索功能,按照功能模块的从属关系,自顶向下展示系统模块层次。对每个模块的功能拆分,见图2。

图2 系统模块层次

3.2 语音识别处理

3.2.1 在线与离线语音识别对比 语音识别处理本质上是一种模式识别匹配的过程,是机器通过识别和理解过程将语音信号转变成相应的文本或命令的技术[3]。语音听写包括在线和离线引擎两种。在线引擎需要使用网络,速度稍慢,产生一定流量,但有更好的识别效果。离线引擎不需要使用网络,识别速度更快,但需要使用离线的软件开发工具包(Software Development Kit,SDK)[4],两者区别,见表1。虽然对于识别多种语料,离线较在线引擎识别率稍低,但对于只需要特定字典、实现特定功能的需求来说,离线识别往往更有优势,小范围的识别率很高,且识

别速度快,无需联网等。本研究中APP只需要识别穴位或经络名称,因此使用离线识别方式。

表1 在线与离线语音识别区别

3.2.2 工具 目前有3个基于HMM 和N-Gram 模型的语音识别工具:CMU Sphinx、Kaldi 和HTK。其中Kaldi 和HTK 更适合部署在服务器端,部分商用语音识别模型在Kaldi 和 HTK 的基础上改进而来,而CMU 提供的多种框架属于较小型语音识别框架,经过不断改进,提供比较适合于安卓系统的开源框架PocketSphinx。由于APP基于安卓平台研发,因此使用开源框架PocketSphinx作为语音识别的训练初始模型。PocketSphinx 是小型嵌入式语音识别引擎,在Sphinx-2基础上修改、优化而来,是第1个开源面向嵌入式的中等词汇量连续语音识别项目,对于中小词汇量有很高的识别率和实时性[5],适合手持和嵌入式设备。

4 主要功能实现

4.1 穴位库查询

主要分为两种方式:用户在界面左端选择经络,找到该经络上的穴位;用户在界面顶端输入框输入经络或穴位,点击穴位即可显示穴位详情,主要实现代码如下:

public void onClick(View v) {switch (v.getId()){

case R.id.xueweiku_right_small_title:

String inputMessage = input.getText().toString();

Intent intent = new Intent(getActivity(), XueweiDescriptionActivi.class);

QueryDataBase queryDataBase = new QueryDataBase(input);

queryDataBase.getMessage();

String input = new ArrayList<>();

input.add(queryDataBase.getName());

intent.putExtra("input", inputMessage);

startActivity(intent);

break;

}

这段代码主要是用户在输入框输入信息,点击查询按钮,查询穴位数据库信息,返回查询结果并存到容器中,跳至信息展示界面。

4.2 语音识别

4.2.1 概述 用户通过语音说出查询的经络或具体穴位名称,经过语音识别模型的处理转换成文本,进而查询到穴位具体信息,不论是手动输入或者语音识别,都会在人体模型上进行相应标记,从数据库中查询到对应的经络穴位信息,反馈到信息详情界面。

4.2.2 获取语言模型 将识别的命令词编写成命令集,新建txt文件,编码采用utf-8格式,每个命令占一行,将文件上传,在线生成语言模型。

4.2.3 获取字典模型 利用CMU sphinx自带的中文字典,将语言模型的字根据字典添加对应的中文发音,字典模型的作用是使语音识别器记住中文发音。

4.2.4 获取声学模型 若采用sphinxtrain 训练声学模型会使识别系统对特定用户识别率高,而对其他用户识别率降低,因此利用pocketsphinx 自带的中文声学模型,即隐马尔可夫模型(Hidden Markov Model,HMM)。

4.2.5 将开源框架导入项目 将框架中 aars 和 models 导入项目,快速集成相关接口。为能够识别中文,新建一个存放中文语音模型的文件夹,再放入前面训练的普通话声学模型、语言模型和穴位名称处理过的文件。

4.2.6 调用获取识别器 初始化语音识别引擎指定必要的语言和字典模型所在路径,并设置存放的位置参数,开启语音收集监听器。初始化语音识别引擎代码如下:

private void setupRecognizer(File assetsDir) throws IOException {

recognizer = SpeechRecognizerSetup.defaultSetup()

.setAcousticModel(new File(assetsDir, "ptm-zh"))

.setDictionary(new File(assetsDir, "xuewei.dic"))

.setRawLogDir(assetsDir)

.getRecognizer();

recognizer.addListener(this);

实现开启语音识别功能,通过长按按钮触发长按事件,调用已导入项目中的语音识别引擎,识别结果显示在界面。开启语音识别功能代码如下:

public AudioRecordButton(final Context context, AttributeSet attrs){

setOnLongClickListener(new OnLongClickListener() {

@Override

public boolean onLongClick(View v) {

//开启语音识别引擎

PocketSphinxUtil.get(context).start();

isReady = true;

dialogManager.showDialog();

isSpeaking = true;}

4.3 收藏

为用户提供收藏穴位信息的功能,分为默认和自定义收藏两类,默认收藏是将用户收藏的信息按经络和时间顺序进行存储,使用户快速找到收藏信息;自定义收藏是根据用户需求,建立文件夹,将穴位信息放在文件夹中。采用ExpandableListView实现收藏信息的按类摆放,利用CardView实现卡片式的子项,通过Swipeistview对每个子项左滑显示删除按钮。部分代码如下:

Collection collection = new Collection();

collection.setXueweiName(input);

collection.save(new SaveListener() {

public void done(String s, BmobException e) {

if (e == null) {

Toast.makeText(XueweiDescriptionActivi.this, "收藏成功", Toast.LENGTH_SHORT).show();

}

else {

Toast.makeText(XueweiDescriptionActivi.this, "收藏失败", Toast.LENGTH_SHORT).show();

}

}

4.4 笔记

利用ListView实现对笔记的显示,左滑显示删除按钮,当用户写完笔记点击保存后会显示多条笔记,点击会跳转到笔记详细页面。部分代码如下:

public View getView(int position, View convertView, ViewGroup parent) {

if (convertView == null) {

convertView=LayoutInflater.from(context).inflate(R.layout.expandablelistview_children_item, parent, false);

}

5 系统测试

5.1 运行环境[6]

基于以上设计,实现基于安卓语音识别的针灸穴位动态识别APP。为验证该系统实用性,搭建系统运行环境并进行测试,测试设备为小米5sp,处理器为4核2.35GHZ,操作系统是Android 8.0.0。

5.2 语音识别功能

测试采用手太阴肺经和足太阴脾经穴位名称为关键词,每个关键词分别测试3次,为便于整理与统计,关键词测试顺序先分经络,再按一定顺序排列,共收集93个关键词语音样本,5人分别对其进行测试,结果正确率分别是90.6%、90.2%、89.7%、90.8%、91%。表明系统较为准确地捕获到用户语音输入信息,能够快速离线识别,实时显示结果,具有很好的实时性。

6 结语

本文详细介绍一款基于安卓平台和语音识别技术的穴位动态识别APP。测试结果表明该系统可较为准确地识别出用户语音信息。APP运用人体模型并具备收藏与笔记功能,生动形象,信息具体,帮助学生记忆穴位有关信息。

猜你喜欢

离线引擎经络
异步电机离线参数辨识方法
新海珠,新引擎,新活力!
浅谈ATC离线基础数据的准备
关于经络是一种细胞外基质通道的假说
FTGS轨道电路离线测试平台开发
4个表现自测经络是否畅通
离线富集-HPLC法同时测定氨咖黄敏胶囊中5种合成色素
三生 三大引擎齐发力
蓝谷: “涉蓝”新引擎
经络考证