65.9K
CodeProject 正在变化。 阅读更多。
Home

如何编写您自己的 Siri 应用程序(移动助手应用程序)

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.72/5 (36投票s)

2013年6月15日

CPOL

10分钟阅读

viewsIcon

167223

downloadIcon

6079

本文将帮助您了解如何编写自己的Siri应用程序。

介绍 

本文将帮助您了解如何编写自己的Siri应用程序。去年,我曾负责开发一个Android版本的Siri应用程序。该应用现已完成,并已上架Google商店。我将尝试分享我在此过程中积累的经验。

什么是移动助手应用程序?

移动助手应用程序应包含以下功能:

  • 它应该是一个移动应用程序(Android、iOS、Windows Phone应用程序等),
  • 您可以提出书面或口头问题,
  • 您可以通过书面、口头、图形或活动形式得到问题的答复,
  • 它应该能够利用移动设备的各种功能,如麦克风、屏幕、GPS、互联网、扬声器以及您存储在设备上的信息。

移动助手应用程序可以做什么

移动助手应用程序可以实现许多功能。我开发的第一版移动助手应用程序只能理解和响应15个命令。现在,它可以理解和响应50多个命令。基本的命令类型应包括新闻、天气、设置闹钟和呼叫联系人。在我搜索移动市场上的移动助手时,我发现以上命令都是通用的。此外,您还可以将以下命令作为您移动助手的进阶命令列表的一部分。

  • 设置闹钟,
  • 获取新闻、天气、比赛得分、维基百科信息等,
  • 运行一个应用程序,
  • 打开媒体文件(视频、音乐),
  • 在Facebook或Twitter等平台上分享内容,
  • 读取/写入短信或电子邮件,
  • 阅读社交媒体上分享的一些信息流,
  • 查找最近的市场、药店、医院、餐厅等,
  • 呼叫某人,
  • 进行基本的数学计算,
  • 查询银行余额,
  • 向某人进行转账,
  • 查看最新的货币或股票行情,
  • 读取/设置日历,
  • 购买音乐会或旅行门票,
  • 等等。

其中一些命令类型只能通过与第三方公司集成来实现。例如,您可以与亚马逊或百思买集成,以便通过您的移动助手订购商品。

市场上的移动助手

市场上已知有超过60种移动助手。流行的有Siri和Google Voice Search。

以下是市场上移动助手和移动助手开发环境的列表:

  • Siri,
  • Google Voice Search,
  • Nuance Nina,
  • Dragon Mobile Assistant,
  • Angel Lexee,
  • AIVC,
  • Iris,
  • Skyvi,
  • EverFriends,
  • EasyLuncher,
  • Speaktoit,
  • Evi,
  • Turkcell Mobil Asistan(土耳其语)。

Siri和Google Voice Search是最受欢迎的,我将分享一些关于Nina、Lexee、Dragon Mobile Assistant和Turkcell Mobil Asistan的信息和视频链接。

Nuance Nina:Nuance公司为大型企业提供SDK,以开发他们自己的移动助手应用程序,该应用程序可用作客户服务应用程序。这是一个可以集成到iOS和Android应用程序中的SDK。您可以在其网站Meet Nina上获取更多信息。

我喜欢YouTube上介绍Nuance Nina的视频。

Lexee:Lexee是Angel Labs公司的移动助手。Lexee还提供了一个Web环境来创建您自己的移动助手。您可以通过此Web界面添加、更新和删除您的场景,而无需编码。Lexee的另一个亮点是分析工具,Angel Labs在分析工具方面表现出色。Lexee环境为专业人士提供了关于使用情况的各种报告和数据。

您可以通过此链接获取更多信息并观看视频。

Dragon Mobile Assistant:Dragon Mobile Assistant也是Nuance公司的产品。Dragon Mobile Assistant允许用户自然地说话,轻松访问广泛的内容并在手机上完成日常任务。您可以通过此链接获取更多信息。

您可以点击此处下载该应用程序并观看我最喜欢的移动助手视频。

Turkcell Mobil Asistan:Turkcell Mobil Asistan是Google Play上唯一的土耳其语移动助手。Turkcell是欧洲最大的GSM公司之一。通过此应用程序,您可以获得客户关怀服务,如您的电话账单明细、套餐信息。此外,您还可以询问一些关于新闻、天气、货币、伊斯坦布尔交通的信息。

要获取更多信息并下载Turkcell Mobil Asistan,请点击此处

