简介
假如我们需要在自己的产品中加入语音识别功能,那么调用腾讯云语音识别接口直接得到返回将会是在产品开发的过程中,减少极大的前期研发投入,直接调用接口即可,那如何把一些语音识别的功能集成到我们的产品中呢。
现在我们以一句话语音识别为例的方向重新开发一款可以调用腾讯云语音识别的应用。
一句话识别的定义:对60秒之内的短音频文件进行识别,达到快速准确识别较短语音的效果,可应用于语音消息转写等场景;
创建QdOneSentenceRecognizeViewController.m这个主文件,在调用的过程中,官方的 .m 主文件有许多可以精简的地方。
1. 网络设置
Reachability.h
Reachability.m
Apple的例程Reachability介绍了取得/检测网络状态的方法。在开发web等网络应用程序的时候,需要确认网络环境、连接情况等信息。如果没有处理他们,是不会通过Apple的审查的。
如果开发的某款应用已经有了这个文件关于网络设定的这两个文件,可忽略,如果没有的话,就只需将该例程中的Reachability.m
和Reachability.h拷贝到你的工程网文件中。获取的该文件的方法就在iOS-SDK的项目文件中,这是一个开源文件。
2. 界面设置
UITableViewCell的创建方式:
UITableViewCell有个NSString *reuseIdentifier属性,可以在初始化UITableViewCell的时候传入一个特定的字符串标识来设置reuseIdentifier(一般用UITableViewCell的类名)。当UITableView要求dataSource返回UITableViewCell时,先通过一个字符串标识到对象池中查找对应类型的UITableViewCell对象,如果有,就重用,如果没有,就传入这个字符串标识来初始化一个UITableViewCell对象。
代码语言:javascript复制#import "QDOneSentenceRecognizeViewController.h"
- (void)viewDidLoad {
[super viewDidLoad];
[self.tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:kDemoListCellIdentifier];
_dataSource = @[@{@"text": @"一句话识别", @"class" : NSStringFromClass([QDOneSentenceRecognizeViewController class])}];
self.tableView.tableFooterView = [[UIView alloc] initWithFrame:CGRectZero];
// Uncomment the following line to preserve selection between presentations.
// self.clearsSelectionOnViewWillAppear = NO;
// Uncomment the following line to display an Edit button in the navigation bar for this view controller.
// self.navigationItem.rightBarButtonItem = self.editButtonItem;
}
- 注册class,意思就是告诉tableView,首先去缓存池中找有没有可重用的cell,如果有,则拿过来重用;如果没有,那么根据之前注册的UITableViewCell这个类,来自动生成一个cell,并且给它绑定上重用identifier。
- 这个方法省去了我们自己手动创建cell, 但是也有不足:苹果提供给我们的cell的样式,除了默认的,我们都不能用了。
加载后的界面是非常简洁的样子,开发者可根据自己产品需求设计更多形式。
3. 密钥安全设置
建议建立一个 .h文件专门用于存放APPID和密钥信息的。这样我们的敏感信息就不用写进主文件QdOneSentenceRecognizeViewController.m 中,这样做的好处是,安全且便于保存,以及当你在腾讯云有多个子账户时候,就直接拷贝余下工程文件进行二次开发;
代码语言:javascript复制//
// QDDefine.h
// QCloudSDKDemo
//
// Created by Sword on 2019/4/12.
// Copyright © 2019 Tencent. All rights reserved.
//
#ifndef QDDefine_h
#define QDDefine_h
//#error please replace with your own info
#define kQDAppId @"你的APPID,获取地址在控制台"
#define kQDSecretId @"你的SecretID"
#define kQDSecretKey @"你的SecretKey"
#define kQDProjectId @"可以不添加,全局指定,也可以指定主文件名"
#endif /* QDDefine_h */
4.初始化设置
也即上述的密钥安全设置
1)推荐创建 .h文件方式保存初始化信息。
//Appid是应用的身份信息,具有唯一性,初始化时必须要传入Appid
2) 第二种初始化方法
在文件QDOneSentenceRecognizeViewController.m下配置
代码语言:javascript复制 [super viewDidLoad];
self.navigationItem.title = @"一句话识别";
_dataSource = [QDDemoModel getSentenceModels];
self.recognizedTextView.text = @"";
_tableView.tableFooterView = self.recognizedTextView;
[_tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:kOneSentenceCellIdentifier];
//appid secretId secretKey参数,从腾讯云官网申请
NSString *appId = kQDAppId;
NSString *secretId = kQDSecretId;
NSString *secretKey = kQDSecretKey;
如果依然选择使用了第二种初始化方式,可能会有的报错,
也就是QDAppDelegate.m文件下的
46 [self checkQCloudAppInfo];
这个是因为之前设定了核实了APPID身份信息的设置,前面也强调过这个的重要性。
那我们看下这个核实身份信息的功能是如何实现的。
代码语言:javascript复制- (void)checkQCloudAppInfo
{
NSAssert([kQDAppId length] > 0, @"appid is not set");
NSAssert([kQDSecretId length] > 0, @"secretId is not set");
NSAssert([kQDSecretKey length] > 0, @"secretKey is not set");
}
可见,在这里是进行了一个判断,当满足身份条件的话,才能正常使用。
5. 四种调用方式
根据界面提示,腾讯云的一句话识别提供了四种发送数据的方式。
首先看录音器初始化。
5.1 内置录音器调用
功能:在启动录音器前设置AVAudioSession的Category属性;
设置方法:
代码语言:javascript复制/**
* 通过传录音器调用一句话识别
*/
- (void)recognizeWithRecorder
{
if (_isRecording) {
_isRecording = NO;
[_recognizer stopRecognizeWithRecorder];
}
else {
if (![[AVAudioSession sharedInstance].category isEqualToString:AVAudioSessionCategoryRecord]) {
NSLog(@"set set audio session category");
NSError *error = nil;
[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryRecord error:&error];
if (error) {
NSLog(@"error %@", error);
}
[[AVAudioSession sharedInstance] setActive:YES error:nil];
}
self.recognizedTextView.text = @"";
[_recognizer startRecognizeWithRecorder];
}
}
其中参数值:0表示取消默认设置;1表示采用默认设置(默认)
5.1.1 录音器DEACTIVE参数
功能:在录音器是否显示一直录音状态的设置方法
代码语言:javascript复制[[AVAudioSession sharedInstance] setActive:YES
其中BOOL值:NO表示关闭;YES表示一直呈开启状态(默认)
一句话录制结束后才会上传语音信息,需要注意的是该语音不能超过60s,所以,如果上面的录音器一直设置成开启状态的话,没有在60秒内按下停止的话,发送到腾讯云的请求是会报错的。
5.2 传递语音url调用一句话识别
代码语言:javascript复制/**
* 通过传递语音url调用一句话识别
*/
- (void)recognizeWithUrl
{
//语音数据url
NSString *url = @"http://liqiansunvoice-1255628450.cosgz.myzijiebao.com/30s.wav";
//指定语音数据url 语音数据格式 采样率
BOOL didStart = [_recognizer recoginizeWithUrl:url voiceFormat:kQCloudVoiceFormatWAV frequence:kQCloudEngSerViceType16k];
[self startRecognize:didStart];
}
5.3 通过参数调用
代码语言:javascript复制/**
* 通过传递自定义参数调用一句话识别
*/
- (void)recognizeWithParams
{
// NSString *url = @"http://liqiansunvoice-1255628450.cosgz.myzijiebao.com/30s.wav";
//获取一个已设置默认参数params
QCloudSentenceRecognizeParams *params = [_recognizer defaultRecognitionParams];
// //通过语音url请求, 此4个参数必须设置
// params.url = url;
// //设置语音频数据格式,见kQCloudVoiceFormat定义
// params.voiceFormat = kQCloudVoiceFormatWAV;
// //设置语音数据来源,见QCloudAudioSourceType定义
// params.sourceType = QCloudAudioSourceTypeUrl;
// //设置采样率,见kQCloudEngSerViceType定义
// params.engSerViceType = kQCloudEngSerViceType16k;
NSString *filePath = [[NSBundle mainBundle] pathForResource:@"test2" ofType:@"mp3"];
NSData *audioData = [[NSData alloc] initWithContentsOfFile:filePath];
//通过语音数据发起请求, 此4个参数必须设置
params.data = audioData;
params.voiceFormat = kQCloudVoiceFormatMP3; //kQCloudVoiceFormatWAV or kQCloudVoiceFormatMP3
params.sourceType = QCloudAudioSourceTypeAudioData; // QCloudAudioSourceTypeUrl or QCloudAudioSourceTypeAudioData
params.engSerViceType = kQCloudEngSerViceType16k; // kQCloudEngSerViceType8k or kQCloudEngSerViceType16k
BOOL didStart = [_recognizer recognizeWithParams:params];
[self startRecognize:didStart];
}
5.4 语音数据调用
代码语言:javascript复制/**
* 通过传递语音数据调用一句话识别
*/
- (void)recognizeWithData
{
//语音数据
// NSString *filePath = [[NSBundle mainBundle] pathForResource:@"recordedFile" ofType:@"wav"];
NSString *filePath = [[NSBundle mainBundle] pathForResource:@"30s" ofType:@"wav"];
NSData *audioData = [[NSData alloc] initWithContentsOfFile:filePath];
//指定语音数据 语音数据格式 采样率
BOOL didStart = [_recognizer recoginizeWithData:audioData voiceFormat:kQCloudVoiceFormatWAV frequence:kQCloudEngSerViceType16k];
[self startRecognize:didStart];
• 一句话接口用于对60秒之内的短音频文件进行识别。
• 支持中文普通话、英语、粤语。
• 支持本地语音文件上传和语音URL上传两种请求方式。
• 音频格式支持wav、mp3;采样率支持8000Hz或者16000Hz;采样精度支持16bits;声道支持单声道。
• 当音频文件通过请求中body内容上传时,请求大小不能超过600KB;当音频以URL方式传输时,音频时长不可超过60s。
• 所有请求参数放在POST请求的body中,编码类型采用x-www-form-urlencoded,参数进行urlencode编码后传输。
其中参数值:0表示不调用;1表示调用(默认)