苹果原生文字转语音播报

Posted CH520 -- Cnblogs。

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了苹果原生文字转语音播报相关的知识,希望对你有一定的参考价值。

1、CHiosSpeech.h

//
// 文 件 名:CHiOSSpeech.h
// 
// 版权所有:Copyright ? 2018年 leLight. All rights reserved.
// 创 建 者:leLight 
// 创建日期:2018/7/30.
// 文档说明:苹果原生文字转语音播报.
// 修 改 人:
// 修改日期:
// 

#import <Foundation/Foundation.h>
#import <AVFoundation/AVFoundation.h>

@protocol CHiOSSpeechDelegate <NSObject>
@optional
/************ 开始播放 *****************************/
- (void)speechSynthesizer:(AVSpeechSynthesizer*)synthesizer didStartSpeechUtterance:(AVSpeechUtterance*)utterance;
/************ 完成播放 *****************************/
- (void)speechSynthesizer:(AVSpeechSynthesizer*)synthesizer didFinishSpeechUtterance:(AVSpeechUtterance*)utterance;
/************ 播放中止 *****************************/
- (void)speechSynthesizer:(AVSpeechSynthesizer*)synthesizer didPauseSpeechUtterance:(AVSpeechUtterance*)utterance;
/************ 恢复播放 *****************************/
- (void)speechSynthesizer:(AVSpeechSynthesizer*)synthesizer didContinueSpeechUtterance:(AVSpeechUtterance*)utterance;
/************ 播放取消 *****************************/
- (void)speechSynthesizer:(AVSpeechSynthesizer*)synthesizer didCancelSpeechUtterance:(AVSpeechUtterance*)utterance;

@end

@interface CHiOSSpeech : NSObject

/** 文字播报代理 */
@property (nonatomic, weak) id<CHiOSSpeechDelegate> delegate;

/************ 单例对象 *****************************/
+ (CHiOSSpeech *)sharedInstance;
/************ 开始播放 *****************************/
- (void)startSpeekWithString:(NSString *)string;
/************ 暂停播放 *****************************/
- (void)pauseSpeaking;
/************ 继续播放 *****************************/
- (void)continueSpeaking;

// 初始化配置:这里不设置则使用默认参数
/**
 *  设置播放的声音参数 如果选择默认请传入 -1.0
 *
 *  @param aVolume          音量(0.0~1.0)默认为1.0
 *  @param aRate            语速(0.0~1.0)默认为1.0
 *  @param aPitchMultiplier 语调 (0.5-2.0)默认为1.0
  *  @param languageCode    语言          默认为 中文普通话:@"zh-CN"
 */
- (void)setDefaultWithVolume:(float)aVolume
                        rate:(CGFloat)aRate
             pitchMultiplier:(CGFloat)aPitchMultiplier
                languageCode:(NSString *)languageCode;

@end

2、CHiOSSpeech.m

//
// 文 件 名:CHiOSSpeech.m
// 
// 版权所有:Copyright ? 2018年 leLight. All rights reserved.
// 创 建 者:leLight 
// 创建日期:2018/7/30.
// 文档说明:苹果原生文字转语音播报.
// 修 改 人:
// 修改日期:
// 

#import "CHiOSSpeech.h"

@interface CHiOSSpeech () <AVSpeechSynthesizerDelegate>
{
    AVSpeechSynthesizer      *av;
    AVSpeechUtterance        *utterance;
}

/** 语速 */
@property(nonatomic, assign) float rate;
/** 音量 */
@property(nonatomic, assign) float volume;
/** 音调 */
@property(nonatomic, assign) float pitchMultiplier;
/** 音调 */
@property(nonatomic, copy) NSString *languageCode;

@end

@implementation CHiOSSpeech

/************ 单例对象 *****************************/
+ (CHiOSSpeech *)sharedInstance {
    static CHiOSSpeech *sharedClient = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        sharedClient = [[CHiOSSpeech alloc] init];
    });
    return sharedClient;
}

/************ 初始化创建 *****************************/
- (instancetype)init {
    self = [super init];
    if (self) {
        // 初始化对象
        av = [[AVSpeechSynthesizer alloc] init];
        // 挂上代理
        av.delegate = self;
        // 初始化配置
        [self setDefaultWithVolume:-1.0 rate:-1.0 pitchMultiplier:-1.0 languageCode:@"zh-CN"];
        
    };
    return self;
}

/************ 开始播放 *****************************/
- (void)startSpeekWithString:(NSString *)string {
    
    utterance = [[AVSpeechUtterance alloc] initWithString:string];
    // 设置语速,范围0-1,注意0最慢,1最快;AVSpeechUtteranceMinimumSpeechRate最慢,AVSpeechUtteranceMaximumSpeechRate最快
    utterance.rate = 0.5;
    //设置发音,这是中文普通话:@"zh-CN"
    AVSpeechSynthesisVoice *voice = [AVSpeechSynthesisVoice voiceWithLanguage:self.languageCode];
    utterance.voice = voice;
    // 设置语速
    utterance.rate = self.rate;
    // 设置音量(0.0~1.0)默认为1.0
    utterance.volume = self.volume;
    // 设置语调 (0.5-2.0)
    utterance.pitchMultiplier = self.pitchMultiplier;
    // 目的是让语音合成器播放下一语句前有短暂的暂停
    utterance.postUtteranceDelay = 1;
    
    // 开始
    [av speakUtterance:utterance];
}