移动助手中的技术

我希望以上信息能帮助您理解移动助手的基本概念。让我们来看看这些应用程序的一些技术要点。移动助手应用程序应具备以下技术:

  • 语音转文本(STT)引擎,
  • 文本转语音(TTS)引擎,
  • 标签(智能),
  • 降噪引擎,
  • 语音生物识别,
  • 语音压缩引擎,
  • 呼出UI。
  • STT:Speech2Text引擎应获取用户的语音,然后将其转换为文本。语音可以是音频文件或流。
  • TTS:Text2Speech引擎应将文本转换为语音。这对于用户在驾驶时能够听到响应非常重要。
  • 标签:STT生成的文本并不总是简单的。标签技术应该为文本打上标签,以表明用户通过语音想要什么。例如,用户询问明天应该穿什么,那么标签引擎就可以为该信息打上天气或日历信息标签。
  • 降噪引擎:用户的语音并不总是清晰的,周围可能会有一些噪音(例如,空调噪音)。降噪引擎应消除语音中的白噪音。
  • 语音生物识别:移动助手可以提供基于账户的信息,例如信用卡月度报告。因此,身份验证很重要,语音生物识别是其中一种身份验证方法。通过语音生物识别技术,移动助手可以验证您以执行系统操作。
  • 语音压缩引擎:如果您的助手运行缓慢,用户可能会很快放弃该应用程序,并通过输入文本来搜索网页。互联网通信非常重要,此外,事务的数据包大小也很重要。小数据包可以快速传输,结果也快速得到。因此,一个好的移动助手应用程序应该有一个语音压缩引擎。客户端应该快速将压缩后的语音发送到服务器。压缩与正常压缩不同,因为语音文件中重复的数据不多。G711可以选择作为压缩算法,选择它的原因之一是该算法不会丢失数据。
  • 呼出UI:服务器发送结果后,您应该播放音频,此外,您还应该在设备屏幕上的呼出框中显示一些信息。我建议您,使用原生组件可能会限制您的应用程序,如果您在原生应用程序的呼出框中使用基于Web的UI,可能会更方便。

移动助手的架构

移动设备和主服务器应该进行流式通信,因为用户不喜欢等待语音数据下载和缓慢的通信。速度快对于这个应用程序非常重要,因为如果速度快,用户会感觉更自然。用户会感觉自己是在与一个真正的代理或助手交谈。

当用户通过单击按钮从客户端提出问题时,客户端开始逐字节地将问题流式传输到主服务器。主服务器将数据发送到STT服务器,STT服务器查找语音的文本。文本被发送到主服务器,然后主服务器将文本发送到标签服务器以确定用户想要什么。标签服务器为请求创建一个标签。例如,“weather_info”。标签服务器将标签发送到主服务器,主服务器将标签发送到信息服务器,如果标签在发送信息服务器之前需要身份验证,则安全服务器会检查身份验证。最后,响应返回到主服务器,主服务器创建响应文本、响应图形和语音文本(通过与TTS服务器通信)并将响应类发送到移动设备。

信息服务器可以与第三方服务器通信,以获取一些未存储在信息服务器中的信息。安全服务器可以包含多种身份验证技术,例如语音生物识别、IMSI-IP Radius查找、账户-密码身份验证等。

呼出UI  

如果您尝试开发自己的原生呼出组件,将很难在客户端处理所有格式和滚动所有项目等。我建议您,可以创建一个自定义Web视图并轻松添加格式化的呼出内容。  

 左边的图片显示了您的SiriWebView  将如何在屏幕上显示。Web视图可以由用户滚动,此外,当新的呼出内容到来时,Web视图会自动移动。 
 

在本节中,我将简要介绍如何编写您自己的SiriWebView。在文章中,您还将找到关于Web视图的示例项目。抱歉,对于其他平台用户,我所有的示例都将在Android平台上。

首先,创建一个新类并命名为SiriWebView。它应该扩展自简单的Android WebView。该类应包含构造函数以及重写的OnDraw函数。此外,我们应该在此类中添加两个新函数,一个用于初始化它,另一个用于添加新的呼出内容。下面的代码片段显示了添加新呼出函数的工作方式。

