使用場景:我們的產(chǎn)品需求是當多個顧客同時向商戶發(fā)起支付時,App 收到多條推送,客戶端需要逐一語音播報。
解決存在的問題:當出現(xiàn)多條推送時只有最后一條語音會被完整播報,前面的語音會被中斷。
解決方案:這里就簡單的介紹一下實現(xiàn)推送語音播報的一種方案,已上線運行。
一、當我們需要實現(xiàn)這么一個需求時,無非需要考慮以下幾種條件:
1、如何獲取每條語音的時長;
2、如何監(jiān)聽語音何時播報結束;
3、如何從隊列取出和刪除。
我們項目中項目處于前臺時語音播報采用的是訊飛的方案,因此我們可以在訊飛的 API 里面看到有一個開始播報和結束回調(diào)的方法:
/*!
* 開始合成(播放)
* 調(diào)用此函數(shù)進行合成,如果發(fā)生錯誤會回調(diào)錯誤`onCompleted`
*
* @param text 合成的文本,最大的字節(jié)數(shù)為1k
*/
- (void) startSpeaking:(NSString *)text;
/**
* 結束回調(diào)
* 當整個合成結束之后會回調(diào)此函數(shù)
*
* @param error 錯誤碼
*/
- (void) onCompleted:(IFlySpeechError*) error;
有了這個方法,我們只需要考慮好上面提出的第三個因素。
二、實現(xiàn)的步驟:
①首先我們需要接收到需要播報的內(nèi)容;
@property (nonatomic , copy) NSString *voiceContent;
②聲明一個播報的方法;
- (void)play;
③初始化并調(diào)用播報方法;
- (void)setTitleVoice:(NSString *)titleVoice
{
[self.voiceArr addObject:titleVoice];
_titleVoice = titleVoice;
[self play];
}
/**
實現(xiàn)隊列播報,并從數(shù)據(jù)源中刪除已經(jīng)播報的語音
*/
- (void)play
{
NSOperationQueue *queue = [NSOperationQueue mainQueue];
if (self.isPlay) {
_titleVoice = self.voiceArr[0];
[queue addOperation:[self customOperation:_titleVoice]];
self.isPlay = false;
[self.voiceArr removeObjectAtIndex:0];
}
}
- (NSOperation *)customOperation:(NSString *)content {
NSBlockOperation *operation = [NSBlockOperation blockOperationWithBlock:^{
@autoreleasepool {
if (content.length == 0) {
return;
}
[self.iFlySpeechSynthesizer startSpeaking:content];
}
}];
return operation;
}
/**
合成結束(完成)回調(diào)
****/
- (void)onCompleted:(IFlySpeechError *) error
{
self.isPlay = true;
if (self.voiceArr.count > 0) {
[self play];
}
}
至此,我們就簡單的實現(xiàn)了隊列播報的這么一個需求,使用第三方可以減少工作量。如果發(fā)現(xiàn)上面內(nèi)容有出入在留言提出,有更好的方案也可以交流。
最后編輯于 :
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。