《电子技术应用》
您所在的位置:首页 > 嵌入式技术 > 设计应用 > 基于Android系统的医院语音排队系统设计与实现
基于Android系统的医院语音排队系统设计与实现
2014年微型机与应用第16期
罗联财,霍朝宾,白 宇,丁宝忠
中国电子信息产业集团有限公司第六研究所,北京
摘要: 设计和实现了一款基于Android的语音排队系统。系统包括语音呼叫终端(Android系统)和医生控制端(基于Windows)两部分,它们之间通过Socket进行呼叫通信。系统很好地实现了两个终端之间的通信并实现语音呼叫,具有较强的实用价值和开发指导意义。
Abstract:
Key words :

  摘  要: 设计和实现了一款基于Android的语音排队系统。系统包括语音呼叫终端(Android系统)和医生控制端(基于Windows)两部分,它们之间通过Socket进行呼叫通信。系统很好地实现了两个终端之间的通信并实现语音呼叫,具有较强的实用价值和开发指导意义。

  关键词: 语音呼叫;Android系统;TTS语音合成;排队系统

  自2007年Google推出开源手机操作系统Android[1]以来,Android的应用开发一时风靡全球,各高科技领域应用都在向Android进军[2],各种基于Android系统的设备层出不穷。Android的盛行取决于其独特的优势:(1)开放性,Android是一款基于Linux内核的开源系统,对第三方应用开发完全开放,开发人员具有较大的自由度[3];(2)易开发,Android应用程序的开发采用Java语言,通过应用框架层提供的API[4],使开发简单、周期短;(3)免授权费,Android一直采用免授权费的策略,这让所有手持设备厂商都可以选择Android系统,这也是Android如此流行的很大原因之一,因为对这些厂商来说,采用安卓系统能够带来比WinCE更多的利润。

  排队系统(或称排队机)是一种综合运用计算机、网络、多媒体、通信控制的高新技术产品,以取代各类服务性窗口传统的由顾客站立排队的方式,改由计算机系统代替客户进行排队。该系统适用于各类窗口服务行业,已经广泛应用于金融、医院、电信以及各级政府对外服务窗口等行业[5]。虽然现在市场上已经出现各种各样的语音呼叫终端,但Android的出现及其广泛应用,特别是Android系统设备的普及化,使得设备成本大大下降,开发一个基于Android系统的语音呼叫系统很有实用意义。

1 现有语音排队系统综述

  随着语音合成技术的发展,语音排队系统已经发展很多年了,目前的语音呼叫系统中,根据系统的组成,可以分为两种应用类型:单纯语音呼叫盒和带显示屏的语音呼叫系统。

  其中语音呼叫盒通常由语音芯片合成声音,多应用于银行、邮政之类的集中排队叫号服务,这种盒子合成的声音比较慢,听起来一顿一顿的,用户感觉差,随着语音芯片技术的提高,以后有望做到一个更好的水平。

  语音呼叫系统除了一个声音呼叫以外,还带有一个显示终端,终端会显示当前叫号人员甚至下一个排队者的姓名或其他信息,通常用于医院等较为分散的排队叫号服务,方便用户在没有听到声音时看到排队信息。语音的屏显功能,有的直接后台带电脑主机,这样构成的成本较高;还有的利用分屏技术进行分屏显示,但总体下来成本也不低。

  总体而言,目前主要利用语音芯片合成声音的较多,随着语音呼叫的需求发展,需要更多发展真人语音合成服务,但受限于语音合成芯片的资源限制,从长远来看,需要将电脑级的语音合成技术带入到语音排队系统中。而目前的语音呼叫系统由于技术上的原因成本过高。随着Android设备的发展,有很多显示终端已经内置了Android系统,特别是Android系统对TTS语音合成的支持标准化,为开发新一代呼叫系统提供了可能,同时由于单一设备实现了显示与语音呼叫,有效地降低了设备成本。

2 基于Android系统的语音呼叫优势

  TTS(Text To Speech),即“从文本到语音”,是人机对话的一部分,让计算机能够说话。它是同时运用语言学和心理学的杰出之作,在内置芯片的支持下,通过神经网络的设计,把文字智能地转化为自然语音流。TTS技术对文本文件进行实时转换,转换时间之短可以秒计算。在其特有智能语音控制器作用下,文本输出的语音音律流畅,使得听者在听取信息时感觉自然,毫无机器语音输出的冷漠与生涩感。TTS语音合成技术即将覆盖国标一、二级汉字,具有英文接口,自动识别中、英文,支持中英文混读。所有声音采用真人普通话为标准发音,实现了120~150个汉字/s的快速语音合成,朗读速度达3~4个汉字/s,使用户可以听到清晰悦耳的音质和连贯流畅的语调。

  基于Android系统的语音呼叫有以下技术优势:

  (1)软件优势。Android1.6版本及之后的系统都默认安装了TTS引擎,这为开发基于Android系统的语音呼叫系统提供了可能。

  (2)硬件优势。现在已经有带Android系统的智能电视、智能显示器、电视机顶盒等硬件供开发使用,而且由于Android系统费用很低,做出来的产品比原来不带Android系统的产品功能上有很大提升,但成本增加很少。

  (3)可重用性高。基于Android的语音呼叫,如果硬件更换,例如从Android显示器换成Android电视机,由于都是基于Android系统,可能不经过修改就能直接使用。如果是Android系统版本变化过大(比如新发布版本的API更新过大),也可能只需要经过重新编译指定版本即可在新机器上使用,这为后续的开发部署提供了很大的便利,不会出现因为硬件变化而需要重新开发软件的问题。

