iOS 文本转语音

2019-07-22  本文已影响0人  sergeant

AV Foundation框架提供了将文本转换为语音的方法。

主要涉及到三个类:

下面展示下如何播报一段文本。

先创建一个语音合成器:

_synthesizer = [[AVSpeechSynthesizer alloc] init];

再选择需要使用的语音:

_voices = @[[AVSpeechSynthesisVoice voiceWithLanguage:@"en-US"], [AVSpeechSynthesisVoice voiceWithLanguage:@"en-GB"]];

注意所选的语音要跟文本所使用的语言匹配。比如,文本是英语,那你可以选择美式英语发音也可以选择英式英语发音,但是不能选择中文发音。

最后我们将需要播报的文本创建成AVSpeechUtterance对象,并加入播报队列:

- (void)buildSpeechStrings {
    _speechStrings = @[@"Hello AV Foundation. How are you?",
                       @"I'm well! Thanks for asking.",
                       @"Are you excited about the book?",
                       @"Very! I have always felt so misunderstood.",
                       @"What's your favorite feature?",
                       @"Oh, they're all my babies.  I couldn't possibly choose.",
                       @"It was great to speak with you!",
                       @"The pleasure was all mine!  Have fun!"];
}

- (void)beginConversation {
    for (NSInteger index = 0; index < self.speechStrings.count; index++) {
        AVSpeechUtterance *utterance = [AVSpeechUtterance speechUtteranceWithAttributedString:self.speechStrings[index]];
        // 设置语音
        utterance.voice = self.voices[index % 2];
        // 设置速率
        utterance.rate = AVSpeechUtteranceDefaultSpeechRate;
        // 设置语调
        utterance.pitchMultiplier = 0.8;
        // 设置音量
        utterance.volume = 0.7;
        // 播报前停顿
        utterance.preUtteranceDelay = 0.1;
        // 播报后停顿
        utterance.postUtteranceDelay = 0.1;
        [self.synthesizer speakUtterance:utterance];
    }
}

这样就开始播报给定文本了。

需要注意的是只要utterance对象使用speakUtterance:对象加入到播报队列,其语调等各项参数就无法修改了,不管是正在播报,还是在等待播报中。

你可以在Demo中尝试修改参数:https://gitee.com/sergeant/AVSpeech_Glance
Demo源自《AV Foundation 开发秘籍》,主要修改的地方是尝试在播报中修改语调等参数,结论是无效。

上一篇下一篇

猜你喜欢

热点阅读