苹果原生文字转语音播报

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

原文地址:https://www.cnblogs.com/CH520/p/10087593.html

时间: 2024-10-12 20:25:47

苹果原生文字转语音播报的相关文章

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

首先使用的是科大讯飞的sdk 1.语音识别部分 AppDelegate.m #import "AppDelegate.h" #import <iflyMSC/iflyMSC.h> @interface AppDelegate () @end @implementation AppDelegate - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictiona

ios原生文字转语音

因新项目需求,需要接入类似支付宝收款提示声----"支付宝到账xxxx元",就查看了一些文章,苹果还是想的很周全,废话不多说. 首先 在General  -> Linked Frameworks and Libraries 中导入 AVFoundation框架 其次 头文件包含 #import <AVFoundation/AVSpeechSynthesis.h> AVSpeechSynthesizerDelegate 实现文字转语音需要代理方法 用来控制声音,由于我的

文字转语音,语音合成,文字语音播报---解决过程

做了很久生产项目 经常遇到一个问题:就是想把文字用语音播报出来:当然了声音要清晰,好听,不能太机械.  这个问题怎么解决呢?一般不外乎两种方法,第一种,将文字录成MP3格式用控件播放.另外一种:直接文字语音播报. 我一直都是用第一种方法居多,但是最近遇到个棘手的事情,就是数量巨大和文字变动较大.因此深入研究了下,记录下过程. 第一种方法:就是费时费力但是好处是人工转换了删选了效果比较好.但是两大或者文字变动 是个大隐患. 第二种方法:用微软自带的tts引擎,效果不好.播放不清晰,好处是com组件

语音播报-文字转系统声音

一段文字,让系统用语音播出,使用AVFoundation框架下的AVSpeechSynthesizer即可,非常简单. 步骤1,导入AVFoundation框架: 1 import AVFoundation 步骤2,创建语音合成器: 1 /// 语音合成器 2 private lazy var speechSynthesizer:AVSpeechSynthesizer = { 3 let speech = AVSpeechSynthesizer() 4 return speech 5 }() 步

iOS - 根据推送消息进行语音播报

目前市面上很多聚合支付APP都需要在收款成功后,进行语音提示,例如收钱吧,乐惠等!公司App融E收也同样需要实现改功能,主要分为2个部分,一是推送,而是语音播报,下面简单介绍一下 一 推送,目前集成的推送主要是极光推送,集成极光推动的流程比较简单,主要流程是 1.注册账号,在极光推送官网上注册账号,地址:https://www.jiguang.cn/accounts/register/form 2.登录账号,右上角点击创建应用,填写应用名称,上传应用icon,点击创建 3.上传推送证书,做APN

iOS开发——语音播报

闲来无事,突然想要听一下苹果的语音功能,然后就自己查资料搞一下. 在iOS7之前,想要实现语音播报文字内容,可能需要第三方资源库来实现.现在在iOS7上,系统为我们提供了语音播报文字的功能,我们不仅可以播报英语内容,也可以播报汉语文字,所以对于开发者来说真是个福音. 需要导入AVFoundattion: 当前的设备判断 NSString *warnmsg = @"今天天气真好,工作加油"; if ([[[UIDevice  currentDevice] systemVersion]in

Android语音播报、后台播报、语音识别

Android语音播报.后台播报.语音识别 本文介绍使用讯飞语音实现语音播报.语音识别功能. 讯飞开放平台:http://www.xfyun.cn/index.php/default/index 程序效果图: 简单的XML布局 <?xml version="1.0" encoding="utf-8"? > <LinearLayout xmlns:android="http://schemas.android.com/apk/res/and

HTML5语音播报引发的:关于TTS引擎扩展及修复注意事项

首先给出HTML5语音播报实例,具体解释请查阅相关文档: //html5语音播报 function speak(textToSpeak) {     //创建一个 SpeechSynthesisUtterance的实例     var utterance = new SpeechSynthesisUtterance();     // 设置文本     utterance.text = textToSpeak;     //增加中文支持     utterance.lang = 'zh-CN';

iOS项目开发—TTS技术的实现即语音播报(实现方法一)

一.简单说明 (1) 在iOS7之前,想要实现语音播报文字内容,可能需要第三方资源库来实现.现在在iOS7上,系统为我们提供了语音播报文字的功能,我们不仅可以播报英语内容,也可以播报汉语文字 实现TTS主要依赖AVSpeechSynthesizer,AVSpeechUtterance,AVSpeechSynthesisVoice,要使用这些类必须先加入 AVFoundation框架: AVSpeechSynthesisVoice:用来配置发音,支持的发音非常多.个人感觉台湾发音最好听~通过调用