科大讯飞语音识别 Android SDK 1143 集成:从权限配置到结果解析的 7 个关键步骤
·
科大讯飞语音识别 Android SDK 1143 深度集成指南:从权限配置到动态修正优化
1. 开发环境准备与SDK获取
在开始集成讯飞语音识别SDK之前,需要确保开发环境满足以下要求:
- Android Studio :推荐使用最新稳定版本(当前为Arctic Fox 2020.3.1)
- Gradle版本 :7.0以上
- 目标API级别 :至少支持API 21(Android 5.0)
- 设备要求 :必须使用真机测试,模拟器无法正常运行
获取SDK的三种途径 :
- 官方下载:
wget https://mscdownload.xfyun.cn/sdk/iat/Android/iat1143_5b9f7458.zip - 通过Maven仓库引入(需配置私有仓库):
repositories { maven { url 'https://mscdownload.xfyun.cn/repository/maven-releases/' } } dependencies { implementation 'com.iflytek:msc:1.1.1143' } - 本地AAR集成:
implementation files('libs/Msc.jar')
注意:1143版本主要更新包括:
- 优化了16kHz音频的识别准确率
- 新增动态修正功能(仅中文普通话)
- 修复了内存泄漏问题
2. 项目配置关键步骤
2.1 权限声明与动态请求
在 AndroidManifest.xml 中添加基础权限声明:
<uses-permission android:name="android.permission.RECORD_AUDIO"/>
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"
android:maxSdkVersion="28"/>
动态权限请求的最佳实践:
private val REQUIRED_PERMISSIONS = arrayOf(
Manifest.permission.RECORD_AUDIO,
Manifest.permission.INTERNET,
Manifest.permission.ACCESS_NETWORK_STATE
)
fun checkPermissions(): Boolean {
return REQUIRED_PERMISSIONS.all {
ContextCompat.checkSelfPermission(this, it) == PackageManager.PERMISSION_GRANTED
}
}
fun requestPermissions() {
ActivityCompat.requestPermissions(
this,
REQUIRED_PERMISSIONS.filter {
ContextCompat.checkSelfPermission(this, it) != PackageManager.PERMISSION_GRANTED
}.toTypedArray(),
PERMISSION_REQUEST_CODE
)
}
2.2 初始化配置详解
创建自定义Application类进行全局初始化:
public class SpeechApp extends Application {
@Override
public void onCreate() {
super.onCreate();
// 参数说明:context, APPID+"="+你的APPID, 无空格
SpeechUtility.createUtility(this, SpeechConstant.APPID + "=5ef048e1");
// 开启SDK日志(仅调试时使用)
Setting.setLogLevel(Log.VERBOSE);
}
}
NDK配置示例(build.gradle):
android {
defaultConfig {
ndk {
abiFilters 'armeabi-v7a', 'arm64-v8a'
}
}
sourceSets {
main {
jniLibs.srcDirs = ['libs']
}
}
}
3. 核心功能实现
3.1 语音听写基础实现
初始化语音识别器:
// 初始化听写对象
mIat = SpeechRecognizer.createRecognizer(context, initListener);
// 初始化听写Dialog(带UI界面)
mIatDialog = new RecognizerDialog(context, initListener);
private InitListener initListener = code -> {
if (code != ErrorCode.SUCCESS) {
showToast("初始化失败,错误码:" + code);
}
};
参数配置模板:
public void setParam() {
mIat.setParameter(SpeechConstant.PARAMS, null);
// 引擎类型
mIat.setParameter(SpeechConstant.ENGINE_TYPE, SpeechConstant.TYPE_CLOUD);
// 返回结果格式
mIat.setParameter(SpeechConstant.RESULT_TYPE, "json");
// 语言设置
mIat.setParameter(SpeechConstant.LANGUAGE, "zh_cn");
mIat.setParameter(SpeechConstant.ACCENT, "mandarin");
// 前端点超时(静音检测)
mIat.setParameter(SpeechConstant.VAD_BOS, "4000");
// 后端点超时
mIat.setParameter(SpeechConstant.VAD_EOS, "1000");
// 标点符号设置
mIat.setParameter(SpeechConstant.ASR_PTT, "1");
// 开启动态修正(关键配置)
mIat.setParameter("dwa", "wpgs");
}
3.2 结果解析与动态修正处理
JSON结果解析增强版:
private void printResult(RecognizerResult results) {
String text = JsonParser.parseIatResult(results.getResultString());
try {
JSONObject resultJson = new JSONObject(results.getResultString());
String sn = resultJson.optString("sn");
String pgs = resultJson.optString("pgs");
String rg = resultJson.optString("rg");
// 动态修正处理
if ("rpl".equals(pgs)) {
String[] range = rg.replace("[", "")
.replace("]", "").split(",");
int start = Integer.parseInt(range[0]);
int end = Integer.parseInt(range[1]);
for (int i = start; i <= end; i++) {
mIatResults.remove(String.valueOf(i));
}
}
mIatResults.put(sn, text);
StringBuilder resultBuffer = new StringBuilder();
for (String key : mIatResults.keySet()) {
resultBuffer.append(mIatResults.get(key));
}
binding.tvResult.setText(resultBuffer.toString());
} catch (JSONException e) {
e.printStackTrace();
}
}
4. 高级功能实现
4.1 离线语音识别集成
离线资源文件配置:
- 将
iat/common.jet和iat/sms_16k.jet放入assets目录 - 设置离线资源路径:
mIat.setParameter(ResourceUtil.ASR_RES_PATH, getResourcePath());
private String getResourcePath() {
return ResourceUtil.generateResourcePath(this,
ResourceUtil.RESOURCE_TYPE.assets, "iat/common.jet") + ";" +
ResourceUtil.generateResourcePath(this,
ResourceUtil.RESOURCE_TYPE.assets, "iat/sms_16k.jet");
}
切换离线模式:
mIat.setParameter(SpeechConstant.ENGINE_TYPE, SpeechConstant.TYPE_LOCAL);
mIat.setParameter(SpeechConstant.ASR_AUDIO_PATH,
Environment.getExternalStorageDirectory() + "/msc/iat.wav");
4.2 音频流实时处理
实现PCM音频流识别:
// 设置音频来源为外部输入
mIat.setParameter(SpeechConstant.AUDIO_SOURCE, "-1");
// 开始识别
mIat.startListening(mRecognizerListener);
// 在音频回调中写入数据
public void onAudioData(byte[] buffer, int length) {
mIat.writeAudio(buffer, 0, length);
}
// 结束写入
mIat.stopListening();
5. 性能优化与问题排查
5.1 常见错误代码处理
| 错误码 | 含义 | 解决方案 |
|---|---|---|
| 10118 | 无有效识别结果 | 检查麦克风权限,确认音频格式为16kHz/16bit单声道 |
| 10204 | 网络连接超时 | 检查网络状态,适当增加超时时间 |
| 10407 | 无效的APPID | 确认APPID与应用包名匹配 |
| 20001 | 无录音权限 | 引导用户开启录音权限 |
5.2 内存优化建议
-
在Activity的onDestroy中释放资源:
@Override protected void onDestroy() { if (mIat != null) { mIat.cancel(); mIat.destroy(); } super.onDestroy(); } -
使用弱引用持有Context:
private WeakReference<Context> mContextRef; public void init(Context context) { mContextRef = new WeakReference<>(context); } -
限制最大识别时长:
mIat.setParameter(SpeechConstant.KEY_SPEECH_TIMEOUT, "60000"); // 60秒
6. 实战案例:语音输入框实现
完整的主Activity实现:
class MainActivity : AppCompatActivity() {
private lateinit var binding: ActivityMainBinding
private var mIat: SpeechRecognizer? = null
private val mIatResults = LinkedHashMap<String, String>()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root)
initSpeechRecognizer()
setupUI()
}
private fun initSpeechRecognizer() {
mIat = SpeechRecognizer.createRecognizer(this) { code ->
if (code != ErrorCode.SUCCESS) {
Toast.makeText(this, "初始化失败:$code", Toast.LENGTH_SHORT).show()
}
}
}
private fun setupUI() {
binding.btnStart.setOnClickListener {
if (!checkPermissions()) {
requestPermissions()
return@setOnClickListener
}
mIatResults.clear()
setRecognizerParams()
mIat?.startListening(recognizerListener)
}
}
private val recognizerListener = object : RecognizerListener {
override fun onResult(results: RecognizerResult?, isLast: Boolean) {
results?.let { parseResult(it) }
if (isLast) {
binding.tvStatus.text = "识别完成"
}
}
override fun onError(error: SpeechError) {
binding.tvStatus.text = "错误:${error.errorCode}"
}
// 其他回调方法...
}
override fun onDestroy() {
mIat?.destroy()
super.onDestroy()
}
}
7. 扩展功能与未来演进
多语言支持方案 :
// 英语识别设置
mIat.setParameter(SpeechConstant.LANGUAGE, "en_us");
mIat.setParameter(SpeechConstant.ACCENT, null);
// 方言支持(需特定资源包)
mIat.setParameter(SpeechConstant.ACCENT, "henanese");
自定义词表上传 :
-
创建hotword.txt文件:
科大讯飞 人工智能 AIoT -
上传词表:
mIat.setParameter(SpeechConstant.ENGINE_TYPE, "cloud"); mIat.setParameter(SpeechConstant.TEXT_ENCODING, "utf-8"); mIat.setParameter("nlp_version", "2.0"); mIat.setParameter("hotword_path", "/sdcard/hotword.txt");
性能对比数据 :
| 功能 | 在线模式 | 离线模式 |
|---|---|---|
| 响应时间 | 300-500ms | 100-200ms |
| 准确率 | 98% | 92% |
| 支持语言 | 中英日等8种 | 仅中文 |
| 网络依赖 | 必需 | 无需 |
在实际项目开发中,建议结合具体场景选择识别模式。对于实时性要求高但网络不稳定的环境,可采用离线优先+在线补充的混合策略
更多推荐

所有评论(0)