关于IOS12.1后 推送系统语音播报无声解决方案(亲测可行)

由于业务需要,自己也刚好忙完其他的事情,有时间再次好好的研究一下推送语音播报,网上找了很多资料,

在这位老铁的博客https://www.jianshu.com/p/e075125603ee里进行了试验和尝试,

自己也进行了修改和改善,这里我说一下改善的方案

本地存拆分的音频文件,利用本地通知播报

这里拆分成3部分,head:支付渠道的开头信息

content:包含具体的整数金额

footer:包含小数点后面的金额+"元"

 

一。改善音频文件生成方法,这里也是采用百度语音合成,使用python进行语音合成,前面的head,content部分和footer 合成的方法都一样,我这里采用了百度语音sdk 更简单一点,这里就说一下比较小数点后面的,这块相对处理比较费劲。

import os
from aip import AipSpeech

""" 你的 APPID AK SK """

APP_ID = ''
API_KEY = ''
SECRET_KEY = ''

client = AipSpeech(APP_ID,API_KEY,SECRET_KEY)

def functionNum(num):
    if(num == 0):
        return "零"
    elif(num == 1):
        return "一"
    elif (num == 2):
        return "二"
    elif (num == 3):
        return "三"
    elif (num == 4):
        return "四"
    elif (num == 5):
        return "五"
    elif (num == 6):
        return "六"
    elif (num == 7):
        return "七"
    elif (num == 8):
        return "八"
    elif (num == 9):
        return "九"


for i in range(0, 100):
    # text = "收到"
    # sound = ""
    # if (i == 0):
    #     text = text +"支付宝"
    #     sound = "alipay"
    # elif(i==1):
    #     text = text + "微信"
    #     sound = "wxpay"

    print(os.getcwd())
    filePath = '/Users/"你的用户名"/Desktop/yuyin/'

    text =  "点"+functionNum(int(i/10))+str(i%10)+"元"
    result = client.synthesis(text,'zh',1,None)
    sound = "point"+str(i).zfill(2)

    if not isinstance(result,dict):
        with open(filePath+sound+'.mp3','wb') as f:
            f.write(result)
    print(sound)


二.生成好的文件放入resource中,在pushservice 通过[UNNotificationSound soundNamed:[NSString stringWithFormat:@"%@.mp3",string]]调用废话不多说直接上我改进后的干货

- (void)didReceiveNotificationRequest:(UNNotificationRequest *)request withContentHandler:(void (^)(UNNotificationContent * _Nonnull))contentHandler {
    self.contentHandler = contentHandler;
    self.bestAttemptContent = [request.content mutableCopy];
  
  NSError* err = nil;
  [[BDSSpeechSynthesizer sharedInstance] speakSentence:self.bestAttemptContent.body withError:&err];
  if (err != nil) {
    NSLog(@"error");
  }
  NSMutableArray *array = [NSMutableArray arrayWithArray:[self stringToArray:self.bestAttemptContent.body]] ;
   //为空不做任何操作
   if(array == nil){
    self.contentHandler(self.bestAttemptContent);
    return
   }
  
  for (NSString *string in array) {
    dispatch_semaphore_t semaphore = dispatch_semaphore_create(0);
    [self registerNotificationWithString:string completeHandler:^{
      //延迟大于1秒感觉更好一点 
      dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
  
            dispatch_semaphore_signal(semaphore);
    
      });
    }];
    dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
  }
  
  self.contentHandler(self.bestAttemptContent);
  
}

//这里处理有一点不同 其他和博主基本一样
- (NSArray *)stringToArray:(NSString *)string {
  NSMutableArray *mutableArray = [NSMutableArray arrayWithCapacity:50];
  
  NSString *headStr = @"";
  if([string containsString:@"支付宝"]){
    headStr = @"alipay";
  }else if([string containsString:@"微信"]){
    headStr = @"wxpay";
  }else{
    return nil;
  }
  [mutableArray addObject:headStr];
  
  NSArray *speraStr = [string componentsSeparatedByString:@"【"];
  NSString *priceStr;
  if (speraStr.count > 1) {
    priceStr = [speraStr[1] componentsSeparatedByString:@"】"][0];
  }else{
    return nil;
  }
  NSArray *showStr = [priceStr componentsSeparatedByString:@"."];
  
  if (showStr.count >1) {
    NSString *contentStr = showStr[0];
    NSString *footerStr = [NSString stringWithFormat:@"point%@",showStr[1]];
    [mutableArray addObject:contentStr];
    [mutableArray addObject:footerStr];
  }else{
    return nil;
  }
  
  
  return mutableArray;
}



- (void)registerNotificationWithString:(NSString *)string completeHandler:(dispatch_block_t)complete {
  
  [[UNUserNotificationCenter currentNotificationCenter] requestAuthorizationWithOptions:(UNAuthorizationOptionAlert | UNAuthorizationOptionSound | UNAuthorizationOptionBadge) completionHandler:^(BOOL granted, NSError * _Nullable error) {
    
    if (granted) {
      
      UNMutableNotificationContent *content = [[UNMutableNotificationContent alloc]init];
      
      content.title = @"";
      content.subtitle = @"";
      content.body = @"";
      content.sound = [UNNotificationSound soundNamed:[NSString stringWithFormat:@"%@.mp3",string]];
      
      content.categoryIdentifier = [NSString stringWithFormat:@"categoryIndentifier%@",string];
      
      UNTimeIntervalNotificationTrigger *trigger = [UNTimeIntervalNotificationTrigger triggerWithTimeInterval:0.01 repeats:NO];
      
      UNNotificationRequest *request = [UNNotificationRequest requestWithIdentifier:[NSString stringWithFormat:@"categoryIndentifier%@",string] content:content trigger:trigger];
      
      [[UNUserNotificationCenter currentNotificationCenter] addNotificationRequest:request withCompletionHandler:^(NSError * _Nullable error) {
        
        if (error == nil) {
          
          if (complete) {
            complete();
          }
        }
      }];
    }
  }];
}

这里我的推送语音内容是这样组织的 xxxapp收到微信(支付宝 )【xxx.xx】元

本人亲测效果还行吧,目前也只能这样搞了。感谢那些探索的博主,感谢。

觉得不错的请?一个

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值