public void AddNewCallOut(String message, Boolean ismsgResponse) {
		elementId = elementId + 1;
		StringBuilder messageBuilder = new StringBuilder();

		if (!message.contentEquals("")) {

			if (!ismsgResponse) {
				messageBuilder
						.append("<table class='bubble-gray' cellspacing='0' cellpadding='0'><tr><td class='head'></td></tr>");
				messageBuilder
						.append("<tr><td class='mid'><div class='txt shadow'>"
								+ message + "</div></td></tr>");
				messageBuilder
						.append("<tr><td class='foot'></td></tr></table>");
			} else {
				messageBuilder
						.append("<table class='bubble-blue' cellspacing='0' cellpadding='0'><tr><td class='bhead'></td></tr>");
				messageBuilder
						.append("<tr><td class='bmid'><div class='txt shadow'>"
								+ message + "</div></td></tr>");
				messageBuilder
						.append("<tr><td class='bfoot'></td></tr></table>");
			}

			loadUrl("javascript:document.getElementById(\"div" + elementId
					+ "\").innerHTML=\"" + messageBuilder.toString() + "\";");
		}
		StringBuilder jvscr = new StringBuilder();
		if (!ismsgResponse) {
			if (elementId != 1) {
				if (!ismsgResponse) {
					jvscr.append("var elem = document.getElementById('div"
							+ (elementId - 1)
							+ "');     var x = 0;     var y = 0;     while (elem != null) {         x += elem.offsetLeft;         y += elem.offsetTop;         elem = elem.offsetParent;     } ");
					jvscr.append("var endj=500; var i=window.scrollY; for(i=window.scrollY;i<y;i++){ var j=0; var a=0; for(j=0;j<endj;j++) {a=a+1; }  window.scrollTo(x, i); } ");
					loadUrl("javascript:" + jvscr.toString());
				}
			}
		}
	} 

该函数接受两个参数:message和isResponse。您可以将您的消息写成字符串,并在想要添加新的呼出内容时将isResponse参数设置为true。isResponse参数显示消息是否是助手的响应。该参数会改变呼出内容的颜色并控制滚动。函数的第一行可以看到elementId参数。ElementId对于对象的滑动很重要。 

 创建自己的组件后,您可以将其添加到main_activity.xml中,如下所示。

      <com.example.siriui.SiriWebView
          android:id="@+id/webview"
          android:layout_width="fill_parent"
          android:layout_height="fill_parent"
          android:keepScreenOn="true"
       	android:layout_marginTop="0dp"
       	android:layout_gravity="fill"
          android:layout_marginBottom="0dp"
          android:layout_marginLeft="0dp"
          android:layout_marginRight="0dp"
          android:scrollbars="horizontal"
           />  

 您可以在本文中找到此组件的工作示例。 

音频压缩 

音频压缩可减小音频数据的大小。压缩后的音频数据可以通过GSM网络更快地传输。压缩类型可以是损耗型和无损型。 

损耗型:该方法可以在编码过程中减少数据量。但是,保留的数据对于识别是可以接受的。损耗型方法的优点是数据可以更小。

无损型:通过此方法,音频可以在不损失其原始质量的情况下进行压缩。如果识别或录制工具没有任何降噪过程,这一点很重要。  

一些数据缩减不会直接影响语音数据的质量。简单来说,如果录制的音频数据将用于语音识别,那么对于语音识别无用的数据可以被减少。人类听觉的敏感度在20Hz-20KHz的可听频率范围内。范围之外的频率可以被移除。 

G.711:您可以使用G.711标准进行音频压缩。该压缩方法是无损的。它可以将您的数据压缩高达50%。您可以通过此链接下载G711.java的Java源代码( https://code.google.com/p/sipdroid/source/browse/trunk/src/org/sipdroid/media/G711.java?r=386 )。

其他可用的方法包括,MPEG-1 Layer III (MP3)、MPEG-1 Layer II Multichannel、MPEG-1 Layer I、AAC、HE-AAC、MPEG Surround 、MPEG-4 ALS、MPEG-4 SLS、MPEG-4 DST、MPEG-4 HVXC、MPEG-4 CELP、USAC、G.718、G.719、G.722、G.722.1、G.722.2、G.723、G.723.1、G.726、G.728、G.729、G.729.1、Speex、Vorbis、WMA、Codec2  。

 

修订历史  

我将添加关于压缩、流式传输、缓冲播放、呼出UI、标签、TTS和STT的示例代码片段,这些代码可以帮助程序员处理一些难点。

13/04/18:呼出UI已添加到文章中。  

13/11/30:音频压缩已添加到文章中。   

© . All rights reserved.