Android开发中实时语音开发之华为实时语音识别

上一篇(Android开发中,百度语音集成之一)简单的讲解了百度语音的识别,今天讲解一个华为的语音识别:

 1.初始化: initRecognizer()mSpeechRecognizer = MLAsrRecognizer.createAsrRecognizer(context)
mSpeechRecognizer.setAsrListener(SpeechRecognitionListener()) 2.开始录音:startRecognizing() val mSpeechRecognizerIntent = Intent(MLAsrConstants.ACTION_HMS_ASR_SPEECH)// 通过Intent进行语音识别参数设置。mSpeechRecognizerIntent// 设置识别语言为英语,若不设置,则默认识别英语。支持设置:"zh-CN":中文;"en-US":英语;"fr-FR":法语;"es-ES":西班牙语;"de-DE":德语;"it-IT":意大利语;"ar":阿拉伯语;"th=TH":泰语;"ms-MY":马来语;"fil-PH":菲律宾语;"tr-TR":土耳其语。.putExtra(MLAsrConstants.LANGUAGE, "zh-CN") // 设置识别文本返回模式为边识别边出字,若不设置,默认为边识别边出字。支持设置:// MLAsrConstants.FEATURE_WORDFLUX:通过onRecognizingResults接口,识别同时返回文字;// MLAsrConstants.FEATURE_ALLINONE:识别完成后通过onResults接口返回文字。.putExtra(MLAsrConstants.FEATURE, MLAsrConstants.FEATURE_WORDFLUX) // 设置使用场景,MLAsrConstants.SCENES_SHOPPING:表示购物,仅支持中文,该场景对华为商品名识别进行了优化。
//            .putExtra(MLAsrConstants.SCENES, MLAsrConstants.SCENES_SHOPPING)// 启动语音识别。mSpeechRecognizer.startRecognizing(mSpeechRecognizerIntent)   3.结束录音:destroy()

mSpeechRecognizer.destroy()

最后附上全部的代码以供参考:

