前言:
- 接上一章,这次说语音合成
-简单来说就是你输入一段文字,系统分析后能用语音读出来。
—
打开上次创建好的程序。
1.先在ViewController.h
中添加
#import <UIKit/UIKit.h>
//语音合成
#import "iflyMSC/IFlySpeechSynthesizerDelegate.h”
引入语音合成类
@class IFlySpeechSynthesizer;
@class IFlyDataUploader;
注意要添加语音合成代理
<IFlySpeechSynthesizerDelegate>
2.然后来到ViewController.m
中
导入头文件
#import <QuartzCore/QuartzCore.h>
#import <AVFoundation/AVAudioSession.h>
#import <AudioToolbox/AudioSession.h>
#import "iflyMSC/IFlySpeechConstant.h"
#import "iflyMSC/IFlySpeechUtility.h"
#import "iflyMSC/IFlySpeechSynthesizer.h”
的确很多……但是为了不报错,加吧
3.完成这些准备工作之后,接下来就是堆代码的工作了。为了方便,笔者只用了两个控件:一个UITextField、一个UIButton,然后给这两个控件分别做一个Outlet和Action连接。
声明接受要阅读的文本的textField
property (weak, nonatomic) IBOutlet UITextField *content;
声明语音合成的对象
@property (nonatomic, strong) IFlySpeechSynthesizer *iFlySpeechSynthesizer;
因为语言合成要写的比较多,我们就写在一个方法里,然后在viewDidLoad
里调用
- (void)viewDidLoad {
[super viewDidLoad];
[self voiceRead];
}
4.在voiceRead
中
通过appid连接讯飞语音服务器,把@"58096c82"换成你申请的appid,如果不记得appid是什么请看第一章
NSString *initString = [[NSString alloc] initWithFormat:@"appid=%@,timeout=%@",@"58096c82",@"20000”];
所有服务启动前,需要确保执行createUtility
[IFlySpeechUtility createUtility:initString];
创建合成对象,为单例模式
_iFlySpeechSynthesizer = [IFlySpeechSynthesizer sharedInstance];
_iFlySpeechSynthesizer.delegate = self;
设置语音合成的参数,合成的语速,取值范围0~100
[_iFlySpeechSynthesizer setParameter:@"50" forKey:[IFlySpeechConstant SPEED]];
合成的音量;取值范围0~100
[_iFlySpeechSynthesizer setParameter:@"50" forKey:[IFlySpeechConstant VOLUME]];
发音人,默认为”xiaoyan”;可以设置的参数列表可参考个性化发音人列表
[_iFlySpeechSynthesizer setParameter:@"xiaoyan" forKey:[IFlySpeechConstant VOICE_NAME]];
音频采样率,目前支持的采样率有16000 和 8000
[_iFlySpeechSynthesizer setParameter:@"8000" forKey:[IFlySpeechConstant SAMPLE_RATE]];
asr_audio_path保存录音文件路径,如不再需要,设置value为nil表示取消,默认目录是documents
[_iFlySpeechSynthesizer setParameter:@"tts.pcm" forKey:[IFlySpeechConstant TTS_AUDIO_PATH]];
隐藏键盘,点击空白处
UITapGestureRecognizer *tapGr = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(viewTapped:)];
tapGr.cancelsTouchesInView = NO;
[self.view addGestureRecognizer:tapGr];
点击空白处隐藏键盘方法
-(void)viewTapped:(UITapGestureRecognizer*)tapGr
{
[self.content resignFirstResponder];
}
```
####5.IFlySpeechSynthesizerDelegate代理方法
开始播放
```
-(void)onSpeakBegin
{
}
```
缓冲进度
```
-(void)onBufferProgress:(int)progress message:(NSString *)msg
{
NSLog(@"bufferProgress:%d,message:%@",progress,msg);
}
```
播放进度
```
-(void)onSpeakProgress:(int)
progress
{
NSLog(@"playprogress:%d",progress);
}
```
暂停播放
```
-(void)onSpeakPaused
{
}
```
恢复播放
```
-(void)onSpeakResumed
{
}
```
结束回调
```
-(void)onCompleted:(IFlySpeechError *) error
{
}
```
####6.开始语言合成按钮
```
- (IBAction)Start:(id)sender {
//启动合成会话
[_iFlySpeechSynthesizer startSpeaking:self.content.text];
}
```
#####以上的代理方法其实是可以不写的,但是官方给出的说明是需要加上的。若是在运行过程中出现错误,可以查看开发者文档的错误码列表,找出相应的错误。
然后就……
#完成了!
下集预告:
【OC功能】科大讯飞(三)语音识别
---
###参考资料:
>[讯飞开放平台 iOS开发文档](http://www.xfyun.cn/doccenter/iOS)
[ IOS开发之语音合成(科大讯飞)详解](http://blog.csdn.net/gf771115/article/details/51544087)