/************ 暂停播放 *****************************/
- (void)pauseSpeaking {
    [av pauseSpeakingAtBoundary:AVSpeechBoundaryWord];
}

/************ 继续播放 *****************************/
- (void)continueSpeaking {
    // 如果暂停则恢复,会从暂停的地方继续
    [av continueSpeaking];
}

#pragma mark ***************************** AVSpeechSynthesizerDelegate ***********************************************
/************ 开始播放 *****************************/
- (void)speechSynthesizer:(AVSpeechSynthesizer*)synthesizer didStartSpeechUtterance:(AVSpeechUtterance*)utterance {
    
    CHLog(@"是否正在播放:%d", synthesizer.isSpeaking);
    CHLog(@"是否处于播放:%d", synthesizer.isPaused);
    CHLog(@"播放的内容:%@", utterance.speechString);
    
    CHLog(@"---开始播放");
    
    if([self.delegate respondsToSelector:@selector(speechSynthesizer: didStartSpeechUtterance:)]) {
        [self.delegate speechSynthesizer:synthesizer didStartSpeechUtterance:utterance];
    }
}

/************ 完成播放 *****************************/
- (void)speechSynthesizer:(AVSpeechSynthesizer*)synthesizer didFinishSpeechUtterance:(AVSpeechUtterance*)utterance {
    CHLog(@"---完成播放");
    
    if([self.delegate respondsToSelector:@selector(speechSynthesizer: didFinishSpeechUtterance:)]) {
        [self.delegate speechSynthesizer:synthesizer didFinishSpeechUtterance:utterance];
    }
}

/************ 播放中止 *****************************/
- (void)speechSynthesizer:(AVSpeechSynthesizer*)synthesizer didPauseSpeechUtterance:(AVSpeechUtterance*)utterance {
    CHLog(@"---播放中止");
    
    if([self.delegate respondsToSelector:@selector(speechSynthesizer: didPauseSpeechUtterance:)]) {
        [self.delegate speechSynthesizer:synthesizer didPauseSpeechUtterance:utterance];
    }
}

/************ 恢复播放 *****************************/
- (void)speechSynthesizer:(AVSpeechSynthesizer*)synthesizer didContinueSpeechUtterance:(AVSpeechUtterance*)utterance {
    CHLog(@"---恢复播放");
    
    if([self.delegate respondsToSelector:@selector(speechSynthesizer: didContinueSpeechUtterance:)]) {
        [self.delegate speechSynthesizer:synthesizer didContinueSpeechUtterance:utterance];
    }
}

/************ 播放取消 *****************************/
- (void)speechSynthesizer:(AVSpeechSynthesizer*)synthesizer didCancelSpeechUtterance:(AVSpeechUtterance*)utterance {
    CHLog(@"---播放取消");
    
    if([self.delegate respondsToSelector:@selector(speechSynthesizer: didCancelSpeechUtterance:)]) {
        [self.delegate speechSynthesizer:synthesizer didCancelSpeechUtterance:utterance];
    }
}

// 初始化配置
/**
 *  设置播放的声音参数 如果选择默认请传入 -1.0
 *
 *  @param aVolume          音量(0.0~1.0)默认为1.0
 *  @param aRate            语速(0.0~1.0)默认为1.0
 *  @param aPitchMultiplier 语调 (0.5-2.0)默认为1.0
 *  @param languageCode     语言          默认为 中文普通话:@"zh-CN"
 */
- (void)setDefaultWithVolume:(float)aVolume rate:(CGFloat)aRate pitchMultiplier:(CGFloat)aPitchMultiplier languageCode:(NSString *)languageCode {
    
    self.rate   = aRate;
    self.volume = aVolume;
    self.pitchMultiplier = aPitchMultiplier;
    self.languageCode = languageCode;
    
    if (aRate == -1.0) {
        self.rate = 0.5;
    }
    if (aVolume == -1.0) {
        self.volume = 1.0;
    }
    if (aPitchMultiplier == -1.0) {
        self.pitchMultiplier = 1;
    }
}

@end

以上是关于苹果原生文字转语音播报的主要内容,如果未能解决你的问题,请参考以下文章

Android开发笔记(一百零八)智能语音

iOS语音识别,语音播报,文字变语音播报,语音变文字

离线文字转语音(人生苦短,我用Python)

安卓手机怎么关闭 文本转语音选项?

iOS10原生的语音转文字功能

Amazon Alexa进阶到播报员 以播报员的讲话风格念新闻