从设计到开发,硅谷技术专家教你做“声控”APP
编者:本文为携程机票研发部技术专家祁一鸣在携程技术微分享中的分享内容,关注携程技术中心微信公号ctriptech,获知更多一手干货。
【携程技术微分享】是携程技术中心推出的线上公开分享课程,每月1-2期,采用目前最火热的直播形式,邀请携程技术人,面向广大程序猿和技术爱好者,一起探讨最新的技术热点,分享一线实战经验,畅谈精彩技术人生,搭建一个线上的技术分享社区。
祁一鸣,2016年4月加入携程, 任机票研发部技术专家。毕业于美国常春藤名校Dartmouth College本科,曾先后在硅谷的Oracle, Yahoo!和Salesforce总部效力过。从scratch到delivery完成过的最成功的产品是年销售额超1亿美金的商业社区网站模板。平时喜欢吃冰激凌和甜甜圈, 也蛮喜欢上海野兽派的花。
_____________________
在6月中刚刚结束的2016苹果全球开发者大会上, 人工智能助手Siri又一次成为焦点。Siri Intelligence不仅已被加入到快速输入功能和照片应用中,苹果还将在iOS 10版本中第一次开放Siri SDK给广大开发者们,使用户通过自己的声音与各种iOS APP互动成为可能。
此次让我们在携程技术微分享中先睹为快,看看如何模拟Siri智能来设计并开发一款搜索和试听iTunes音乐的手机App。
分享内容分为上下两部分。上半部分以设计为主,我们将一起了解Siri SDK在iOS10中给用户带来的新功能,回顾了人工智能的发展史,并一起用Sketch和Principle两款工具设计声控音乐APP的页面和交互。
下半部分以开发为主,用Xcode和Objective-C来实现APP页面开发。同时将用一款全新的移动端软件开发工具包资源来做语音识别,将我们想听歌曲的名字从声音转化成文字。之后,通过苹果iTtunes搜索API接口来获取歌名的专辑图片和歌曲试听资源。最后,将这些资源整合在一起,用精细的UI动画效果来开发完成这款声控音乐APP。
一起来体验下自己完整做件产品的快乐吧~
设计部分
将用到的设计工具包括Sketch和Principle。
Sketch (http://sketchapp.com/)是一款专为产品和UI设计师量身定做的设计工具, 它在2015在设计工具中被评为APP of the Year. 比起传统型的photoshop设计工具, Sketch更加轻量灵活,且价格便宜 。

我们先用Sketch绘制声控APP的第一个页面和第二个页面的prototype。 包括用Sketch自带的iOS UI Design 模板添加status bar, 用Sketch自带的绘图工具添加文字Label, 背景形状图案,图片。

之后, 我们在Principle里导入 用Sketch设计的两张页面。 Principle是一款实现每个设计页面之间动画衔接的工具。它可以直接import Sketch设计稿,在设计稿页面之上添加丰富的动画。 作为一款业界有名的设计动画工具, Principle在硅谷也是被设计师们广泛使用的。

首先我们在Principle里复制一张和设计稿第一页显示一模一样的 Artboard放在第一页之后。 当用户点击第一页中的麦克风图标之后,Principle将自动跳转到第二页, 我们对相应的提示文案做修改, 并实现一个新的动画:在第一页点击麦克风后,第二页的麦克风将围绕着图标中心旋转, 以此作为APP正在倾听用户声音的提示。 最后,当麦克风旋转的动画结束后,再添加一个自动跳转到第三页的动画,让用户看到搜索到音乐。三个页面的衔接如下图。

实现的动画可以从以下的gif中看到。

至此, 我们用Sketch和 Principle完成了一款“声控”APP的原型prototype以及页面交互设计。 主流程是, 用户用手tap麦克风, 麦克风旋转加上页面文案提示 告知用户APP正在倾听用户声音, 当APP解析到用户声音并找到相关的歌曲以后, 将跳转到下一页显示歌曲的专辑图片以及播放一段音乐的节选。
开发部分
完成设计之后,我们将更换装备,用Xcode和Objective-C来开发这款 智能音乐APP 。我们将使用一款全新的移动端软件开发工具包资源来做语音识别,将我们想听歌曲的名字从声音转化成文字。之后,通过苹果的音乐搜索API接口来获取歌名的专辑图片和歌曲试听资源。
开发完成以后的project结构如下:

首先来介绍 在APP中如何实现 智能识别用户语音的功能。 语音识别是人工智能应用广泛的一个领域。在众多已有科技中, 我选择了使用Nuance Speech Kit 2 的iOS SDK来实现APP中的功能。SpeechKit的具体使用指南可以在 https://developer.nuance.com/public/Help/DragonMobileSDKReference_iOS/Overview.html 中找到。在这个Xcode project中, 我们会用 CocoaPods (https://cocoapods.org/)来维护工程依赖。在Project的目录下, 新建一个名为 Podfile 文件, 然后在Podfile里添加一行
pod ‘SpeechKit’
保存文件后, 在本地App目录下, 执行命令
pod install
安装成功后,打开 .xcworkspace 工程 可以直接通过以下的import语句来使用SpeechKit
#import <SpeechKit/SpeechKit.h>
安装成功后, 还需要在Nuance 的官网上注册一个开发者账号, 得到访问服务器的URL地址以及一个APP KEY,在之后调用云端的语音识别服务时会用到。
在下面的代码中, 将SKSServerUrl和SKSAppKey 替换成你账号里显示的数值。 这段代码起到的作用就是建立一个语音识别的session, 然后开始一个transaction去做automatic speech recognition识别手机设备听到的语音:

Transaction成功以后的delegate回调方法里,我们只需获取recognition 参数里的最佳text推荐, 它便是对语音识别出最好的文字。

识别了语音之后, 我们接下来要做的便是去获取与识别文字相关的音乐了。 苹果自己就有这样的公共接口可以让我们使用。
https://itunes.apple.com/search?term=牛仔很忙
假设我对着APP说出了一首周杰伦的歌 “牛仔很忙”, 那么通过HTTP调用以上的url的发一个GET请求, 苹果就会通过搜索iTunes音乐库里返回所有的与“牛仔很忙”相关的所有音乐数据。
为了使demo的逻辑尽量简单, 我在之前的url里加上一个参数, 把返回的结果数量控制在一。
https://itunes.apple.com/search?term=牛仔很忙&limit=1
这样一来,我从仅返回的一首歌的数据里获取关于这首“牛仔很忙”歌曲的专辑图片地址以及试听歌曲地址, 再把这些数据拼凑起来,组成一张页面, 就有了我们在设计稿中看到的第三页。
至于每个页面中的动画交互,则是由基本的CABasicAnimation 来完成。例如, 麦克风图标的旋转动画的代码如下。

综合涉及的各个点,我们就开发完成了一款智能声控的音乐APP。两张Sketch设计稿, 三张Principle交互页面, 便有了这样一款娱乐的APP。 更多细节内容, 请大家移步观看视频。
从设计到开发,硅谷技术专家教你做“声控”APP的更多相关文章
- 手把手教你做个人 app
我们都知道,开发一个app很大程度依赖服务端:服务端提供接口数据,然后我们展示:另外,开发一个app,还需要美工协助切图.没了接口,没了美工,app似乎只能做成单机版或工具类app,真的是这样的吗?先 ...
- 【Android UI设计与开发】第05期:引导界面(五)实现应用程序只启动一次引导界面
[Android UI设计与开发]第05期:引导界面(五)实现应用程序只启动一次引导界面 jingqing 发表于 2013-7-11 14:42:02 浏览(229501) 这篇文章算是对整个引导界 ...
- HealthKit开发快速入门教程之HealthKit开发概述简介
HealthKit开发快速入门教程之HealthKit开发概述简介 2014年6月2日召开的年度开发者大会上,苹果发布了一款新的移动应用平台,可以收集和分析用户的健康数据.该移动应用平台被命名为“He ...
- 王家林的81门一站式云计算分布式大数据&移动互联网解决方案课程第14门课程:Android软硬整合设计与框架揭秘: HAL&Framework &Native Service &App&HTML5架构设计与实战开发
掌握Android从底层开发到框架整合技术到上层App开发及HTML5的全部技术: 一次彻底的Android架构.思想和实战技术的洗礼: 彻底掌握Andorid HAL.Android Runtime ...
- 《Spring_Four》第三次作业——基于Jsoup的大学生考试信息展示系统的原型设计与开发
<Spring_Four团队>第三次团队项目——基于Jsoup的大学生考试信息展示系统的原型设计与开发 一.实验目的与要求 (1)掌握软件原型开发技术: (2)学习使用软件原型开发工具:本 ...
- SharePoint 是哪些人设计、开发的?
闲下来的时候,我有时候会想:SharePoint 是哪些人设计.开发的? 毕竟,你说一个单选的字段,你从列表里面添加的时候,字段类型选的是 “Yes/No”:而如果你是通过编程把它加入列表的时候,字段 ...
- 基于 Angularjs&Node.js 云编辑器架构设计及开发实践
基于 Angularjs&Node.js 云编辑器架构设计及开发实践 一.产品背景 二.总体架构 1. 前端架构 a.前端层次 b.核心基础模块设计 c.业务模块设计 2. Node.js端设 ...
- 会员管理系统的设计和开发(2)-- RDLC报表的设计及动态加载
在上篇<会员管理系统的设计和开发(1)>介绍了关于会员系统的一些总体设计思路和要点,经过一段时间开发,软件终于完成并发布.在这期间,碰到了不少技术难点,并积累了不少开发心得和经验,本篇继续 ...
- HealthKit开发快速入门教程之HealthKit数据的操作
HealthKit开发快速入门教程之HealthKit数据的操作 数据的表示 在HealthKit中,数据是最核心的元素.通过分析数据,人们可以看到相关的健康信息.例如,通过统计步数数据,人们可以知道 ...
随机推荐
- kvm 简介
1. 基础概念 1.1 kvm整合入linux 内核: 1.2 kvm模型中,每一个虚拟机对于linux而言都是一个标准进程: 1.3 普通的linux进程有用户和内核两个空间,在kvm模型中定义了客 ...
- UWP?UWP! - Build 2015有些啥?(1)
UWP?UWP! - Build 2015有些啥? Build 2015圆满落幕了,不知大家有多少人刷夜看了直播呢?不管怎么说,想必各位都很好奇在这场微软开发者盛宴上,Microsoft又发布了什么令 ...
- 一个App完成入门篇(一)-从Hello world开始
程序员学习新技术都是通过Hello World开始的,我们也不例外.第一课我们简单了解利用do平台开发App的基本流程,能了解到的知识点是: 开发环境搭建 创建开发者账号 新建项目 拖拽一个组件 修改 ...
- 在cocos2dx和unity3d之间选择
人生最纠结的事,莫过于有选择………… cocos2dx和unity3d从某种意义上讲,都很不错.但当面对特定需求以及团队情况的时候,总是能分出高下的. 假设,目标游戏是一款类似 刀塔传奇 的游戏 我们 ...
- 使用后缀数组寻找最长公共子字符串JavaScript版
后缀数组很久很久以前就出现了,具体的概念读者自行搜索,小菜仅略知一二,不便讨论. 本文通过寻找两个字符串的最长公共子字符串,演示了后缀数组的经典应用. 首先需要说明,小菜实现的这个后缀数组算法,并非标 ...
- IOS Socket 05-XMPP开始&安装服务器openfire&安装配置客户端
1. 即时通讯技术简介(IM) 即时通讯技术(IM-Instant Messageing)支持用户在线实时交谈.如果要发送一条信息,用户需要打开一个小窗口,以便让用户及其朋友在其中输入信息并让交谈双方 ...
- DDD~领域事件中使用分布式事务
回到目录 对于一个聚合来说,它可能会被附加很多事件,这里我们叫它领域事务,因为一个聚会我们可以把它理解成一个领域,一个业务.对于领域事件不清楚的同学可以看看我的这篇文章<DDD~领域事件与事件总 ...
- salesforce 零基础学习(四十)Custom Settings简单使用
有时候,项目中我们需要设置类似白名单的功能,即某些用户或者某种Profile的用户不走一些校验或者走一些校验,这时,使用Custom Settings功能可以很好的解决这一需求. Custom Set ...
- D3.js 学习( 一)
<html> <head> <meta charset="utf-8"> <title>第三课:为柱形图添加坐标轴</titl ...
- C#教程(1) -- .Net与C#简介
(1).Net .Net指.Net平台或者是.Net Framework框架. 如果你把.Net平台想象成一个厨房,那么.Net Framework框架就是其中的柴米油盐酱醋茶. 如果你把.Net平台 ...