目录
[1.1 讯飞语音识别介绍](#1.1 讯飞语音识别介绍)
[1.1.1 功能特点](#1.1.1 功能特点)
[1.1.2 优势](#1.1.2 优势)
[1.2 接入流程](#1.2 接入流程)
[1.2.1 注册账号并创建应用](#1.2.1 注册账号并创建应用)
[1.2.2 下载SDK等相关资料](#1.2.2 下载SDK等相关资料)
[1.2.3 导入SDK](#1.2.3 导入SDK)
[1.2.4 添加用户权限](#1.2.4 添加用户权限)
[1.2.5 初始化讯飞SDK](#1.2.5 初始化讯飞SDK)
[1.2.6 初始化语音识别对象](#1.2.6 初始化语音识别对象)
[1.2.7 显示结果](#1.2.7 显示结果)
[2.1 腾讯云语音识别介绍](#2.1 腾讯云语音识别介绍)
[2.1.1 功能特点](#2.1.1 功能特点)
[2.1.2 优势](#2.1.2 优势)
[2.2 接入流程](#2.2 接入流程)
[2.2.1 注册腾讯云账号](#2.2.1 注册腾讯云账号)
[2.2.2 获取相关的凭证信息](#2.2.2 获取相关的凭证信息)
[2.2.3 下载SDK等相关资料](#2.2.3 下载SDK等相关资料)
[2.2.4 导入SDK和添加其他依赖](#2.2.4 导入SDK和添加其他依赖)
[2.2.5 添加用户权限](#2.2.5 添加用户权限)
[2.2.6 初始化腾讯云SDK](#2.2.6 初始化腾讯云SDK)
[2.2.7 设置识别结果回调](#2.2.7 设置识别结果回调)
[2.2.8 录音文件直接识别](#2.2.8 录音文件直接识别)
[2.2.9 录音并识别语音](#2.2.9 录音并识别语音)
[2.2.10 recognize 介绍](#2.2.10 recognize 介绍)
在 移动端 接入语音识别方面,讯飞和腾讯云都是优秀的选择,但各有其特点和优势。以下是对两者的详细比较:
一、讯飞语音识别
1.1 讯飞语音识别介绍
1.1.1 功能特点
1.提供全面的语音识别功能,包括实时语音识别和离线语音识别。
2.支持多种语言识别,满足不同语种用户的需求。(普通话/英语免费,其他语音可试用半年。试用到期后需单独购买,价格为:2万/个/年)
3.提供丰富的SDK和API接口,方便开发者集成和使用。
1.1.2 优势
1.讯飞在语音识别领域有较高的知名度和市场占有率。
2.提供了详细的开发文档和示例代码,方便开发者快速上手。
3.支持定制化开发,可以根据用户需求进行个性化定制。
1.2 接入流程
1.2.1 注册账号并创建应用
注册讯飞开放平台账号,创建应用并获得AppID。
1.2.2 下载SDK等相关资料
直接下载SDK,SDK中包含简易可运行的Demo。
1.2.3 导入SDK
将在官网下载的Android SDK 压缩包中libs目录下所有子文件拷贝至Android工程的libs目录下。
sdk下文件夹main/assets/,自带UI页面(iflytek文件夹)和相关其他服务资源文件(语法文件、音频示例、词表),使用自带UI接口时,可以将assets/iflytek文件拷贝到项目中;我这用到是自己写的界面所以仅导入了libs目录下文件。
1.2.4 添加用户权限
在工程 AndroidManifest.xml 文件中添加如下权限,在实际项目中还需要动态申请权限。
java
<!--连接网络权限,用于执行云端语音能力 -->
<uses-permission android:name="android.permission.INTERNET"/>
<!--获取手机录音机使用权限,听写、识别、语义理解需要用到此权限 -->
<uses-permission android:name="android.permission.RECORD_AUDIO"/>
<!--读取网络信息状态 -->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<!--获取当前wifi状态 -->
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
<!--允许程序改变网络连接状态 -->
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE"/>
<!--读取手机信息权限 -->
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
<!--读取联系人权限,上传联系人需要用到此权限 -->
<uses-permission android:name="android.permission.READ_CONTACTS"/>
<!--外存储写权限,构建语法需要用到此权限 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<!--外存储读权限,构建语法需要用到此权限 -->
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<!--配置权限,用来记录应用配置信息 -->
<uses-permission android:name="android.permission.WRITE_SETTINGS"/>
<!--手机定位信息,用来为语义等功能提供定位,提供更精准的服务-->
<!--定位信息是敏感信息,可通过Setting.setLocationEnable(false)关闭定位请求 -->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<!--如需使用人脸识别,还要添加:摄像头权限,拍照需要用到 -->
<uses-permission android:name="android.permission.CAMERA" />
注意:如需在打包或者生成APK的时候进行混淆,请在proguard.cfg中添加如下代码:
Groovy
-keep class com.iflytek.**{*;}
-keepattributes Signature
1.2.5 初始化讯飞SDK
初始化即创建语音配置对象,只有初始化后才可以使用MSC的各项服务。建议将初始化放在程序入口处(如Application、Activity的onCreate方法),初始化代码如下:
java
// 将"12345678"替换成您申请的APPID,申请地址:http://www.xfyun.cn
// 请勿在"="与appid之间添加任何空字符或者转义符
SpeechUtility.createUtility(context, SpeechConstant.APPID +"=12345678");
// public class SpeechConstant {
// public static final java.lang.String APPID = "appid";
// ......
// }
1.2.6 初始化语音识别对象
java
private void initSpeech() {
// 使用SpeechRecognizer对象,可根据回调消息自定义界面;
mIat = SpeechRecognizer.createRecognizer(this, mInitListener);
setParam();
}
/**
* 初始化监听器。
*/
private InitListener mInitListener = code -> {
Log.d(TAG, "SpeechRecognizer init() code = " + code);
if (code != ErrorCode.SUCCESS) {
//showTip("初始化失败,错误码:" + code + ",请点击网址https://www.xfyun.cn/document/error-code查询解决方案");
}
};
/**
* 参数设置
*
* @return
*/
public void setParam() {
if (mIat != null) {
// 清空参数
mIat.setParameter(SpeechConstant.PARAMS, null);
// 设置听写引擎,此处engineType为"cloud"
mIat.setParameter( SpeechConstant.ENGINE_TYPE, engineType );
//设置返回结果格式,目前支持json,xml以及plain 三种格式,其中plain为纯听写文本内容
mIat.setParameter(SpeechConstant.RESULT_TYPE, "json");
// 设置语言(目前普通话,可切换成英文)
mIat.setParameter(SpeechConstant.LANGUAGE, "zh_cn");
// 设置语言区域
mIat.setParameter(SpeechConstant.ACCENT, "mandarin");
// 设置语音前端点:静音超时时间,即用户多长时间不说话则当做超时处理
//取值范围{1000~10000}
mIat.setParameter(SpeechConstant.VAD_BOS, "10000");
// 设置语音后端点:后端点静音检测时间,即用户停止说话多长时间内即认为不再输入, 自动停止录音
//取值范围{1000~10000}
mIat.setParameter(SpeechConstant.VAD_EOS, "1000");
// 设置标点符号,设置为"0"返回结果无标点,设置为"1"返回结果有标点
mIat.setParameter(SpeechConstant.ASR_PTT, "0");
// 设置音频保存路径,保存音频格式支持pcm、wav.
mIat.setParameter(SpeechConstant.AUDIO_FORMAT, "wav");
mIat.setParameter(SpeechConstant.ASR_AUDIO_PATH,
getExternalFilesDir("msc").getAbsolutePath() + "/iat.wav");
}
}
1.2.7 开始录音
java
public void startListen() {
buffer.setLength(0);
mIatResults.clear();
int ret = mIat.startListening(mRecognizerListener);
if (ret != ErrorCode.SUCCESS) {
Log.d(TAG, "听写失败,错误码:" + ret + ",请点击网址https://www.xfyun.cn/document/error-code查询解决方案");
} else {
Log.d(TAG, "开始说话");
if (!isSoundRecording){
isSoundRecording = true;
runOnUiThread(() -> {
binding.llSoundRecording.setVisibility(View.VISIBLE);
binding.ivStopSoundRecording.setVisibility(View.VISIBLE);
if (animationDrawable != null) {
animationDrawable.start();
}
});
}
}
}
/**
* 听写监听器。
*/
private RecognizerListener mRecognizerListener = new RecognizerListener() {
@Override
public void onBeginOfSpeech() {
// 此回调表示:sdk内部录音机已经准备好了,用户可以开始语音输入
Log.d(TAG, "RecognizerListener.onEvent:sdk内部录音机已经准备好了,用户可以开始语音输入");
}
@Override
public void onError(SpeechError error) {
// Tips:
// 错误码:10118(您没有说话),可能是录音机权限被禁,需要提示用户打开应用的录音权限。
Log.d(TAG, "RecognizerListener.onError " + error.getPlainDescription(true));
}
@Override
public void onEndOfSpeech() {
// 此回调表示:检测到了语音的尾端点,已经进入识别过程,不再接受语音输入
Log.d(TAG, "RecognizerListener.onEndOfSpeech ");
}
@Override
public void onResult(RecognizerResult recognizerResult, boolean b) {
Log.d(TAG, "RecognizerListener.onResult 结束" + recognizerResult.getResultString());
Log.d(TAG, results.getResultString());
if (isLast) {
Log.d(TAG, "onResult 结束");
}
//设置返回结果格式,目前支持json,xml以及plain 三种格式,其中plain为纯听写文本内容
//mIat.setParameter(SpeechConstant.RESULT_TYPE, "json");
//在初始化的时候我们设置的事json,所以处理json就可以了。
if (resultType.equals("json")) {
printResult(results);
return;
}
// if (resultType.equals("plain")) {
// buffer.append(results.getResultString());
// mResultText.setText(buffer.toString());
// mResultText.setSelection(mResultText.length());
// }
}
@Override
public void onVolumeChanged(int volume, byte[] data) {
Log.d(TAG, "RecognizerListener.onVolumeChanged");
}
@Override
public void onEvent(int eventType, int arg1, int arg2, Bundle obj) {
Log.d(TAG, "RecognizerListener.onEvent" + eventType);
}
};
1.2.7 显示结果
拿到结果,那后面还不是你说了算
java
private HashMap<String, String> mIatResults = new LinkedHashMap<>();
/**
* 显示结果
*/
private void printResult(RecognizerResult results) {
String text = JsonParser.parseIatResult(results.getResultString());
String sn = null;
// 读取json结果中的sn字段
try {
JSONObject resultJson = new JSONObject(results.getResultString());
sn = resultJson.optString("sn");
} catch (JSONException e) {
e.printStackTrace();
}
mIatResults.put(sn, text);
StringBuffer resultBuffer = new StringBuffer();
for (String key : mIatResults.keySet()) {
resultBuffer.append(mIatResults.get(key));
}
mResultText.setText(resultBuffer.toString());
mResultText.setSelection(mResultText.length());
}
讯飞错误码:错误码查询 - 讯飞
讯飞官方文档:语音听写 Android SDK 文档 | 讯飞
二、腾讯云语音识别
2.1 腾讯云语音识别介绍
2.1.1 功能特点
腾讯云语音识别(ASR)基于深度学习技术,具备较高的语音识别准确性。
提供实时语音识别和离线语音识别两种类型,满足不同场景需求。
支持多种语种和方言识别,如中文、英文、粤语等。
2.1.2 优势
腾讯云作为国内领先的云服务提供商,拥有强大的技术实力和丰富的应用场景。
提供了丰富的语音识别和语音合成产品,可以满足开发者多样化的需求。
提供了可视化控制台和详尽的API文档,方便开发者进行配置和管理。
2.2 接入流程
2.2.1 注册腾讯云账号
注册腾讯云账号(需要个人实名认证/企业认证),并在控制台中创建语音识别应用。
2.2.2 获取相关的凭证信息
获取相关的凭证信息(如SecretId和SecretKey),用于后续的API调用。
2.2.3 下载SDK等相关资料
直接下载SDK,SDK中包含简易可运行的Demo。
2.2.4 导入SDK和添加其他依赖
添加录音文件识别 SDK aar,将 asr-file-recognize-release.aar 放在 libs 目录下,在 App 的 build.gradle 文件中添加。
Groovy
implementation(name: 'asr-file-recognize-release', ext: 'aar')
implementation 'com.google.code.gson:gson:2.8.5'
2.2.5 添加用户权限
在工程 AndroidManifest.xml 文件中添加如下权限,在实际项目中还需要动态申请权限。
Groovy
< uses-permission android:name="android.permission.INTERNET"/>
<!--获取手机录音机使用权限,听写、识别、语义理解需要用到此权限 -->
<uses-permission android:name="android.permission.RECORD_AUDIO"/>
<!--读取网络信息状态 -->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<!--获取当前wifi状态 -->
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
<!--允许程序改变网络连接状态 -->
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE"/>
<!--外存储写权限,构建语法需要用到此权限 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<!--外存储读权限,构建语法需要用到此权限 -->
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
注意:如需在打包或者生成APK的时候进行混淆,请在proguard.cfg中添加如下代码:
Groovy
-keepclasseswithmembernames class * { # 保持 native 方法不被混淆
native <methods>;
}
-keep public class com.tencent.cloud.qcloudasrsdk.*
2.2.6 初始化腾讯云SDK
java
int appId = xxxxx;
int projectId = 0; //此参数固定为0;
String secretId = "xxxxxx";
String secretKey = "xxx";
if (fileFlashRecognizer == null) {
/**直接鉴权**/
fileFlashRecognizer = new QCloudFlashRecognizer(appId, secretId, secretKey);
/**使用临时密钥鉴权
* * 1.通过sts 获取到临时证书 (secretId secretKey token) ,此步骤应在您的服务器端实现,见https://cloud.tencent.com/document/product/598/33416
* 2.通过临时密钥调用接口
* **/
// fileFlashRecognizer = new QCloudFlashRecognizer(DemoConfig.apppId, "临时secretId", "临时secretKey","对应的token");
}
2.2.7 设置识别结果回调
java
//设置识别结果回调
fileFlashRecognizer.setCallback(this);
public interface QCloudFlashRecognizerListener {
/**
* 识别结果回调
* @param recognizer 录音文件识别实例
* @param result 服务器返回的识别结果 api文档 https://cloud.tencent.com/document/product/1093/52097
* @param exception 异常信息
*
*/
void recognizeResult(QCloudFlashFileRecognizer recognizer,String result, int status,Exception exception);
}
//录音文件识别结果回调 ,详见api文档 https://cloud.tencent.com/document/product/1093/52097
@Override
public void recognizeResult(QCloudFlashRecognizer recognizer, String result, Exception exception) {
showLoading(false);
mStartRec.setEnabled(true);
mRecognize.setEnabled(true);
Log.i(this.getClass().getName(), result);
TextView textView = findViewById(R.id.recognize_flash_text_view);
if (exception != null){
textView.setText(exception.getLocalizedMessage());
}else {
textView.setText(result);
}
if (mPcmTmpFile != null){
mPcmTmpFile.delete();
mPcmTmpFile = null;
}
}
2.2.8 录音文件直接识别
java
InputStream is = null;
try {
AssetManager am = getResources().getAssets();
is = am.open("test2.mp3");
int length = is.available();
byte[] audioData = new byte[length];
is.read(audioData);
QCloudFlashRecognitionParams params = (QCloudFlashRecognitionParams) QCloudFlashRecognitionParams.defaultRequestParams();
/**支持传音频文件数据或者音频文件路径,如果同时调用setData和setPath,sdk内将忽略setPath
* 音频文件支持100M以内的文件,如果使用setData直接传音频文件数据,需要避免数据过大引发OOM,大文件建议传路径
* setVoiceFormat必须正确,否则服务器端将无法解析
* 参数解释详解API文档https://cloud.tencent.com/document/product/1093/52097
* **/
params.setData(audioData);
// params.setPath("/sdcard/test2.mp3"); //需要读写权限
params.setVoiceFormat("mp3"); //音频格式。支持 wav、pcm、ogg-opus、speex、silk、mp3、m4a、aac。
/**以下参数不设置将使用默认值**/
// params.setEngineModelType("16k_zh");//引擎模型类型,默认16k_zh。8k_zh:8k 中文普通话通用;16k_zh:16k 中文普通话通用;16k_zh_video:16k 音视频领域。
// params.setFilterDirty(0);// 0 :默认状态 不过滤脏话 1:过滤脏话
// params.setFilterModal(0);// 0 :默认状态 不过滤语气词 1:过滤部分语气词 2:严格过滤
// params.setFilterPunc(0);// 0 :默认状态 不过滤句末的句号 1:滤句末的句号
// params.setConvertNumMode(1);//1:默认状态 根据场景智能转换为阿拉伯数字;0:全部转为中文数字。
// params.setSpeakerDiarization(0); //是否开启说话人分离(目前支持中文普通话引擎),默认为0,0:不开启,1:开启。
// params.setFirstChannelOnly(1); //是否只识别首个声道,默认为1。0:识别所有声道;1:识别首个声道。
// params.setWordInfo(0); //是否显示词级别时间戳,默认为0。0:不显示;1:显示,不包含标点时间戳,2:显示,包含标点时间戳。
/**网络超时时间。
* 注意:如果设置过短的时间,网络超时断开将无法获取到识别结果;
* 如果网络断开前音频文件已经上传完成,将会消耗该音频时长的识别额度
* **/
// params.setConnectTimeout(30 * 1000);//单位:毫秒,默认30秒
// params.setReadTimeout(600 * 1000);//单位:毫秒,默认10分钟
// params.setReinforceHotword(1); // 开启热词增强
// params.setSentenceMaxLength(10);
long ret = 0;
ret = fileFlashRecognizer.recognize(params);
if (ret >= 0) {
showLoading(true);
mStartRec.setEnabled(false);
mRecognize.setEnabled(false);
}
} catch (IOException e) {
showLoading(false);
onMessage("录音文件不存在");
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (is != null) is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
2.2.9 录音并识别语音
java
if (mRecord == null) {
mRecord = new PcmAudioRecord(); //调用系统录音器录音,调用前请先申请权限
}
try {
mPcmTmpFile = File.createTempFile("pcm_temp", ".pcm");
boolean ret = mRecord.start(mPcmTmpFile);
if (ret == false) {
onMessage("录音器启动失败,请检查权限");
return;
}
isRecording = true;
showLoading(true);
mRecognize.setEnabled(false);
mStartRec.setText("stopRecord");
} catch (IOException e) {
e.printStackTrace();
mStartRec.setEnabled(true);
mRecognize.setEnabled(true);
return;
}
} else
{
if (mRecord == null) {
mStartRec.setEnabled(true);
mRecognize.setEnabled(true);
return;
}
mRecord.stop();
QCloudFlashRecognitionParams params = (QCloudFlashRecognitionParams) QCloudFlashRecognitionParams.defaultRequestParams();
params.setPath(mPcmTmpFile.getPath()); //需要读写权限
params.setVoiceFormat("pcm");
params.setReinforceHotword(1); // 开启热词增强
try {
long ret = fileFlashRecognizer.recognize(params);
if (ret >= 0) {
showLoading(true);
mStartRec.setEnabled(false);
mRecognize.setEnabled(false);
isRecording = false;
Button btn = findViewById(R.id.recognize_start_record);
btn.setText("startRecord");
showLoading(true);
mStartRec.setEnabled(false);
}
} catch (Exception e) {
e.printStackTrace();
}
}
2.2.10 recognize 介绍
java
public class QCloudFlashRecognizer extends com.tencent.cloud.qcloudasrsdk.filerecognize.QCloudBaseRecognizer implements com.tencent.cloud.qcloudasrsdk.filerecognize.network.QCloudFlashRecognizeTaskListener {
/**
* 初始化方法
*
* @param activity app activity
* @param appId 腾讯云 appid
* @param secretId 腾讯云 secretId
* @param secretKey 腾讯云 secretKey
*/
public QCloudFlashRecognizer(String appId, String secretId, String secretKey);
/* * 通过 url 或语音数据调用录音文件识别
* @param params 请求参数
* @return 返回本次请求的唯一标识别 requestId
*/
public long recognize(QCloudFlashRecognitionParams params) throws Exception;
}
在Android项目中调用腾讯云的语音识别API,并处理识别结果。
腾讯云语音识别:录音文件识别极速版-腾讯云
三、选择建议
讯飞语音识别免费额度: 每天500条识别。
腾讯云免费额度:一句话语音识别(每月5000条)、录音文件识别(每月10小时)。
综上所述,讯飞和腾讯云都是优秀的Android语音识别解决方案。开发者在选择时,应根据自身需求、成本因素和用户评价进行综合考虑。
相关推荐
Android SDK 遇到的坑之 AIUI(星火大模型)-CSDN博客文章浏览阅读3.4k次,点赞92次,收藏66次。需要给桌面机器人(医康养)应用做语音指引/控制/健康咨询等功能。AIUI常见错误:唤醒无效;错误码:600103;错误码:600022。_aiui android sdk 配置唤醒词https://shuaici.blog.csdn.net/article/details/141430041Android SDK 遇到的坑之讯飞语音合成-CSDN博客文章浏览阅读1.9k次,点赞50次,收藏36次。loadLibrary msc error:java.lang.UnsatisfiedLinkError: dlopen failed: library "libmsc.so" not found组件未安装.(错误码:21002)_组件未安装.(错误码:21002)https://shuaici.blog.csdn.net/article/details/141169429