3 系统架构

  整体而言,本系统采用Client/Server架构,医生客户端从排队服务器读取当前排队列表,由医生决定呼叫排队者,呼叫由Android呼叫终端完成。系统架构如图1所示[6]。

001.jpg

  图1中,每个阴影方块表示不同的房间号,一个房间有多个医生时,可以多个医生共用一个显示屏叫号。其中的呼叫终端,可以是带Android系统的智能电视,也可以是智能显示器甚至是机顶盒加显示器的配置。

  系统的整体流程简单明了,主要难点在于医生客户端与呼叫终端之间的联系,通过Socket通信实现了通信过程。

4 Android端软件实现

  本节主要讨论Android系统下的语音呼叫系统实现,主要包括呼叫服务建立和语音呼叫过程的实现。软件系统的主要程序流程图如图2所示。

002.jpg

  Thread服务创建很关键,通过它建立起Socket侦听线程与消息处理线程。在Android编程中,Thread的作用与Windows下的多线程编程作用一样,其目的是让主线程不至于“陷入”到消息等待中。

  4.1 Android服务进程建立

  在此,需要在Android系统上建立一个Socket服务器,用来与医生客户端建立连接,以完成呼叫信息的接收工作。

  在主界面的Create()过程中,建立一个线程mThreadServer用于侦听端口:

  mThreadServer=new Thread(mcreateRunnable);

  mThreadServer.start();

  其中的mcreateRunnable过程如下:

  //线程:监听服务器发来的消息

  private RunnablemcreateRunnable=new Runnable()

  {

  public void run()

  {

  try

  {

  serverSocket=new ServerSocket(5678);

  //方法用于等待客户连接

  mSocketServer=serverSocket.accept();

  //接受客户端数据

  new Thread( ServerRunnable).start();

  }

  catch (IOException e)

  {

  Message msg=new Message();

  msg.what=0;

  recvMessageServer="创建异常:"+e.getMes

  sage()+e.toString()+"\n";

  return;

  }

  }

  };

  在侦听线程完成建立之后,即完成了语音呼叫服务的建立,医生客户端就可以访问指定的端口与呼叫终端进行数据传输了。

  4.2 Android语音呼叫实现

  在Android系统下,由于已经有了标准化的TTS语音呼叫引擎,完成一个语音呼叫的过程显得非常容易,只需要根据Google提供的标准化API就能完成呼叫服务。

  使用系统提供的TTS引擎,可以使用TextToSpeech类来执行TTS操作,或者用setEngineByPackageName()方法来自定义一个引擎。在Android4.0后可以通过一个新的TextToSpeech的构造方法来指定引擎,该方法接收一个TTS引擎的包名。还可以通过getEngines()来查询可用的TTS引擎,这个方法返回一个TextToSpeech.EngineInfo对象的集合,该对象包含引擎的图标、标签和包名等信息。

  通过如下过程完成语音引擎的初始化:

  if (status==TextToSpeech.SUCCESS){

  int result=mTts.setLanguage(Locale.CHINESE);

  if(result==TextToSpeech.LANG_MISSING_DATA

  ||result==TextToSpeech.

  LANG_NOT_SUPPORTED)

  {

  Log.e(TAG,"初始化成功,但是找不到语言包");

  //TODO安装语言安装包

  }

  }

  引擎初始化之后,就可以开始让引擎发音了:

  try {

  mTts.speak(mContent,TextToSpeech.QUEUE_FLUSH, null);

  } catch (Exception e) {

  e.printStackTrace();

  showToast("出错了~");

  }

  以上过程完成了一个语音引擎的初始化并读出从医生客户端中接收到的文本信息。

  图3是本系统实际使用的效果图。

003.jpg

  本文介绍了一个基于Android系统的医院语音呼叫系统的设计与实现过程,限于篇幅,本文实现过程主要针对Android部分的实现,实际上还有医生客户端的实现。由于介绍在Windows端实现Socket通信的文献已经很多,本文不在此做过多赘述。

  本文设计实现的基于Android的语音呼叫系统在实际应用中取得了很好的效果。随着Android系统设备的大量普及,这种基于Android系统的语音呼叫终端因为系统成本低且使用可靠,一定会得到推广使用。

  参考文献

  [1] 刘安战,贾晓辉.基于Android的私密短信系统设计与实现[J].微型机与应用,2012,31(17):51-56.

  [2] 周时伟,谢维波.基于Android的智能家居终端设计与实现[J].微型机与应用,2012,31(14):11-14.

  [3] 葛艳,高占江.基于Android系统的音乐播放器设计与实现[J].微型机与应用,2014,33(1):5-8.

  [4] 弋改珍,解争龙,张琨.基于Android的火车时刻表查询系统设计与实现[J].现代电子技术,2012,35(4):41-44.

  [5] 但成福,刘晓明.一种用排队论指导的CAN总线语音通信系统设计[J].电子技术应用,2013,39(2):22-25.

  [6] 曾建平,邵艳洁.Android系统架构及应用程序开发研究[J].微计算机信息,2011,27(9):1-3.


此内容为AET网站原创,未经授权禁止转载。