class SpeechToTextHelper(private val context: Context) {private val TAG = "SpeechToTextHelper"lateinit var mSpeechRecognizer: MLAsrRecognizerprivate val REQUEST_CODE_ASR = 100private var recognizing: ((Boolean, String?, String?) -> Unit)? = null/*** 初始化* recognizing回调可能会调用多次,测试结果:声音识别成功也返回了无效的服务错误提示*  @param recognizing Boolean: 是否开始记录,开始录音返回(true,null, null)*                     String?: 录音结果实时返回(true, "xxx", null)*                     String?: 录音结果最终返回(false, null, "xxx")*                     异常反回:(false, null, null)*/fun initRecognizer(recognizing: ((recognizing : Boolean, recognizingResult: String?, result: String?) -> Unit)) {Log.d(TAG, "###initRecognizer###")this.recognizing = recognizingmSpeechRecognizer = MLAsrRecognizer.createAsrRecognizer(context)mSpeechRecognizer.setAsrListener(SpeechRecognitionListener())}/*** 开始录音* 一定时间未输入语音会自动终止,只需要重新调用此方法就可以再次开启录音功能*/fun startRecognizing() {Log.d(TAG, "###startRecognizing###")// 新建Intent,用于配置语音识别参数。val mSpeechRecognizerIntent = Intent(MLAsrConstants.ACTION_HMS_ASR_SPEECH)// 通过Intent进行语音识别参数设置。mSpeechRecognizerIntent// 设置识别语言为英语,若不设置,则默认识别英语。支持设置:"zh-CN":中文;"en-US":英语;"fr-FR":法语;"es-ES":西班牙语;"de-DE":德语;"it-IT":意大利语;"ar":阿拉伯语;"th=TH":泰语;"ms-MY":马来语;"fil-PH":菲律宾语;"tr-TR":土耳其语。.putExtra(MLAsrConstants.LANGUAGE, "zh-CN") // 设置识别文本返回模式为边识别边出字,若不设置,默认为边识别边出字。支持设置:// MLAsrConstants.FEATURE_WORDFLUX:通过onRecognizingResults接口,识别同时返回文字;// MLAsrConstants.FEATURE_ALLINONE:识别完成后通过onResults接口返回文字。.putExtra(MLAsrConstants.FEATURE, MLAsrConstants.FEATURE_WORDFLUX) // 设置使用场景,MLAsrConstants.SCENES_SHOPPING:表示购物,仅支持中文,该场景对华为商品名识别进行了优化。
//            .putExtra(MLAsrConstants.SCENES, MLAsrConstants.SCENES_SHOPPING)// 启动语音识别。mSpeechRecognizer.startRecognizing(mSpeechRecognizerIntent)}/*** 释放资源* 不再使用时调用此方法*/fun destroy() {Log.d(TAG, "###destroy###")mSpeechRecognizer.destroy()}// 回调实现MLAsrListener接口,实现接口中的方法。internal inner class SpeechRecognitionListener : MLAsrListener {//获取实时声音输出KEYprivate val RESULT_RECOGNIZING_KEY = "results_recognizing"//获取声音输出结果KEYprivate val RESULT_RECOGNIZED_KEY = "results_recognized"override fun onStartListening() {// 录音器开始接收声音。recognizing?.let { it(true, null, null) }Log.d(TAG, "###onStartListening###")}override fun onStartingOfSpeech() {// 用户开始讲话,即语音识别器检测到用户开始讲话。Log.d(TAG, "###onStartingOfSpeech###")}override fun onVoiceDataReceived(data: ByteArray, energy: Float, bundle: Bundle) {// 返回给用户原始的PCM音频流和音频能量,该接口并非运行在主线程中,返回结果需要在子线程中处理。}override fun onRecognizingResults(partialResults: Bundle) {// 从MLAsrRecognizer接收到持续语音识别的文本,该接口并非运行在主线程中,返回结果需要在子线程中处理。val result = getOnResult(partialResults, RESULT_RECOGNIZING_KEY)Log.d(TAG, "###onRecognizingResults : $result")recognizing?.let { it(true, result, null) }}override fun onResults(results: Bundle) {// 语音识别的文本数据,该接口并非运行在主线程中,返回结果需要在子线程中处理。val result = getOnResult(results, RESULT_RECOGNIZED_KEY)Log.d(TAG, "###onResults : $result")recognizing?.let { it(false, null, result) }}override fun onError(error: Int, errorMessage: String) {// 识别发生错误后调用该接口,该接口并非运行在主线程中,返回结果需要在子线程中处理。Log.d(TAG, "###onError : $error --> $errorMessage")recognizing?.let { it(false, null, null) }}override fun onState(state: Int, params: Bundle) {// 通知应用状态发生改变,该接口并非运行在主线程中,返回结果需要在子线程中处理。}}/*** 解析返回结果*/private fun getOnResult(partialResults: Bundle, key: String): String? {return partialResults.getString(key)}fun startHWUIRecognizing(activity: Activity) {val intent = Intent(activity, MLAsrCaptureActivity::class.java)// 设置识别语言为英语,若不设置,则默认识别英语。支持设置:"zh-CN":中文;"en-US":英语;"fr-FR":法语;"es-ES":西班牙语;"de-DE":德语;"it-IT":意大利语;"ar": 阿拉伯语;"ru-RU":俄语;“th_TH”:泰语;“ms_MY”:马来语;“fil_PH”:菲律宾语;"tr-TR":土耳其语。.putExtra(MLAsrCaptureConstants.LANGUAGE, "zh-CN")// 设置拾音界面是否显示识别结果,MLAsrCaptureConstants.FEATURE_ALLINONE为不显示,MLAsrCaptureConstants.FEATURE_WORDFLUX为显示。.putExtra(MLAsrCaptureConstants.FEATURE, MLAsrCaptureConstants.FEATURE_WORDFLUX)// 设置使用场景,MLAsrConstants.SCENES_SHOPPING:表示购物,仅支持中文,该场景对华为商品名识别进行了优化。.putExtra(MLAsrConstants.SCENES,MLAsrConstants.SCENES_SHOPPING)// REQUEST_CODE_ASR表示当前Activity和拾音界面Activity之间的请求码,通过该码可以在当前Activity中获取拾音界面的处理结果。activity.startActivityForResult(intent, REQUEST_CODE_ASR)}/*** 解析华为UI返回结果* 返回null为发生异常,正常数据为非null数据*/fun onActivityResult(callback: (String?) -> Unit, requestCode: Int, resultCode: Int, data: Intent?): Boolean {var text = ""// REQUEST_CODE_ASR是第3步中定义的当前Activity和拾音界面Activity之间的请求码。if (requestCode == REQUEST_CODE_ASR) {when (resultCode) {MLAsrCaptureConstants.ASR_SUCCESS -> if (data != null) {val bundle = data.extras// 获取语音识别得到的文本信息。if (bundle!!.containsKey(MLAsrCaptureConstants.ASR_RESULT)) {text = bundle.getString(MLAsrCaptureConstants.ASR_RESULT).toString()// 识别得到的文本信息处理。println("####result : $text###")callback(text)}}MLAsrCaptureConstants.ASR_FAILURE -> {              // 识别失败处理。if (data != null) {val bundle = data.extras// 判断是否包含错误码。if (bundle!!.containsKey(MLAsrCaptureConstants.ASR_ERROR_CODE)) {val errorCode = bundle.getInt(MLAsrCaptureConstants.ASR_ERROR_CODE)// 对错误码进行处理。}// 判断是否包含错误信息。if (bundle.containsKey(MLAsrCaptureConstants.ASR_ERROR_MESSAGE)) {val errorMsg = bundle.getString(MLAsrCaptureConstants.ASR_ERROR_MESSAGE)// 对错误信息进行处理。}//判断是否包含子错误码。if (bundle.containsKey(MLAsrCaptureConstants.ASR_SUB_ERROR_CODE)) {val subErrorCode =bundle.getInt(MLAsrCaptureConstants.ASR_SUB_ERROR_CODE)// 对子错误码进行处理。}}callback(null)}else -> {callback(null)}}return true} else {return false}}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/239374.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

前端案例—antdDesign的Select多选框组件加上全选功能

前端案例—antdDesign的Select多选框组件加上全选功能。 实现效果如下: Select 组件里有这个属性,可以利用这个对下拉菜单进行自定义。 const handleChange (e, value) > {setSelectState(e.target.checked)let arr productOptions?productOption…

【开源工程及源码】超级经典开源项目实景三维数字孪生智慧港口

智慧港口可视化平台,旨在实现对港口运营的全面监测、智能管理和优化决策。飞渡科技利用数字化、模拟和仿真的技术,通过互联的传感器和设备,实现实时数据的采集、传输和分析,将港口内外的复杂数据以直观、易懂的方式呈现&#xff0…

java通过stream实现字符串与map互转

题目如下 String data "1:a,2:b,3:c"; 1.编写一个方法将以上格式的字符串转换为一个map, key为:前的字符串, value为:后的字符串, 键值对用,分隔; 2.编写一个方法将上面生成的map还原成原始字符串,对key进行倒序 要求使用stream进行处理 这个…

Qt配置opencv,cmake编译参考笔记,已成功

Qt版本:Qt5.14.2 opencv:4.5.4(不要用4.5.5!!很坑别问我为什么知道) cmake:下的最新版本 前言:为什么非得要用cmake编译呢?跳过cmake不好吗? 之前用的opencv…

服务熔断(Hystrix)

服务雪崩 多个微服务之间调用的时候,假设微服务A调用微服务B和微服务C,微服务B和微服务C又调用其他的微服务,这就是所谓的“扇出”,如果扇出的链路上某个微服务的调用响应时间过长,或者不可用,对微服务A的…

c++打开网页

1.使用ShellExecute 效果图: 相关代码: void Open_url::on_pushButton_clicked() {QString path1 "explorer.exe";QString urlui->lineEdit->text();ShellExecute(NULL, L"open", path1.toStdWString().c_str(), url.toStdWString().c…

Python匹配文件模块的实战技巧

更多资料获取 📚 个人网站:ipengtao.com 在Python中,文件匹配是许多应用中常见的需求,例如文件管理、数据处理等。本文将深入探讨Python中用于文件匹配的模块,包括glob、fnmatch和os.path等,通过丰富的示例…

Keil5软件仿真 定时器互补通道 波形输出(Logic Analyzer)

步骤一:管脚配置确认。 ①配置定时器的管脚模式为复用推挽输出模式(GPIO_MODE_AF_PP)!!!,注意:复用开漏模式软件仿真时无波形。 步骤二:编译程序。 ①点击编译按钮。 …

(Mac上)使用Python进行matplotlib 画图时,中文显示不出来

【问题描述】 ①报错确缺失字体: ②使用matplotlib画图,中文字体显示不出来 【问题思考】 在网上搜了好多,关于使用python进行matplotlib画图字体显示不出来的,但是我试用了下,对我来说都没有。有些仅使用于windows系…

小型洗衣机什么牌子好又便宜?内衣裤洗衣机十大排名推荐

作为一个上班族,每天回到家中真的不愿意再动了,市面上也越来越多懒人福利神器,而内衣洗衣机可以称得上是人类最幸福的小家电,它不仅可以释放我们的双手,而且还比我们自己手洗得干净,功能和清洁力都比我们传…

Ubuntu 常用命令之 zip 命令用法介绍

📑Linux/Ubuntu 常用命令归类整理 Ubuntu系统下的zip命令是用来压缩文件的。这个命令可以将一个或多个文件或者目录压缩成一个.zip文件,也可以将整个目录树压缩成一个.zip文件。 zip命令的基本格式 zip [选项] [压缩文件名] [要压缩的文件或目录...]z…

python使用selenium无法获取frame完整内容的问题

问题描述 我们使用 selenium 去打开一个页面,由于页面中使用了 frame 元素,只能获取部分内容,不能获取 frame 中的任何内容的问题。 解决方法 这里需要切换到 frame 获取内容,然后再把默认页面的内容拼接为一个完成的网页。下面…

选择移动订货系统源码的四大原因

移动订货系统需要选择源码支持的厂家,有以下四个原因,其中第四个是比较重要的,大家点个关注点个赞,我们接着往下看。 1.可自行定制:支持源码的移动订货系统可以根据企业的具体需求进行定制开发,满足企业特定…

电脑完全重装教程——原版系统镜像安装

注意事项 本教程会清除所有个人文件 请谨慎操作 请谨慎操作 请谨慎操作 前言 本教程是以系统安装U盘为介质进行系统重装操作,照着流程操作会清除整个硬盘里的文件,请考虑清楚哦~ 有些小伙伴可能随便在百度上找个WinPE作为启动盘就直接…

运维实施工程师计算机基础

目录 一.运维实施工程师需要具备的知识 1.1.运维工程师、实施工程师是啥? 1.2. 运维工程师、实施工程师做些啥? 1.3.运维工程师、实施工程师需要具备啥技能? 二.计算机的组成 2.1.简介 2.1.1.CPU(中央处理器) 2.…

LSTM和GRU的区别

LSTM(Long Short-Term Memory)和GRU(Gated Recurrent Unit)都是循环神经网络(RNN)的变体,旨在解决传统RNN中的梯度消失和梯度爆炸的问题,使网络能够更好地处理长期依赖关系。 以下是…

25.BFD双向转发检查

BFD双向转发检查 链路故障检测工具,结合三层协议使故障检测更加快速 例如两台路由器之间加了一台二层设备 在修改优先级后,默认选择了下面那条优先级高的路由,R1 ping R2的时候是正常能ping通的 但是,当下面的路由出现故障后&a…

Mybatis3系列课程8-带参数查询

简介 上节课内容中讲解了查询全部, 不需要带条件查, 这节我们讲讲 带条件查询 目标 1. 带一个条件查询-基本数据类型 2.带两个条件查询-连个基本数据类型 3.带一个对象类型查询 为了实现目标, 我们要实现 按照主键 查询某个学生信息, 按照姓名和年级编号查询学生信息 按照学生…

解决GD32VF103编译printf无法打印 float

解决GD32VF103编译printf无法打印 float 在GD32VF103编译后,采用printf打印float变量时,总是无法显示,是因为编译时采用用newlib-nano库,但是这个库对printf做了优化,在eclipse的build配置use-newlib-nano的选项取消勾…

【Amazon 实验②】使用Amazon WAF做基础 Web Service 防护之自定义规则

文章目录 1. 自定义规则1.1 介绍 2. 实验步骤2.1 测试2.2 输出 上一篇章介绍了使用Amazon WAF做基础 Web Service 防护中的Web ACLs 配置 & AWS 托管规则的介绍和演示操作 【Amazon 实验①】使用Amazon WAF做基础 Web Service 防护,本篇章将继续介绍关于自定义…