IOS开发之语音合成(科大讯飞)详解

1、注册讯飞账号,申请APPID(注意选择IOS平台)

2、加载所需要的类库

3、导入所需要的类库文件头

4、调用申请的APPID以及所需函数,完成语音合成(需要参考官方给出的SDK文件)

详细步骤:

一、首先到科大讯飞官网注册账号(http://open.voicecloud.cn/),并创建应用获取appid,下载sdk文件

二、代码实现api调用

1.先用xcode(我这里使用的是xcode 5.1)新建好一个项目,然后在项目添加要用的类库。其中有一个是讯飞语音的类库iflyMSC,在下载的sdk文件里有,导入就行了。导入的时候要注意把iflyMSC类库拷贝到你的工程目录里,不然后果很严重!

2.导完类库之后,在建好的工程里添加好要用的头文件。

MainViewController.h


1

2

#import <UIKit/UIKit.h>

#import "iflyMSC/IFlySpeechSynthesizerDelegate.h"

MainViewController.m


1

2

3

4

5

6

7

#import "MainViewController.h"

#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连接。

MainViewController.h


1

2

3

4

5

6

7

8

9

10

11

12

13

#import <UIKit/UIKit.h>

#import "iflyMSC/IFlySpeechSynthesizerDelegate.h"

//引入语音合成类

@class IFlySpeechSynthesizer;

@class IFlyDataUploader;

//注意要添加语音合成代理

@interface MainViewController : UIViewController<IFlySpeechSynthesizerDelegate>

//声明语音合成的对象

@property (nonatomic, strong) IFlySpeechSynthesizer *iFlySpeechSynthesizer;

@property (strong, nonatomic) IBOutlet UITextField *content;

- (IBAction)Start:(id)sender;

@end

MainViewController.m


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

#import "MainViewController.h"

#import <QuartzCore/QuartzCore.h>

#import <AVFoundation/AVAudioSession.h>

#import <AudioToolbox/AudioSession.h>

#import "iflyMSC/IFlySpeechConstant.h"

#import "iflyMSC/IFlySpeechUtility.h"

#import "iflyMSC/IFlySpeechSynthesizer.h"

@interface MainViewController ()

@end

@implementation MainViewController

- (void)viewDidLoad

{

    [super viewDidLoad];

    //通过appid连接讯飞语音服务器,把@"53b5560a"换成你申请的appid

    NSString *initString = [[NSString alloc] initWithFormat:@"appid=%@,timeout=%@",@"53b5560a",@"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];

}

- (void)didReceiveMemoryWarning

{

    [super didReceiveMemoryWarning];

    // Dispose of any resources that can be recreated.

}

- (IBAction)Start:(id)sender

{

    //启动合成会话

    [_iFlySpeechSynthesizer startSpeaking:self.content.text];

}

#pragma mark - IFlySpeechSynthesizerDelegate

//开始播放

- (void) onSpeakBegin

{

    

}

//缓冲进度

- (void) onBufferProgress:(int) progress message:(NSString *)msg

{

    NSLog(@"bufferProgress:%d,message:%@",progress,msg);

}

//播放进度

- (void) onSpeakProgress:(int) progress

{

    NSLog(@"play progress:%d",progress);

}

 //暂停播放

- (void) onSpeakPaused

{

    

}

//恢复播放

- (void) onSpeakResumed

{

    

}

//结束回调

- (void) onCompleted:(IFlySpeechError *) error

{

    

}

@end

4.以上的代理方法其实是可以不写的,但是官方给出的说明是需要加上的。若是在运行过程中出现错误,可以查看开发者文档的错误码列表,找出相应的错误。

时间: 2024-10-31 03:54:17

IOS开发之语音合成(科大讯飞)详解的相关文章

iOS开发摇动手势实现详解

1.当设备摇动时,系统会算出加速计的值,并告知是否发生了摇动手势.系统只会运动开始和结束时通知你,并不会在运动发生的整个过程中始终向你报告每一次运动.例如,你快速摇动设备三次,那只会收到一个摇动事件. 2,想要实现摇动手势,首先需要使视图控制器成为第一响应者,注意不是单独的控件.成为第一响应者最恰当的时机是在视图出现的时候,而在视图消失的时候释放第一响应者. ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 -(BOOL)canBecomeFirstRespond

iOS 开发之照片框架详解之二 —— PhotoKit 详解(下)

这里接着前文<iOS 开发之照片框架详解之二 —— PhotoKit 详解(上)>,主要是干货环节,列举了如何基于 PhotoKit 与 AlAssetLibrary 封装出通用的方法. 三. 常用方法的封装 虽然 PhotoKit 的功能强大很多,但基于兼容 iOS 8.0 以下版本的考虑,暂时可能仍无法抛弃 ALAssetLibrary,这时候一个比较好的方案是基于 ALAssetLibrary 和 PhotoKit 封装出一系列模拟系统 Asset 类的自定义类,然后在其中封装好兼容 A

iOS 开发之照片框架详解之二 —— PhotoKit 详解(上)

一. 概况 本文接着 iOS 开发之照片框架详解,侧重介绍在前文中简单介绍过的 PhotoKit 及其与 ALAssetLibrary 的差异,以及如何基于 PhotoKit 与 AlAssetLibrary 封装出通用的方法. 这里引用一下前文中对 PhotoKit 基本构成的介绍: PHAsset: 代表照片库中的一个资源,跟 ALAsset 类似,通过 PHAsset 可以获取和保存资源 PHFetchOptions: 获取资源时的参数,可以传 nil,即使用系统默认值 PHAssetCo

【iOS开发必收藏】详解iOS应用程序内使用IAP/StoreKit付费、沙盒(SandBox)测试、创建测试账号流程!【2012-12-11日更新获取”产品付费数量等于0的问题”】

转的别人的 看到很多童鞋问到,为什么每次都返回数量等于0?? 其实有童鞋已经找到原因了,原因是你在 ItunesConnect 里的 “Contracts, Tax, and Banking”没有完成设置账户信息. 确定 ItunesConnect 里 “Contracts, Tax, and Banking”的状态,如下图所示,即可: 这里也是由于Himi疏忽的原因没有说明,这里先给童鞋们带来的麻烦,致以歉意. //——2012-6-25日更新iap恢复 看到很多童鞋说让Himi讲解如何恢复i

iOS开发之手势gesture详解(二)

与其他用户界面控件交互 UIControl子类会覆盖parentView的gesture.例如当用户点击UIButton时,UIButton会接受触摸事件,它的parentView不会接收到.这仅适用于手势识别重叠的默认动作的控制,其中包括: 一根手指单击动作:UIButton, UISwitch, UIStepper, UISegmentedControl, and UIPageControl. 一根手指擦碰动作:UISlider 一根手指拖动动作:UISwitch 包含多点触摸的事件 在iO

iOS开发之手势gesture详解(一)

前言 在iOS中,你可以使用系统内置的手势识别(GestureRecognizer),也可以创建自己的手势.GestureRecognizer将低级别的转换为高级别的执行行为,是你绑定到view的对象,当发生手势,绑定到的view对象会响应,它确定这个动作是否对应一个特定的手势(swipe,pinch,pan,rotation).如果它能识别这个手势,那么就会向绑定它的view发送消息,如下图 UIKit框架提供了一些预定义的GestureRecognizer.包含下列手势 UITapGestu

iOS开发——UI篇&amp;ScrollView详解

ScrollView详解 创建方式 1:StoryBoard/Xib 这里StoarBoard就不多说,直接拖就可以,说太多没意思,如果连这个都不会我只能先给你跪了! 2:代码: CGRect bounds = [ [ UIScreen mainScreen ] applicationFrame ] ; UIScrollView* scrollView = [ [UIScrollView alloc ] initWithFrame:bounds ]; 当你创建完滚动视图后,你可以将另一个视图的内

iOS开发——UIView与CALayer详解

UIView与CALayer详解 研究Core Animation已经有段时间了,关于Core Animation,网上没什么好的介绍.苹果网站上有篇专门的总结性介绍,但是似乎原理性的东西不多,看得人云山雾罩,感觉,写那篇东西的人,其实是假 设读的人了解界面动画技术的原理的.今天有点别的事情要使用Linux,忘掉了ssh的密码,没办法重新设ssh,结果怎么也想不起来怎么设ssh远程登 陆了,没办法又到网上查了一遍,太浪费时间了,痛感忘记记笔记是多么可怕的事情.鉴于Core Animation的内

iOS开发-语法篇-block详解

一:基本定义 /*初步上式block定义的一些理解和解释,接下来会详解: *block名为myBlock,结合C的函数指针,myBlock为block体的指针,指向block体的入口地址 *int result = myBlock(5) <==> ^(int num){return num*num}(5)//将5传给num *回调时可以将myBlock作为参数传入,也可以直接传入block体^(int num){…};// *整个block体作为参数传入时,往往没有参数,只是进行延迟运算作用,

iOS开发——深拷贝与浅拷贝详解

深拷贝和浅拷贝这个问题在面试中常常被问到,而在实际开发中,只要稍有不慎,就会在这里出现问题.尤其对于初学者来说,我们有必要来好好研究下这个概念.我会以实际代码来演示,相关示例代码上传至 这里 . 首先通过一句话来解释:深拷贝就是内容拷贝,浅拷贝就是指针拷贝. 深拷贝就是拷贝出和原来仅仅是值一样,但是内存地址完全不一样的新的对象,创建后和原对象没有任何关系.浅拷贝就是拷贝指向原来对象的指针,使原对象的引用计数+1,可以理解为创建了一个指向原对象的新指针而已,并没有创建一个全新的对象. (1)非容器