当前位置: 首页 > news >正文

Android之讯飞语音合成和语音识别

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 前言
  • 效果图
  • 一、去讯飞官网注册[讯飞官网](https://www.xfyun.cn/)
  • 二、下载jar和so文件[讯飞SDK](https://download.csdn.net/download/Android_Cll/91764299)
  • 三、语音合成
    • 1.将jar和so文件放到libs文件下并引用(必须要so文件)
    • 2.Application中实例化
    • 3.activity中使用
  • 四、语音识别
    • 1.步骤同上1和2
    • 2.activity中使用
  • 总结


前言

目前只要是关于小说或者英语相关软件,就会遇到需要朗读文本或者单词,这时就需要涉及到语音合成功能,如果再涉及一些聊天啥的(不一定是即时通讯)就会涉及语音识别,比如简单的聊天问AI,用语音问,这时后台会告诉你AI那边没有语音的,需要把语音转成文字给AI,来吧,看看怎么实现。


效果图

在这里插入图片描述
在这里插入图片描述

一、去讯飞官网注册讯飞官网

去讯飞官网注册后进行实名认证,然后创建应用就会得到APP_ID。

二、下载jar和so文件讯飞SDK

三、语音合成

1.将jar和so文件放到libs文件下并引用(必须要so文件)

代码如下(语音合成和识别共用):

    //讯飞implementation files('libs/Msc.jar')

2.Application中实例化

代码如下(语音合成和识别共用,切记保留appid=,只替换后面YOUR_APP_ID):

// 初始化讯飞 SDK(替换 YOUR_APP_ID)
SpeechUtility.createUtility(this, "appid=YOUR_APP_ID")

3.activity中使用

    //定义变量private var tts: SpeechSynthesizer? = null// 初始化语音合成器tts = SpeechSynthesizer.createSynthesizer(this, null)//朗读 xiaoyan这里自己去新建应用后找到语音合成,特色发音,新建发音人private fun startTTS(text: String?) {// 设置参数tts!!.setParameter(SpeechConstant.VOICE_NAME, "xiaoyan")tts!!.setParameter(SpeechConstant.SPEED, "40") // 语速(0~100)tts!!.setParameter(SpeechConstant.PITCH, "50") // 音调(0~100)tts!!.setParameter(SpeechConstant.VOLUME, "100") // 音量(0~100)// 开始合成并播放tts!!.startSpeaking(text, object : SynthesizerListener {override fun onSpeakBegin() {// 开始播放}override fun onBufferProgress(percent: Int, beginPos: Int, endPos: Int, info: String?) {// 缓冲进度}override fun onSpeakPaused() {}override fun onSpeakResumed() {}override fun onSpeakProgress(percent: Int, beginPos: Int, endPos: Int) {// 播放进度}override fun onCompleted(error: SpeechError?) {if (error != null) {Log.e("TTS", "Error: " + error.errorCode)}}override fun onEvent(eventType: Int, arg1: Int, arg2: Int, obj: Bundle?) {// 事件回调(如播放暂停、恢复)}})}override fun onDestroy() {super.onDestroy()// 释放资源if (tts != null) {tts!!.stopSpeaking()tts!!.destroy()}}

四、语音识别

1.步骤同上1和2

2.activity中使用

 //定义变量private var mIat: SpeechRecognizer? = null // 语音识别对象// 创建语音识别对象mIat = SpeechRecognizer.createRecognizer(this, object : InitListener {override fun onInit(code: Int) {println("初始化--->$code")setIatParams() // 设置参数}})
// 设置识别参数private fun setIatParams() {if (mIat == null) return// 设置听写参数mIat!!.setParameter(SpeechConstant.DOMAIN, "iat") // 语音转写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") // 标点符号(1有标点,0无标点)}
//开始录音时调用
if (mIat != null) {mIat!!.startListening(mRecognizerListener) // 开始录音
}
//结束录音调用
if (mIat != null) {mIat!!.stopListening() // 停止录音并获取最终结果
}// 识别监听器
private val mRecognizerListener: RecognizerListener = object : RecognizerListener {override fun onResult(results: RecognizerResult, isLast: Boolean) {// 实时返回结果(isLast为true时表示最终结果)val jsonStr: String? = results.resultStringval text: String? = parseWFromJson(jsonStr)if (isLast) {//最终结果println("文件目录--->$text")} else {
//                tvResult.append("[实时结果] " + text + "\n")}}override fun onError(error: SpeechError) {println("识别错误:" + error.errorCode + ", " + error.errorDescription)// 错误处理
//            tvResult.setText("错误:" + error.getErrorDescription())}override fun onVolumeChanged(p0: Int, p1: ByteArray?) {// 音量变化(0-30)println("当前音量:$p0")}override fun onBeginOfSpeech() {// 开始录音println("开始录音")
//            tvResult.setText("正在录音...")}override fun onEndOfSpeech() {// 结束录音(自动触发)println("录音结束")}override fun onEvent(eventType: Int, arg1: Int, arg2: Int, obj: Bundle?) {// 扩展事件回调}}//语音转文字数据获取格式化fun parseWFromJson(jsonStr: String?): String {val result = StringBuilder()try {val jsonObject: JSONObject = JSONObject(jsonStr)val wsArray: JSONArray = jsonObject.getJSONArray("ws") // 获取 ws 数组// 遍历 ws 数组for (i in 0 until wsArray.length()) {val wsItem: JSONObject = wsArray.getJSONObject(i)val cwArray: JSONArray = wsItem.getJSONArray("cw") // 获取 cw 数组// 遍历 cw 数组for (j in 0 until cwArray.length()) {val cwItem: JSONObject = cwArray.getJSONObject(j)val w: String? = cwItem.optString("w", "") // 提取 w 字段result.append(w) // 拼接结果}}} catch (e: JSONException) {e.printStackTrace()}return result.toString()}//释放资源override fun onDestroy() {super.onDestroy()// 释放资源if (mIat != null) {mIat!!.cancel();mIat!!.destroy();}}

总结

除了添加jar文件外一定要引用so文件,不然会报错,语音合成发音人可新建特色发音,根据自己选择新建,语音识别如果外加录音,就在开始录音时调用,结束录音结束识别即可。

http://www.dtcms.com/a/351751.html

相关文章:

  • React 代码规范
  • 算法练习-合并两个有序数组
  • 表格比对的实现
  • 如何确定哪些层应添加适配器(Adapter)?(58)
  • 餐中服务:藏在菜香里的 “情感传递术”
  • Java继承与虚方法详解
  • 掌握常用CSS样式:从基础到实战的全面指南
  • 从0开始学习Java+AI知识点总结-26.web实战(Springboot原理)
  • 产品经理成长手册(2)——产品文档能力
  • 14、RocketMQ生产环境如何优化
  • Linux查看服务器内存、磁盘、cpu、网络占用、端口占用情况
  • THM El Bandito
  • 设计模式学习笔记-----抽象责任链模式
  • 常见的设计模式
  • 深度学习篇---1*1卷积核的升维/降维
  • Unity笔记(七)——四元数、延迟函数、协同程序
  • 【Linux】Keepalived + Nginx高可用方案
  • [pilot智驾系统] 驾驶员监控守护进程(dmonitoringd)
  • 从代码学习深度强化学习 - 多智能体强化学习 IPPO PyTorch版
  • pytorch_grad_cam 库学习笔记——基类ActivationsAndGradient
  • vue2 和 vue3 生命周期的区别
  • 【Android】不同系统API版本_如何进行兼容性配置
  • 2014-2024高教社杯全国大学生数学建模竞赛赛题汇总预览分析
  • VMDK 文件
  • 软考-系统架构设计师 计算机系统基础知识详细讲解二
  • springcloud篇5-微服务保护(Sentinel)
  • Spring Boot mybatis-plus 多数据源配置
  • 【CVE-2025-5419】(内附EXP) Google Chrome 越界读写漏洞【内附EXP】
  • Kafka面试精讲 Day 1:Kafka核心概念与分布式架构
  • Elasticsearch中的协调节点