IOS开发–语音播报
想要实现iOS语音播报,要使用讯飞/百度语音播报的第三方接口。我使用的是讯飞的语音合成接口。
登录注册讯飞平台,申请语音合成接口!
下载iOS开发所需sdk,sdk中包含语音开发所需依赖包,以及一个演示demo。
使用Xcode的编写代码
标题首先要导入语音播报所需的依赖包,可以直接从demo中将依赖包全部拖到自己的工程中
其次,在AppDelegate.m中初始化你申请的接口id
//引入语音播报的头文件
#import "AppDelegate.h"
#import "IFlyMSC/IFlyMSC.h"
//初始化ID
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// Override point for customization after application launch.
NSString *initString = [[NSString alloc] initWithFormat:@"appid=%@", @"你自己申请的appid"];
[IFlySpeechUtility createUtility:initString];
return YES;
}
我做的一个简单demo
viewController.h
#import <UIKit/UIKit.h>
#import "IFlyMSC/IFlyMSC.h"
#import <AVFoundation/AVFoundation.h>
@class IFlySpeechSynthesizer;
typedef NS_OPTIONS(NSInteger, SynthesizeType) {
NomalType = 5, //Normal TTS
UriType = 6, //URI TTS
};
//state of TTS
typedef NS_OPTIONS(NSInteger, Status) {
NotStart = 0,
Playing = 2,
Paused = 4,
};
@interface ViewController : UIViewController <IFlySpeechSynthesizerDelegate>
@property (nonatomic, strong) IFlySpeechSynthesizer * iFlySpeechSynthesizer;
@property (nonatomic, strong) UILabel *label;
@property (nonatomic, strong) UIButton *btn;
@property (nonatomic, strong) UIButton *pause;
@property (nonatomic, strong) UIButton *stop;
//@property (weak, nonatomic) IBOutlet UIButton *startSynthesizeBtn;
//@property (weak, nonatomic) IBOutlet UIButton *cancelSynthesizeBtn;
//@property (weak, nonatomic) IBOutlet UIButton *uriSynthesizeBtn;
//@property (weak, nonatomic) IBOutlet UIButton *clearTextBtn;
//@property (weak, nonatomic) IBOutlet UIButton *pauseSynthesizeBtn;
//@property (weak, nonatomic) IBOutlet UIButton *resumeSynthesizeBtn;
@property (nonatomic, assign) Status state;
@property (nonatomic, assign) SynthesizeType synType;
@end
viewController.m
#import "ViewController.h"
#import "iflyMSC/IFlyMSC.h"
int flag;
int sign;
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view.
//UILabel *label=[[UILabel alloc]init];
_label=[[UILabel alloc]init];
_label.frame=CGRectMake(0, 0, self.view.frame.size.width, 500);
//label.backgroundColor=[UIColor blueColor];
_label.numberOfLines=0;
[_label setText:@"《象传》全文 “天行健,君子以自强不息”(乾卦) “地势坤,君子以厚德载物”(坤卦)。 “随风巽,君子以申命行事”(巽卦) “渐雷震,君子以恐惧修省”(震卦)。 “善如水,君子以作事谋始”(坎卦) “火同人,君子以类族辨物”(离卦)。 “步泽履,君子以辨民安志”(兑卦) “艮山谦,君子以裒多益寡”(艮卦)。"];
//UIButton *btn=[[UIButton alloc]init];
flag=0;
sign=0;
//开始播报
_btn=[[UIButton alloc]init];
_btn.frame=CGRectMake(100, self.view.frame.size.height-50, self.view.frame.size.width-200, 50);
[_btn setImage:[UIImage imageNamed:@"未播报"] forState:UIControlStateNormal];
[_btn setTitle:@"语音播报" forState:UIControlStateNormal];
[_btn setBackgroundImage:[UIImage imageNamed:@"button1"] forState:UIControlStateNormal];
//暂停播报
_pause=[[UIButton alloc]init];
_pause.frame=CGRectMake(100, self.view.frame.size.height-100, self.view.frame.size.width-200, 50);
[_pause setBackgroundImage:[UIImage imageNamed:@"button1"] forState:UIControlStateNormal];
[_pause setTitle:@"暂停播报" forState:UIControlStateNormal];
[_pause setImage:[UIImage imageNamed:@"pause"] forState:UIControlStateNormal];
_pause.alpha=0;
//停止播报
_stop=[[UIButton alloc]init];
_stop.frame=CGRectMake(100, self.view.frame.size.height-150, self.view.frame.size.width-200, 50);
[_stop setBackgroundImage:[UIImage imageNamed:@"button1"] forState:UIControlStateNormal];
[_stop setImage:[UIImage imageNamed:@"stop"] forState:UIControlStateNormal];
[_stop setTitle:@"停止播报" forState:UIControlStateNormal];
_stop.alpha=0;
//[_btn setTitle:@"正在播报" forState:UIControlStateHighlighted];
// [_btn setBackgroundImage:[UIImage imageNamed:@"按钮"] forState:UIControlStateHighlighted];
//_btn.backgroundColor=[UIColor redColor];
[self.view addSubview:_label];
[self.view addSubview:_pause];
[self.view addSubview:_stop];
// [self.view addSubview:_btn];
[self.view addSubview:_btn];
[_btn addTarget:self action:@selector(start) forControlEvents:UIControlEventTouchUpInside];
[_pause addTarget:self action:@selector(pause) forControlEvents:UIControlEventTouchUpInside];
[_stop addTarget:self action:@selector(stop) forControlEvents:UIControlEventTouchUpInside];
}
//开始播报
- (void) start{
_pause.alpha=1;
_stop.alpha=1;
if(flag==0){
[_btn setImage:[UIImage imageNamed:@"播报"] forState:UIControlStateNormal];
[_btn setTitle:@"正在播报" forState:UIControlStateNormal];
flag=1;
}else{
[_btn setImage:[UIImage imageNamed:@"未播报"] forState:UIControlStateNormal];
[_btn setTitle:@"语音播报" forState:UIControlStateNormal];
flag=0;
}
NSString* str= _label.text;
NSLog(@"---------");
//NSLog(str);
_synType = NomalType;
//获取语音合成单例
_iFlySpeechSynthesizer = [IFlySpeechSynthesizer sharedInstance];
//设置协议委托对象
_iFlySpeechSynthesizer.delegate = self;
//设置合成参数
//设置内容编码,获取纯文本内容
[_iFlySpeechSynthesizer setParameter:@"unicode" forKey:[IFlySpeechConstant TEXT_ENCODING]];
//设置在线工作方式
[_iFlySpeechSynthesizer setParameter:[IFlySpeechConstant TYPE_CLOUD]
forKey:[IFlySpeechConstant ENGINE_TYPE]];
//设置音量,取值范围 0~100
[_iFlySpeechSynthesizer setParameter:@"50"
forKey: [IFlySpeechConstant VOLUME]];
//发音人,默认为”xiaoyan”,可以设置的参数列表可参考“合成发音人列表”
[_iFlySpeechSynthesizer setParameter:@" xiaoyan "
forKey: [IFlySpeechConstant VOICE_NAME]];
//保存合成文件名,如不再需要,设置为nil或者为空表示取消,默认目录位于library/cache下
[_iFlySpeechSynthesizer setParameter:@" tts.pcm"
forKey: [IFlySpeechConstant TTS_AUDIO_PATH]];
//启动合成会话
[_iFlySpeechSynthesizer startSpeaking: str];
//IFlySpeechSynthesizerDelegate协议实现
//合成结束
if (_iFlySpeechSynthesizer.isSpeaking) {
_state = Playing;
}
}
//暂停播报
- (void) pause{
if(sign==0){
[_iFlySpeechSynthesizer pauseSpeaking];
[_pause setTitle:@"继续播报" forState:UIControlStateNormal];
[_pause setImage:[UIImage imageNamed:@"play"] forState:UIControlStateNormal];
sign=1;
}else{
[_iFlySpeechSynthesizer resumeSpeaking];
[_pause setTitle:@"暂停播报" forState:UIControlStateNormal];
[_pause setImage:[UIImage imageNamed:@"pause"] forState:UIControlStateNormal];
sign=0;
}
}
//结束播报
- (void) stop{
flag=0;
sign=0;
_pause.alpha=0;
_stop.alpha=0;
[_btn setImage:[UIImage imageNamed:@"未播报"] forState:UIControlStateNormal];
[_btn setTitle:@"语音播报" forState:UIControlStateNormal];
[_iFlySpeechSynthesizer stopSpeaking];
}
- (void) onCompleted:(IFlySpeechError *) error {}
//合成开始
- (void) onSpeakBegin {}
//合成缓冲进度
- (void) onBufferProgress:(int) progress message:(NSString *)msg {
NSLog(@"buffer progress %2d%%. msg: %@.", progress, msg);
}
//合成播放进度
- (void) onSpeakProgress:(int) progress beginPos:(int)beginPos endPos:(int)endPos {}
@end