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






4.72/5 (36投票s)
本文将帮助您了解如何编写自己的Siri应用程序。
介绍
本文将帮助您了解如何编写自己的Siri应用程序。去年,我曾负责开发一个Android版本的Siri应用程序。该应用现已完成,并已上架Google商店。我将尝试分享我在此过程中积累的经验。
什么是移动助手应用程序?
|
移动助手应用程序应包含以下功能:
|
移动助手应用程序可以做什么
移动助手应用程序可以实现许多功能。我开发的第一版移动助手应用程序只能理解和响应15个命令。现在,它可以理解和响应50多个命令。基本的命令类型应包括新闻、天气、设置闹钟和呼叫联系人。在我搜索移动市场上的移动助手时,我发现以上命令都是通用的。此外,您还可以将以下命令作为您移动助手的进阶命令列表的一部分。
- 设置闹钟,
- 获取新闻、天气、比赛得分、维基百科信息等,
- 运行一个应用程序,
- 打开媒体文件(视频、音乐),
- 在Facebook或Twitter等平台上分享内容,
- 读取/写入短信或电子邮件,
- 阅读社交媒体上分享的一些信息流,
- 查找最近的市场、药店、医院、餐厅等,
- 呼叫某人,
- 进行基本的数学计算,
- 查询银行余额,
- 向某人进行转账,
- 查看最新的货币或股票行情,
- 读取/设置日历,
- 购买音乐会或旅行门票,
- 等等。
其中一些命令类型只能通过与第三方公司集成来实现。例如,您可以与亚马逊或百思买集成,以便通过您的移动助手订购商品。
市场上的移动助手
市场上已知有超过60种移动助手。流行的有Siri和Google Voice Search。
以下是市场上移动助手和移动助手开发环境的列表:
|
|
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:音频压缩已添加到文章中。