假如我们需要在自己的产品中加入语音识别功能,那么调用腾讯云语音识别接口直接得到返回将会是在产品开发的过程中,减少极大的前期研发投入,直接调用接口即可,那如何把一些语音识别的功能集成到我们的产品中呢。
现在我们以一句话语音识别为例的方向重新开发一款可以调用腾讯云语音识别的应用。
一句话识别的定义:对60秒之内的短音频文件进行识别,达到快速准确识别较短语音的效果,可应用于语音消息转写等场景;
创建QdOneSentenceRecognizeViewController.m这个主文件,在调用的过程中,官方的 .m 主文件有许多可以精简的地方。
Reachability.h
Reachability.m
Apple的例程Reachability介绍了取得/检测网络状态的方法。在开发web等网络应用程序的时候,需要确认网络环境、连接情况等信息。如果没有处理他们,是不会通过Apple的审查的。
如果开发的某款应用已经有了这个文件关于网络设定的这两个文件,可忽略,如果没有的话,就只需将该例程中的Reachability.m
和Reachability.h拷贝到你的工程网文件中。获取的该文件的方法就在iOS-SDK的项目文件中,这是一个开源文件。
UITableViewCell的创建方式:
UITableViewCell有个NSString *reuseIdentifier属性,可以在初始化UITableViewCell的时候传入一个特定的字符串标识来设置reuseIdentifier(一般用UITableViewCell的类名)。当UITableView要求dataSource返回UITableViewCell时,先通过一个字符串标识到对象池中查找对应类型的UITableViewCell对象,如果有,就重用,如果没有,就传入这个字符串标识来初始化一个UITableViewCell对象。
#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;
}
加载后的界面是非常简洁的样子,开发者可根据自己产品需求设计更多形式。
建议建立一个 .h文件专门用于存放APPID和密钥信息的。这样我们的敏感信息就不用写进主文件QdOneSentenceRecognizeViewController.m 中,这样做的好处是,安全且便于保存,以及当你在腾讯云有多个子账户时候,就直接拷贝余下工程文件进行二次开发;
//
// 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 */
也即上述的密钥安全设置
1)推荐创建 .h文件方式保存初始化信息。
//Appid是应用的身份信息,具有唯一性,初始化时必须要传入Appid
2) 第二种初始化方法
在文件QDOneSentenceRecognizeViewController.m下配置
[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身份信息的设置,前面也强调过这个的重要性。
那我们看下这个核实身份信息的功能是如何实现的。
- (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");
}
可见,在这里是进行了一个判断,当满足身份条件的话,才能正常使用。
根据界面提示,腾讯云的一句话识别提供了四种发送数据的方式。
首先看录音器初始化。
功能:在启动录音器前设置AVAudioSession的Category属性;
设置方法:
/**
* 通过传录音器调用一句话识别
*/
- (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表示采用默认设置(默认)
功能:在录音器是否显示一直录音状态的设置方法
[[AVAudioSession sharedInstance] setActive:YES
其中BOOL值:NO表示关闭;YES表示一直呈开启状态(默认)
一句话录制结束后才会上传语音信息,需要注意的是该语音不能超过60s,所以,如果上面的录音器一直设置成开启状态的话,没有在60秒内按下停止的话,发送到腾讯云的请求是会报错的。
/**
* 通过传递语音url调用一句话识别
*/
- (void)recognizeWithUrl
{
//语音数据url
NSString *url = @"http://liqiansunvoice-1255628450.cosgz.myqcloud.com/30s.wav";
//指定语音数据url 语音数据格式 采样率
BOOL didStart = [_recognizer recoginizeWithUrl:url voiceFormat:kQCloudVoiceFormatWAV frequence:kQCloudEngSerViceType16k];
[self startRecognize:didStart];
}
/**
* 通过传递自定义参数调用一句话识别
*/
- (void)recognizeWithParams
{
// NSString *url = @"http://liqiansunvoice-1255628450.cosgz.myqcloud.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];
}
/**
* 通过传递语音数据调用一句话识别
*/
- (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表示调用(默认)
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。