記錄下最近做語音播報的坑揉忘。
先說下實(shí)測成功的方式,咱沒有VoIP功能端铛,用這個推送的可以不用往下看了:
1泣矛、主app和Notification Service Extension
中存放音頻語音文件,比如我這里是要播報支付金額禾蚕,本地存放了對應(yīng)的0-9您朽,百、十换淆、千哗总、萬、億這樣的語音拼接零件倍试。
2讯屈、iOS10 - iOS12.1使用AVFoundation
框架合成.m4a文件,可用AVAudioPlayer播放县习。
3涮母、iOS12.1 - iOS13(由于沒有測試設(shè)備谆趾,大家自行測試,可能是iOS15以下)使用本地推送叛本,在擴(kuò)展里發(fā)送本地通知播放的是主app下對應(yīng)的音頻沪蓬,這樣多條循環(huán)推送就可以實(shí)現(xiàn)播報一段完整語音了。我在代碼中存放了每個音頻文件的時間(省的每次去讀取bundle中音頻文件獲取時間)来候,按時長延遲請求下一條本地推送跷叉。用這種方式的話如果設(shè)備開了震動收到一次推送就會震動一次,此處無解营搅,已經(jīng)是能播放的唯一方式了性芬。記住千萬不要提前調(diào)用self.contentHandler(self.bestAttemptContent);
!剧防!植锉,不然Notification Service Extesnion
通知擴(kuò)展類會報錯Notifications are not allowed for this application
4、之后高版本設(shè)備實(shí)現(xiàn)方式很簡單峭拘,self.bestAttemptContent.sound = [UNNotificationSound soundNamed:@“拼接的語音文件名字”];
俊庇,語音文件要放在對應(yīng)的目錄。
拼接的音頻必須在三個位置:
1.主應(yīng)用中的Library/Sounds
文件夾中鸡挠;
2.AppGroups
共享目錄中的Library/Sounds
文件夾中辉饱;
3.main bundle
中;
第一種拣展,Notification Service Extension
不在主應(yīng)用彭沼,無法設(shè)置,第三種必須在打包時候就內(nèi)置在項(xiàng)目中备埃,所以只能放在AppGroups
中了姓惑。
合并mp3可以用AVFoundation
框架也可以用數(shù)據(jù)流的方式,用數(shù)據(jù)流合并的方式簡單但是有個坑按脚,我合并多個mp3文件發(fā)現(xiàn)只播放第一段音頻于毙,對比音頻信息發(fā)現(xiàn)如果其中某個音頻audio data file offset
有值時,合并的mp3時間軸就會出現(xiàn)問題辅搬,不同比特率的mp3音頻合并無影響唯沮,這個問題找不到解決方法。新生成音頻沒有這個問題堪遂,只要裁切或者其他處理過的音頻offset就有值介蛉。
參考文章:
iOS13推送語音播報
iOS小技能:合并mp3格式的文件