Android 科大讯飞、语音听写集成指南

 

前提说明:讯飞SDK与appID(后台申请)是一一对应的、否则就会导致初始化不成功!

1、创建appID并下载SDK(没有账号的先行注册)

https://console.xfyun.cn/app/myapp

创建完成后、如图

下载解压包

simple就是官方demo、默认会填写你已经申请好的appid、你可以比这官方Demo写


 

2、自己再封装lib、仅保留语音转文字功能、

语音转换核心控制类:

/*** 音频读写转换*/
public class RecognizeSpeechManager implements RecognizerListener, InitListener {private static final String TAG = "RecognizeSpeechManager";private RecognizeListener recognizeListener;// 语音听写对象private SpeechRecognizer iat;private StringBuffer charBufffer = new StringBuffer();private WeakReference<Context> bindContext;private static RecognizeSpeechManager instance;private RecognizeSpeechManager() {}public static RecognizeSpeechManager instance() {if (instance == null) {instance = new RecognizeSpeechManager();}return instance;}public void setRecognizeListener(RecognizeListener recognizeListener) {this.recognizeListener = recognizeListener;}public void init(Context context) {if (bindContext == null) {bindContext = new WeakReference<Context>(context);}if (iat == null) {iat = SpeechRecognizer.createRecognizer(bindContext.get(), this);}}@Overridepublic void onInit(int code) {if (code != ErrorCode.SUCCESS) {Log.d(TAG, "init error code " + code);}}/*** 开始监听* ErrorCode.SUCCESS 监听成功状态码*/public int startRecognize() {setParam();return iat.startListening(this);}/*** 取消听写*/public void cancelRecognize() {iat.cancel();}/*** 停止听写*/public void stopRecognize() {iat.stopListening();}public void release() {iat.cancel();iat.destroy();iat = null;bindContext.clear();bindContext = null;charBufffer.delete(0, charBufffer.length());}@Overridepublic void onVolumeChanged(int i, byte[] bytes) {}@Overridepublic void onBeginOfSpeech() {Log.d(TAG, "onBeginOfSpeech");}@Overridepublic void onEndOfSpeech() {Log.d(TAG, "onEndOfSpeech isListening " + iat.isListening());}@Overridepublic void onResult(RecognizerResult results, boolean b) {if (recognizeListener != null) {recognizeListener.onNewResult(printResult(results));recognizeListener.onTotalResult(charBufffer.toString(), iat.isListening());}}@Overridepublic void onError(SpeechError speechError) {if (recognizeListener != null) {recognizeListener.onError(speechError);}}@Overridepublic void onEvent(int i, int i1, int i2, Bundle bundle) {Log.d(TAG, "onEvent type " + i);}private String printResult(RecognizerResult results) {String text = JsonParser.parseIatResult(results.getResultString());Log.d(TAG, "printResult " + text + " isListening " + iat.isListening());String sn = null;// 读取json结果中的sn字段try {JSONObject resultJson = new JSONObject(results.getResultString());sn = resultJson.optString("sn");} catch (JSONException e) {e.printStackTrace();}if (!TextUtils.isEmpty(text)) {charBufffer.append(text);}return text;}/*** 参数设置** @return*/private void setParam() {// 清空参数iat.setParameter(SpeechConstant.PARAMS, null);// 设置听写引擎iat.setParameter(SpeechConstant.ENGINE_TYPE, SpeechConstant.TYPE_CLOUD);// 设置返回结果格式iat.setParameter(SpeechConstant.RESULT_TYPE, "json");iat.setParameter(SpeechConstant.LANGUAGE, "zh_cn");iat.setParameter(SpeechConstant.ACCENT, "mandarin");//此处用于设置dialog中不显示错误码信息//iat.setParameter("view_tips_plain","false");// 设置语音前端点:静音超时时间,即用户多长时间不说话则当做超时处理iat.setParameter(SpeechConstant.VAD_BOS, "10000");// 设置语音后端点:后端点静音检测时间,即用户停止说话多长时间内即认为不再输入, 自动停止录音iat.setParameter(SpeechConstant.VAD_EOS, "10000");// 设置标点符号,设置为"0"返回结果无标点,设置为"1"返回结果有标点iat.setParameter(SpeechConstant.ASR_PTT, "1");// 设置音频保存路径,保存音频格式支持pcm、wav,设置路径为sd卡请注意WRITE_EXTERNAL_STORAGE权限/* iat.setParameter(SpeechConstant.AUDIO_FORMAT, "wav");iat.setParameter(SpeechConstant.ASR_AUDIO_PATH, Environment.getExternalStorageDirectory() + "/msc/iat.wav");*/}}
RecognizeListener 接口、用于语音转换成功后、文本回调
/*** 听写回调*/
public interface RecognizeListener {void onNewResult(String result);void onTotalResult(String result,boolean isLast);void onError(SpeechError speechError);
}

解析工具类、来自官方Demo

/*** Json结果解析类*/
public class JsonParser {public static String parseIatResult(String json) {StringBuffer ret = new StringBuffer();try {JSONTokener tokener = new JSONTokener(json);JSONObject joResult = new JSONObject(tokener);JSONArray words = joResult.getJSONArray("ws");for (int i = 0; i < words.length(); i++) {// 转写结果词,默认使用第一个结果JSONArray items = words.getJSONObject(i).getJSONArray("cw");JSONObject obj = items.getJSONObject(0);ret.append(obj.getString("w"));
//				如果需要多候选结果,解析数组其他字段
//				for(int j = 0; j < items.length(); j++)
//				{
//					JSONObject obj = items.getJSONObject(j);
//					ret.append(obj.getString("w"));
//				}}} catch (Exception e) {e.printStackTrace();} return ret.toString();}public static String parseGrammarResult(String json) {StringBuffer ret = new StringBuffer();try {JSONTokener tokener = new JSONTokener(json);JSONObject joResult = new JSONObject(tokener);JSONArray words = joResult.getJSONArray("ws");for (int i = 0; i < words.length(); i++) {JSONArray items = words.getJSONObject(i).getJSONArray("cw");for(int j = 0; j < items.length(); j++){JSONObject obj = items.getJSONObject(j);if(obj.getString("w").contains("nomatch")){ret.append("没有匹配结果.");return ret.toString();}ret.append("【结果】" + obj.getString("w"));ret.append("【置信度】" + obj.getInt("sc"));ret.append("\n");}}} catch (Exception e) {e.printStackTrace();ret.append("没有匹配结果.");} return ret.toString();}public static String parseLocalGrammarResult(String json) {StringBuffer ret = new StringBuffer();try {JSONTokener tokener = new JSONTokener(json);JSONObject joResult = new JSONObject(tokener);JSONArray words = joResult.getJSONArray("ws");for (int i = 0; i < words.length(); i++) {JSONArray items = words.getJSONObject(i).getJSONArray("cw");for(int j = 0; j < items.length(); j++){JSONObject obj = items.getJSONObject(j);if(obj.getString("w").contains("nomatch")){ret.append("没有匹配结果.");return ret.toString();}ret.append("【结果】" + obj.getString("w"));ret.append("\n");}}ret.append("【置信度】" + joResult.optInt("sc"));} catch (Exception e) {e.printStackTrace();ret.append("没有匹配结果.");} return ret.toString();}public static String parseTransResult(String json,String key) {StringBuffer ret = new StringBuffer();try {JSONTokener tokener = new JSONTokener(json);JSONObject joResult = new JSONObject(tokener);String errorCode = joResult.optString("ret");if(!errorCode.equals("0")) {return joResult.optString("errmsg");}JSONObject transResult = joResult.optJSONObject("trans_result");ret.append(transResult.optString(key));/*JSONArray words = joResult.getJSONArray("results");for (int i = 0; i < words.length(); i++) {JSONObject obj = words.getJSONObject(i);ret.append(obj.getString(key));}*/} catch (Exception e) {e.printStackTrace();}return ret.toString();}
}

