在某些情况下AVSpeechSynthesizer递归调用并挂起应用程序

时间:2016-02-19 08:47:21

标签: ios recursion avspeechsynthesizer

当我使用AVSpeechSynthesizer演讲一串汉字时,它会在演讲结束后停止工作,但会调用“didFinishSpeechUtterance”或“didCancelSpeechUtterance”委托。然后CPU使用率变为99%。    当我看一下线程堆栈时,我发现一个线程以递归方式调用函数。

原谅我可怜的英语。以下是我的代码。

开发环境:Xcode 7.0 iPhone ios9

#import "ViewController.h"
#import <AVFoundation/AVFoundation.h>

NSString* testContent = @"叶玄又对雪仪道。\
“好的,主人!”雪仪螓首微颔,纤手一挥,一个3D虚拟屏幕便出现在他的面前:\
气血:312(-0);\
精神:353(-0);\
力量:193(+270);\
敏捷:160(+270);\
法力:103(练气后期);\
武技:十字拳(3级)、工字伏虎拳(3级)、虎鹤双形拳(3级)、佛山无影脚(5级)、金刚不坏神功(5级)、隔山打牛、辟邪剑法(4级)、傲寒六诀(4级)、冰心诀(2级)\
";

@interface ViewController ()<AVSpeechSynthesizerDelegate>
@property (nonatomic, strong) AVSpeechSynthesizer* ttsEngine;
@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    self.ttsEngine = [[AVSpeechSynthesizer alloc] init];
    self.ttsEngine.delegate = self;
}

- (IBAction)startPlay:(id)sender {
    AVSpeechUtterance* utterance = [AVSpeechUtterance speechUtteranceWithString:testContent ];
    NSLog(@"%f", AVSpeechUtteranceDefaultSpeechRate);
    utterance.rate = 0.7;
    AVSpeechSynthesisVoice *voice = [AVSpeechSynthesisVoice voiceWithLanguage:@"zh-TW"];
    [utterance setVoice:voice];

    [self.ttsEngine speakUtterance:utterance];

}

- (void) speechSynthesizer:(AVSpeechSynthesizer *)synthesizer didFinishSpeechUtterance:(AVSpeechUtterance *)utterance
{
    NSLog(@"didFinishSpeechUtterance");
}

- (void) speechSynthesizer:(AVSpeechSynthesizer *)synthesizer didCancelSpeechUtterance:(AVSpeechUtterance *)utterance
{
    NSLog(@"didCancelSpeechUtterance");
}


@end

AVSpeechSynthesizer将在演讲结束后停止“主人!”“。

递归调用线程栈:

#65 0x00000001024b90f4 in ___lldb_unnamed_function634$$TTSSpeechBundle ()
#66 0x00000001024b8ff4 in ___lldb_unnamed_function634$$TTSSpeechBundle ()
#67 0x00000001024b90f4 in ___lldb_unnamed_function634$$TTSSpeechBundle ()
#68 0x00000001024b8ff4 in ___lldb_unnamed_function634$$TTSSpeechBundle ()
#69 0x00000001024b8ff4 in ___lldb_unnamed_function634$$TTSSpeechBundle ()
#70 0x00000001024b8ff4 in ___lldb_unnamed_function634$$TTSSpeechBundle ()
#71 0x00000001024b8ff4 in ___lldb_unnamed_function634$$TTSSpeechBundle ()
#72 0x00000001024b8ff4 in ___lldb_unnamed_function634$$TTSSpeechBundle ()
#73 0x00000001024b90f4 in ___lldb_unnamed_function634$$TTSSpeechBundle ()
#74 0x00000001024b8ff4 in ___lldb_unnamed_function634$$TTSSpeechBundle ()
#75 0x00000001024b90f4 in ___lldb_unnamed_function634$$TTSSpeechBundle ()
#76 0x00000001024b8ff4 in ___lldb_unnamed_function634$$TTSSpeechBundle ()
#77 0x00000001024b8ff4 in ___lldb_unnamed_function634$$TTSSpeechBundle ()
#78 0x00000001024b8ff4 in ___lldb_unnamed_function634$$TTSSpeechBundle ()
#79 0x00000001024b90f4 in ___lldb_unnamed_function634$$TTSSpeechBundle ()
#80 0x00000001024b8ff4 in ___lldb_unnamed_function634$$TTSSpeechBundle ()
#81 0x00000001024b90f4 in ___lldb_unnamed_function634$$TTSSpeechBundle ()
#82 0x00000001024b38d0 in mosyntaccphr_TreatSyntTree ()
#83 0x00000001024b2a0c in mosynt_DoAccentPhrasing ()
#84 0x00000001024276d0 in fe_phrasing_Process_Mosynt ()
#85 0x0000000102429e80 in fe_phrasing_Process ()
#86 0x00000001025aec94 in ___lldb_unnamed_function1254$$TTSSpeechBundle ()
#87 0x00000001025ad500 in ___lldb_unnamed_function1251$$TTSSpeechBundle ()
#88 0x00000001025ad404 in ttseg_Synthesize ()
#89 0x00000001025becac in ___lldb_unnamed_function1317$$TTSSpeechBundle ()
#90 0x00000001025bee9c in ve_ttsProcessText2Speech ()
#91 0x00000001023dc778 in TTSVocalizerProcessText ()
#92 0x00000001023df618 in ___lldb_unnamed_function100$$TTSSpeechBundle ()
#93 0x00000001023d92a4 in TTSPlaybackPerform ()
#94 0x00000001023decac in ___lldb_unnamed_function93$$TTSSpeechBundle ()
#95 0x000000019b693b3c in _pthread_body ()
#96 0x000000019b693aa0 in _pthread_start ()

0 个答案:

没有答案