此文只适用于主动调用或者推送消息过来的时候APP在前台运行状态,想要APP后台播放应该使用一个可能被拒的手段。
这个星期在开发公司APP的V1.2版本,这个版本中有个需求是要加入语音合成,下面简称为TTS,配合着之前的极光推送,就能得到饿了吗,美团等外卖平台的 【您有新的订单,请及时处理】推送+语音效果。
这边说明一下,推送是用的极光,TTS原本打算是用阿里云的,但后来CTO说阿里云的目前不稳定,还在测试,所以还是用了老牌 ---科大讯飞TTS,看着官方文档做环境集成,然后Xcode代码基本没啥问题,但它官方给的demo除了给了TTS的还有其他很多的东西,所以我这边只把语音合成的部分提出来。
一、集成流程看这里
二 代码部分
当你把环境都配置好后,由于是整个项目只要有推送就得语音合成,所以与官方给的SDK Demo不同,需要写在APPDelegate中,
1.在 .m 文件中导入相关文件
//讯飞TTS
#import "iflyMSC/IFlyMSC.h"
#import "Definition.h"
#import "iflyMSC/iflyMSC.h"
#import <AVFoundation/AVFoundation.h>
#import <QuartzCore/QuartzCore.h>
#import <AVFoundation/AVAudioSession.h>
#import <AudioToolbox/AudioSession.h>
并且 遵循代理,创建语音合成的对象
@interface AppDelegate ()<IFlySpeechSynthesizerDelegate>
@property (nonatomic, strong) IFlySpeechSynthesizer * iFlySpeechSynthesizer;
@end
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
//讯飞TTS
[self initSynthesizer];//初始化TTS语音
//设置sdk的log等级,log保存在下面设置的工作路径中
[IFlySetting setLogFile:LVL_ALL];//LVL_ALL表示全部日志打印
//打开输出在console的log开关
[IFlySetting showLogcat:YES];
//创建语音配置,appid必须要传入,仅执行一次则可
NSString *initString = [[NSString alloc] initWithFormat:@"appid=%@",APPID_VALUE];
//所有服务启动前,需要确保执行createUtility
[IFlySpeechUtility createUtility:initString];
return YES;
}
初始化TTS类对象
- (void)initSynthesizer
{
//合成服务单例
if (_iFlySpeechSynthesizer == nil) {
_iFlySpeechSynthesizer = [IFlySpeechSynthesizer sharedInstance];
}
_iFlySpeechSynthesizer.delegate = self;
//设置语速1-100
[_iFlySpeechSynthesizer setParameter:@"50" forKey:[IFlySpeechConstant SPEED]];
//设置音量1-100
[_iFlySpeechSynthesizer setParameter:@"80" forKey:[IFlySpeechConstant VOLUME]];
//设置音调1-100
[_iFlySpeechSynthesizer setParameter:@"50" forKey:[IFlySpeechConstant PITCH]];
//设置采样率
[_iFlySpeechSynthesizer setParameter:@"16000" forKey:[IFlySpeechConstant SAMPLE_RATE]];
//设置发音人 有很多,可见文档中自己挑选哦
[_iFlySpeechSynthesizer setParameter:@"xiaoyan" forKey:[IFlySpeechConstant VOICE_NAME]];
//设置文本编码格式
[_iFlySpeechSynthesizer setParameter:@"unicode" forKey:[IFlySpeechConstant TEXT_ENCODING]];
}
3.在极光推送的代理方法中实现语音前的文本处理,
需要注意的点:极光推送这边有两个回调,一个是willPresentNotification,另一个是didReceiveNotificationResponse,两个区别在于,前者是有推送时实时语音,后者是有推送时点击了才会触发,我们的需求当然是写在前者里啦!
- (void)jpushNotificationCenter:(UNUserNotificationCenter *)center willPresentNotification:(UNNotification *)notification withCompletionHandler:(void (^)(NSInteger))completionHandler {
NSDictionary * userInfo = notification.request.content.userInfo;
//这边一般是语音播报极光回调信息中的文本,我这边是写死的一句话
NSString *str = @"您有新的订单,请及时处理"
[_iFlySpeechSynthesizer startSpeaking:str];
if([notification.request.trigger isKindOfClass:[UNPushNotificationTrigger class]]) {
[JPUSHService handleRemoteNotification:userInfo];
}
completionHandler(UNNotificationPresentationOptionAlert); // 需要执行这个方法,选择是否提醒用户,有Badge、Sound、Alert三种类型可以选择设置
}
4.网上有资料说语音合成的回调必须也写上,否则无法实现语音合成(具体也没去证实过),但这些回调里你可以啥都不用写
- (void)onSpeakBegin
{
}
-(void)onBufferProgress:(int)progress message:(NSString *)msg
{
NSLog(@"bufferProgress:%d,message:%@",progress,msg);
}
-(void)onSpeakProgress:(int)
progress
{
NSLog(@"playprogress:%d",progress);
}
-(void)onSpeakPaused
{
}
-(void)onSpeakResumed
{
}
-(void)onCompleted:(IFlySpeechError *) error
{
}
好了,TTS就是这么简单,上面列了几个注意的点千万别漏了,快去让你的APP说话吧。当然,也不是一定要配合推送,自己写个小demo点击按钮触发也是可以的哦。
以上!