 权限配置

   <!--连接网络权限,用于执行云端语音能力 --><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.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"/>

 3、主工程Application中初始化 、并依赖recognizespeech lib库

//注意、appid=xxxx 不能省略(xxxx 写上自己的appid)
SpeechUtility.createUtility(this,"appid=xxxxx"
)

如图:

测试类代码

class MainActivity : AppCompatActivity(),RecognizeListener {override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.activity_main)RecognizeSpeechManager.instance().init(this)RecognizeSpeechManager.instance().setRecognizeListener(this)btStart.setOnClickListener {RecognizeSpeechManager.instance().startRecognize()}btCancel.setOnClickListener {RecognizeSpeechManager.instance().cancelRecognize()}btStop.setOnClickListener {RecognizeSpeechManager.instance().stopRecognize()}}override fun onDestroy() {super.onDestroy()RecognizeSpeechManager.instance().release()}@SuppressLint("SetTextI18n")override fun onNewResult(result: String?) {tvContent.append("最新翻译:$result \n")}@SuppressLint("SetTextI18n")override fun onTotalResult(result: String, isLast: Boolean) {tvContent.append("所有翻译:$result \n")}override fun onError(speechError: SpeechError?) {Toast.makeText(this,"出错了 $speechError",Toast.LENGTH_SHORT).show()}
}

 activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"android:gravity="center"tools:context=".MainActivity"><TextViewandroid:id="@+id/tvContent"android:padding="20dp"android:layout_gravity="top"android:layout_width="match_parent"android:layout_height="wrap_content"/><Buttonandroid:layout_marginTop="50dp"android:id="@+id/btStart"android:text="开始识别"android:layout_width="wrap_content"android:layout_height="wrap_content"/><Buttonandroid:id="@+id/btCancel"android:layout_marginTop="20dp"android:text="取消"android:layout_width="wrap_content"android:layout_height="wrap_content"/><Buttonandroid:id="@+id/btStop"android:text="停止"android:layout_marginTop="20dp"android:layout_width="wrap_content"android:layout_height="wrap_content"/></LinearLayout>

至此OVer、Demo https://download.csdn.net/download/BirdEatBug/19714846?spm=1001.2014.3001.5501

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

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

相关文章

tp中如何调用科大讯飞的语音转写

1.首先注册科大讯飞&#xff08;https://www.xfyun.cn/&#xff09;&#xff0c;拿到语音转写的APPID以及SecretKey 2.将我的压缩包放到tp的扩展类库目录&#xff08;extend&#xff09;中。解压 3.在控制里面的调用方式 重点注意&#xff1a; 1.一定要是科大讯飞语音转写的A…

android语音识别之科大讯飞语音API的使用

Android系统本身其实提供有语音识别模块&#xff0c;在它的APIDemo里也有关于语音识别的sample&#xff0c;不过经过大多开发者的真机测试&#xff0c;发现很多真机并不能使用哪个sample&#xff0c;在网上查找了一下原因&#xff0c;大部分是因为开发者在刷机的时候&#xff0…

如何调教ChatGPT,让它成为生产力工具

我希望您充当 Graphviz DOT 生成器&#xff0c;创建有意义的图表的专家。该图应该至少有 n 个节点&#xff08;我在我的输入中通过写入 [n] 来指定 n&#xff0c;10 是默认值&#xff09;并且是给定输入的准确和复杂的表示。每个节点都由一个数字索引以减少输出的大小&#xff…

3月18日英超两场足球比赛分析推荐

不知不觉文章分析的场次推荐已经4连红&#xff0c;昨日文章写的纽卡没有问题&#xff0c;扫盘中错的两场实属无奈&#xff0c;比勒费前半场领先2球优势被最后一分钟点球扳平。海牙带球入场结果后半场乏力被打穿&#xff01;球场上就是这么变化莫测&#xff0c;让人悲伤让人疯狂…

足球胜平负数据这样分析竞猜准确率超高,你敢相信吗?

作为足球爱好者和竞猜玩家&#xff0c;使用一款好用的工具软件能够帮助我们更全面地分析比赛数据和情况&#xff0c; 提高我们的赛事预测准确率。因此&#xff0c;选择一款最好用的足球胜平负竞猜分析工具软件是我们必须要做的事情。下面我为大家介绍一款非常好用的数据分析工具…

周鸿祎自传

​ 1.那共通之处就是——人们如何在没有前车之鉴的判例中进行决策&#xff0c;又如何在泰山压顶般的压力之下做出最优的判断。对于创业者来说&#xff0c;每一天都是压力测试。&#xff0d;&#xff0d;&#xff0d;&#xff0d;决策 2.真正的勇敢&#xff0c;并非骁勇善战&am…

马斯克回应多年前嘲笑比亚迪;360 周鸿祎训练数字人代替演讲;微软发布自己的 Linux | 极客头条

「极客头条」—— 技术人员的新闻圈&#xff01; CSDN 的读者朋友们早上好哇&#xff0c;「极客头条」来啦&#xff0c;快来看今天都有哪些值得我们技术人关注的重要新闻吧。 整理 | 苏宓 出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09; 一分钟速览新闻点&#…

史上最全最详细的多语言调用 3.5 Turbo 的 API 教程(持续更新中)

3.5 Turbo 模型是 Chat 所使用的模型&#xff0c;现 OpenAI 已正式开放 Chat 的 API 能力供广大开发者使用&#xff0c;它可以提供超高准确性、可靠性和可扩展性&#xff0c;让机器学习和自然语言处理的开发者以极低的成本获取精准的结果。 那么我们如何通过API 的方式调用 3.…

寻找新奇有趣的AI工具合集,一个网站就够了

随着ChatGpt横空出世&#xff0c;越来越多的AI工具涌现出来&#xff0c;利用这些工具&#xff0c;我们就可以玩转智能办公&#xff0c;尽享高效快捷。那么&#xff0c;我们从哪里可以即时获取到这些产品的信息呢&#xff1f;又如何调兵遣将&#xff0c;化种类繁多的AI工具为各种…

云炬Android开发笔记 17商品详情功能开发

阅读目录 1.商品详情ui框架设计 1.1 自定义圆形控件 1.2 底部栏的布局 1.3 整体布局 2.商品详情UI-MD风格伸缩渐变效果实现 2.1 ui的绑定 2.2 服务器中商品详情页的数据的取出 3.商品详情页的中间信息的完善 4. 商品详情页下部滑动Tab页面的实现 4.2 填充的ImageDele…

chatgpt赋能python:Python怎么断行-让代码更易读

Python怎么断行 - 让代码更易读 大多数Python程序员都知道&#xff0c;代码可读性非常重要。好的代码应该易于阅读和理解&#xff0c;而不是让人困惑和痛苦。 然而&#xff0c;我们经常会发现一些Python代码在一行中拥挤着多个表达式、长变量名混杂其中&#xff0c;让人感到相…

如何利用citespace分析cnki里的文献——(1)导入数据

##&#xff08;一&#xff09;在cnki中导出数据 按照自己的需要进行检索&#xff0c;选择需要导出的文献题录&#xff08;最多一次可选择500个&#xff09;&#xff0c;导出格式选为“Refworks”&#xff0c;点击“导出”&#xff0c;导出题录的txt&#xff0c;注意&#xff1a…

研究方法|用CiteSpace进行科学文献可视化分析

研究方法|用CiteSpace进行科学文献可视化分析 CiteSpace是什么&#xff1f; 简单来说&#xff0c;它一款通过将国内外文献进行可视化分析来帮助你了解一门学科前世今生的软件。 面对成千上万篇的文献&#xff0c;怎样才能快速锁定自己最感兴趣的主题及科学文献&#xff0c;找…

❤️这两个文献神器绝了!一张图谱梳理文献脉络

文章目录 引言神器1&#xff1a;connected papers关联文献图谱过往工作衍生工作 神器2&#xff1a;semantic scholar文献检索被引情况Semantic Reader阅读器 小结 引言 每当我们接触一个新技术领域时&#xff0c;往往需要借助大量的文献调研&#xff0c;来梳理研究现状。 尤其…

论文写作——origin画图

一 origin的安装 详见下面网址&#xff0c;内涵下载路径和破解方法。 http://www.ddooo.com/softdown/51005.htm 1. 下载origin 网址&#xff1a;https://thepcgo.com/origin-pro-8-0-free-download/ 2.下载破解相关压缩包 链接&#xff1a;https://pan.baidu.com/s/1LwA…

Endnote参考文献分享与导入

Endnote参考文献分享与导入/转移 文章发给老师如何将参考文献一同发送 软件版本为X8 一、分享 首先找到Endnote library的位置&#xff0c;将两个文件【一个是后缀为enl的数据库文件和另一个是.data文件夹】一起复制到一个文件夹&#xff0c;压缩通过网盘、U盘等方式发送给接…

名帖376 祝允明 草书《滕王阁序并诗》

《中国书法名帖目录》 祝允明&#xff0c;号枝山&#xff0c;明长洲(今苏州)人。弘治五年(1492)举人&#xff0c;天资卓越&#xff0c;五岁能作径尺大字&#xff1a;九岁能诗&#xff0c;写文章有奇气&#xff0c;且才思敏捷&#xff0c;与唐寅、文徵明、徐祯卿号称“吴中四才…

名帖249 文徵明 行书《滕王阁序》

《中国书法名帖目录》 《滕王阁序》是王勃创作的一篇骈文&#xff0c;素有“千古第一骈文”之名&#xff0c;无论从内容上还是从形式上看&#xff0c;都代表了中国骈文的最高成就。 曾有人问如何写出《滕王阁序》这样的作品&#xff0c;殊不知《滕王阁序》这样的雄构不是写出…

《滕王阁序》

滕王阁序 唐 王勃 南昌故郡&#xff0c;洪都新府&#xff0c;星分翼轸&#xff0c;地接衡庐&#xff0c;襟三江而带五湖&#xff0c;控蛮荆而引瓯越。物华天宝&#xff0c;龙光射斗牛之墟&#xff1b;人杰地灵&#xff0c;徐孺下陈蕃之榻。雄州雾列&#xff0c;俊彩星驰&#x…

chatgpt赋能python:Python输出波形:让你的数据可视化更轻松

Python输出波形&#xff1a;让你的数据可视化更轻松 随着数据获取和处理的不断深入&#xff0c;数据可视化正在变得越来越重要。而Python是一种流行的、易学习的、高级编程语言&#xff0c;广泛用于数据科学、统计学、机器学习等领域。Python的可视化库也非常强大&#xff0c;…