重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
近期项目中有个需求就是要实现类似微信或者支付宝的收款时的语音播报功能,于是笔者就开始了漫长的踩坑之路。
创新互联建站坚持“要么做到,要么别承诺”的工作理念,服务领域包括:成都做网站、成都网站设计、企业官网、英文网站、手机端网站、网站推广等服务,满足客户于互联网时代的麻阳网站设计、移动媒体设计的需求,帮助企业找到有效的互联网解决方案。努力成为您成熟可靠的网络建设合作伙伴!
刚开始讨论实现方案时,安卓的小伙伴说可以使用WebSocket + 讯飞语音在线合成实现。于是最初的几天笔者自己也一直在这条路上走了很久,基本功能都已经实现了,项目在前台的时候,基本没问题。但是项目一进入后台大概半分钟的时间,就无法播报了。原因是iOS项目如果不做任何处理的话,在进入后台大概30s之后,程序就会进入类似休眠的状态,然后就不会再进行任何操作了
跟安卓的同事讨论之后,发现安卓有方法可以让程序一直在后台处于活跃状态,于是笔者也开始找寻保持项目后台运行的方法,大概有两种
在这里我们并没有发现,程序在后台收到推送时,作相应处理的方法,哪到底能不能收到推送后就进行处理呢?
iOS 10 之后 iOS推出了Notification Service Extension,我们可以在收到推送之后,通过这个Extension 我们可以有三十秒的时间来对这个推送进行处理
完成之后长这样
然后我们配置一下NotificationService
然后我们看下NotificationService.swift文件
在完成上述操作之后,再次收到推送的话,就会走NotificationService的逻辑了,可以打断点或者Log测试一下
需要注意的是 在推送的内容中 必须配置mutable-content字段,结构大致如下
做完上边的操作之后,我们可以知道什么时候去播报语音了,但是语音又要怎么去播报呢?
笔者这边也是试过几个方案,下边一一说来
笔者刚开始使用讯飞发现不行,然后又测试了系统自带的AVSpeech,发现也不好用,查资料才知道,苹果在近期的版本中,停用的在NotificationService中播放语音的功能,之前的某个版本应该可以这么操作。好吧,此方案Pass
既然不让我播,那我存起来总可以了吧,测试发现讯飞在线生成是可以的,也可以存到本地,但。。。是,UNMutableNotificationContent的sound好像只支持提前添加到项目中的文件,并不支持立即生成之后存到本地,然后再设置的功能。。。
笔者在项目中预先生成的文件如下(语音包通过百度语音开放平台在线生成 百度语音在下生成(拉到中间就有了) )
比如说我要播放“支付宝到账100元”,我就会发放多个通知,依次播放wx-pre,1,bai,yuan这几个语音,连贯起来就能达到要求
笔者能力有限,暂时想到的方法就是这个,有好的方法可以多多分享,沟通
object-c主要还是对c的扩张。。如果的c学的比较好。。那就比较好上手了,一般刚开始学习iOS的时候,要先学习c语言,但实际上开发中主要用oc, 实在觉得麻烦,就去参加个培训,主要看看学啥,技术的关键点在哪,然后自己再勇猛精进就可以了。
下载和安装,现在我们使用的最新版本是ibm viavoice9.1简体中文版,很多网站都有下载,大家可以用百度搜索,下载来的文件格式一般为iso镜像,所以要用虚拟光驱安装。软件的安装没有什么特别之处,一路下一步就行了,当然也可以在安装向导里修改安装信息,要注意的是一定要关闭杀毒软件,由于软件在安装过程中需要重起电脑,重起后还要继续安装,所以最好将杀毒软件的自动运行也暂时关闭。语音训练:这是使用viavoice最关键的一步,对于盲人来说也是难度最大的环节,如果顺利过了这一关,我们的工作也就完成了七八成了,剩下的软件操作其实并不复杂。程序安装完成后,程序自动开始运行,首先会出现一段语音提示,紧接着探出用户向导。要求输入用户名和选择音频设备,采用默认即可,如果有两块声卡就要选择其中之一。点下一步,探出音频设置向导,点击测试按钮,出现一段回放音乐,系统音量测试成功,下一步进入麦克风设置。选择头戴式麦克风,下一步,在音频输出设备的列表里仍然要选择头戴式麦克风。下一步,要求连接好麦克风,不用管它,继续下一步。开始测试麦克风,点测试即开始测试环境噪音,完成后在点下一步。这一部系统询问你是否有信号适配器,一定要选是,继续下一步。这时系统要调整麦克风音量。在测试过程中环境要保持安静,关闭音箱,带好耳麦,让读屏的声音从耳麦里发出,并且要将读屏的语速调到最慢,因为下面要跟随读屏朗读系统给出的语句。点击开始,读出系统给出的语句即可,这段文字可以用四六件切换来找到,其内容如下:"这里有一小段文章,您必须用正常、轻松的语调将其读出。请在段落与语句之间自然停顿。计算机将利用这一过程调整其音量。当这一过程完成以后,您会听到一小段结束提示音,系统将显示声音的品质。在听到这一小段提示音之前,您必须不断地重复这段文章。"这时可以用小键盘的加减号及点号[暂停]来控制跟读的速度及停顿。待出现声音提示在点下一步。现在就要开始创建个人语音模型了。这一步至关重要,会直接影响将来语音识别的效果。在点下一步语音模型的创建就真正开始了。系统要求你读出下面的文字,四六键切换到六可编辑文字处,tab键切换到开始按钮,点击及开始,用加减号配合点号跟随读屏朗读。如果系统跟不上你的朗读速度,便发出声音提示,此时就点击暂停,在点继续重复朗读。读完后系统提示正在处理请稍候。系统会进行语音训练,训练完毕后,最简单的语音模型就建立完毕了,当然可以想像得到,这样轻松建立起来的模型效果并不是很好。稍等片刻在点下一步。这一部是分析你的语音,以便让系统了解你的说话方式。选择开始录音单选按钮,继续下一步。在列表里选择一篇文章,四六键切换到十二可编辑文字处,tab键切换到开始按钮,点击开始,还是用加减号配合点号跟读,如果我们的说话没有被系统识别出来,屏幕上的文字就不会往下滚动,并发出声音提示。这时可以按加减号重复朗读,直到出现新的文字,才可以继续往下朗读。为了提高识别率,建议将列表中的四篇文章全部读完。读完文章以后点下一步。系统提示正在处理请稍候,等几分钟后点完成。到此,个人用户(语音模型)建立完毕,我们可以正式开始使用语音输入了。语音输入:语音训练及语音模型的建立虽然比较繁琐,但是软件的使用却非常简单。其功能只有声控命令和语音听写。在程序组中启动ibm viavoice语音中心,程序运行后在通知区域工具栏里出现viavoice的图标。我们首先要设置麦克风开关状态的热键,在停止语音输入时要立刻官麦,否则会出现大量的乱码、或发出错误命令导致不必要的麻烦。右键单击通知区域里的viavoice图标,在探出菜单里选用户选项,右光标,点viavoice选项。在探出的对话框中选启动选项卡,选中麦克风状态和发现问题时启动识别向导程序复选矿,要不老有识别向导跳出来捣乱。在21热键域无处加入快捷键。如果创建了几个用户,就要在用户选项卡里选择你自己创建的用户,否则识别效果会很差。其它选项涉及到高级设置,采用默认设置即可,带操作熟练后可在作改动。点确定关闭对话框。此时按下刚才设置的快捷键打开麦克风,[当然在菜单里也有这个命令],就进入了语音输入状态了。第一次使用会有语音提示。此时你就可以向计算机下达任何语音命令,让它为你做你想做的任何事情。想要了解当前有什么命令可用,只要说出当前命令及,就会调出当前可用命令。要了解当前帮助,就说学习内容,就会调出当前帮助。要想启动某个程序就说出启动某程序,例如想要启动大智慧,就说启动大智慧,大智慧就随即启动了。又如在ie里面,只要说出某个链接的名称即可进入该页面,说出任何菜单和按钮名称即可执行相应的命令,你说出收藏夹,收藏夹就立刻打开了,在说出收藏夹中网站的名称,就会打开该网站。viavoice支持几乎所有的已安装的或将要安装的应用程序的声控操作和直接听写。只要应用程序有文本编辑框就可以进行语音听写,但要先说直接听写,进入文字听写模式,结束听写后要说停止直接听写,回到命令输入模式。如在qq的聊天界面上,激活文本输入框,说出要输入的内容,即可在编辑框中自动写出相应的文字。不过初期使用识别的准确率不可能达到很高,需要进行一些手工修改,但是它有自学习功能,随着使用的增多,识别的准确率会越来越高。在进行听写时,请您使用连续语音,并注意同时口述标点符号和编排命令,比如句号,逗号和另起一段。尽量使用正常的节奏讲话,不要太快,也不要太慢。尽量不要吞音或者滑音,也不要故意拉长或者略读某些词语。尽量不要连读,也没有必要故意对某些音进行重读。开始时您会可能会讲话比较快。请耐心一点,放慢速度。过了一段时间之后,您就会发现完全可以在不损失准确率的情况下提高讲话速率。不要对着麦克风大声讲话,请使用尽量平和的语音。正确佩戴麦克风对语音识别率非常重要。请确认麦克风接收头(在海绵套的里面)离您的嘴角大约一个拇指的距离,并检查麦克风上的白点正对着您的嘴部。不要将海绵套拿走,它可以起过滤作用。 不要将麦克风正对您的嘴部,以防受呼吸影响。每次使用麦克风时请不要变动麦克风的位置,例如麦克风的距离时远时近。如果进行大量文字录入,建议使用系统自带的字处理程序[语音板]。说出听写到语音板,语音板随即启动。这是一个类似写字板的编辑工具,语音板拥有写字板的所有功能而且增加了听写能力。语音听写与其他应用程序中的直接听写的注意事项基本一致,要想执行语音命令,在听写过程中稍作停顿,说出菜单命令即可。值得注意的是纠错窗口的使用。 在听写的过程中,ViaVoice可能会发生误识。您可以用纠错窗口对误识词进行纠错,以便ViaVoice以后提高识别率;或者让ViaVoice分析您已有的文档,以便让ViaVoice熟悉您的措辞和行文方式。在口述一段文字以后,查找误识的词。如果要对某个词或短语进行纠错,先选中该词,然后说出纠错就会探出纠错窗口。如果正确的词已经位于候选词列表中,念出该词的序号。这一动作将纠正所选的词或短语。如果正确的词不在候选词列表中,你可以单击纠错窗口的文本编辑框,输入正确的词/短语。念纠错或者按回车进行确定。z在听写完一篇文章以后,建议用文档分析程序对刚写的文章进行分析,从而修正语言模型,提高识别率。
。。。。。。。
。。。。。。。
ios voip 推送---案例
java
php
验证.pem
。。。。。。。
注意⚠️ token 在 ahc 打包出来的是不一样的,切记
。1。。。。。。。。。。。。。。
如何生成.pem 证书 ,适用于PHP 。Java是.p12 证书
1、将之前生成的voip.cer SSL证书双击导入钥匙串
2、打开钥匙串访问,在证书中找到对应voip.cer生成的证书,右键导出并选择.p12格式,这里我们命名为voippush.p12,这里导出需要输入密码(随意输入,别忘记了)。
3、目前我们有两个文件,voip.cer SSL证书和voippush.p12私钥,新建文件夹命名为VoIP、并保存两个文件到VoIP文件夹。
4、把.cer的SSL证书转换为.pem文件,打开终端命令行cd到VoIP文件夹、执行以下命令
openssl x509 -in voip.cer -inform der -out VoiPCert.pem
5、把.p12私钥转换成.pem文件,执行以下命令(这里需要输入之前导出设置的密码)
openssl pkcs12 -nocerts -out VoIPKey.pem -in voippush.p12
6、再把生成的两个.pem整合到一个.pem文件中
cat VoiPCert.pem VoIPKey.pem ck.pem
最终生成的ck.pem文件一般就是服务器用来推送的。
但是我惊奇的发现,不管是对于生产pem,还是测试pem,这两个网址都可以进行验证
openssl s_client -connect gateway.sandbox.push.apple.com:2195 -cert ck.pem
openssl s_client -connect gateway.push.apple.com:2195 -cert apns-ck.pem
验证结果:
。2。。。。。。。。。。
后台使用的接口
开发接口:gateway.sandbox.push.apple.com:2195
发布接口:gateway.push.apple.com:2195
官网提供的是:
开发接口: api.development.push.apple.com:443
发布接口: api.push.apple.com:443
这两个接口都能使用一个是Socket连接的方式,一个是采用Http的方式
。3。。。。。。。。。。。
用终端命令行cd到我们的VoIP文件夹中(有5个证书),输入: php -f 文件名.php;
?php
$deviceToken = 'token'; //能通
//ck.pem密码
$pass ='******';
//消息内容
$message ='收到金额0.12元,来自支付宝扫码支付';
//数字
$badge =1;
$sound ='default';
$body =array();
$body['aps'] =array('alert'= $message);
//把数组数据转换为json数据
$payload = json_encode($body);
echostrlen($payload),"\r\n";
$ctx = stream_context_create([
'ssl'= [
'verify_peer' = false,
'verify_peer_name'= false
// 'cafile' = '/path/to/bundle/entrust_2048_ca.cer',
]
]);
// $pem = dirname(__FILE__) .'/'.'ck.pem';
stream_context_set_option($ctx,'ssl','local_cert','ck.pem');
stream_context_set_option($ctx,'ssl','passphrase', $pass);
// gateway.push.apple.com:2195 -- 正式环境
// gateway.sandbox.push.apple.com:2195 -- 开发环境
$fp = stream_socket_client('tls://gateway.push.apple.com:2195',$err,$errstr,60, STREAM_CLIENT_CONNECT|STREAM_CLIENT_PERSISTENT, $ctx);
if(!$fp) {
print "Failed to connect $err $errstr\n";
return;
}
else{
print "Connection OK\n
";
}
// send message
$msg = chr(0).pack("n",32).pack('H*', str_replace(' ','', $deviceToken)).pack("n",strlen($payload)).$payload;
print "Sending message :" . $payload . "\n";
fwrite($fp, $msg);
fclose($fp);
/*
35 Connection OK
Sending message :{"aps":{"alert":"A test message!"}}
*/
。补充。。。。。。。。。。。。。。
1、当app要上传App Store时,请在iTunes connect上传页面右下角备注中填写你用到VoIP推送的原因,附加上音视频呼叫用到VoIP推送功能的demo演示链接,演示demo必须提供呼出和呼入功能,demo我一般上传到优酷。
2、经过大量测试,VoIP当应用被杀死(双击划掉)并且黑屏大部分情况都能收到推送,很小的情况会收不到推送消息,经测试可能跟手机电量消耗还有信号强弱有关。 再强调一遍,测试稳定性请在生产环境测试。
3、如果不足和错误的地方,欢迎补充和改正,谢谢。
手机系统有安卓的,也有iphone .还有windowphone
安卓上面的应用程序都是用java写的,iphone手机上的程序是用objective c写的。
windowphone接触的不多,市场占有份额也比较少,
如果想学习手游,安卓的市场份额比较大,建议选择安卓,学习java编程语言
文本转语音技术, 也叫TTS, 是Text To Speech的缩写. iOS如果想做有声书等功能的时候, 会用到这门技术.
这个类就像一个会说话的人, 可以”说话”, 可以”暂停”说话, 可以”继续”说话, 可以判断他当前是否正在说话.有以下的方法或者属性:
这是一个枚举. 在暂停, 或者停止说话的时候, 停下的方式用这个枚举标示. 包括两种:
合成器的委托, 对于一些事件, 提供了响应的接口.
AVSpeechSynthesisVoice定义了一系列的声音, 主要是不同的语言和地区.
这个类就是一段要说的话. 主要的属性和方法有:
这些类的关系如下: