科大讯飞语音听写(Android)

article/2025/8/20 20:58:35

前面就不废话了,像申请应用,获取SDK等等,我相信大家应该都会的,科大讯飞采用的是两种语音听写功能,一种带有UI,一种没有UI,本人还是比较笨的,所以就写了较为简单的不带UI的语音听写,哈哈哈
话不多说,我们开始操作!
第一步:先把下载下来的SDK文件中libs包下文件复制粘贴到app下的libs下,如下图所示:
在这里插入图片描述
Msc.jar一定要导入工程中(右击这个jar包,选择Add AS Libraries),然后最重要的一步就是在app的build.gradle文件中的android里面添加

sourceSets {main {jniLibs.srcDirs = ['libs']}}

为了让大家能更好的理解我附上截图
在这里插入图片描述
记住:是在app的build.gradle文件中!!!

第二步:在main文件夹下创建assets文件夹,然后把SDK中的assets文件夹下的文件复制到该目录下,为了大家能听懂我的话,我截图给你们瞅瞅
在这里插入图片描述
哇,是不是一眼就看懂了啊,哈哈哈哈,果然百闻不如一见!
对了对了,大家千万不要忘记加权限:

<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.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.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.READ_CONTACTS" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_SETTINGS" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

第三步:创建MyApplication用来注册,话不多说,上代码!

public class SpeechApp extends Application {@Override
public void onCreate() {SpeechUtility.createUtility(SpeechApp.this, "appid=5d269d73");super.onCreate();
}
}

大家一定要注意的是appid一定要写自己申请的应用的appid,还有SpeechApp一定要写在清单文件中!

第四步:不知道要注意和说啥了,直接上代码

package com.wjs.iatmethod;
import android.Manifest;
import android.app.Activity;
import android.content.SharedPreferences;
import android.os.Build;
import android.os.Bundle;
import android.os.Environment;
import android.util.Log;
import android.view.View;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;import com.iflytek.cloud.ErrorCode;
import com.iflytek.cloud.InitListener;
import com.iflytek.cloud.RecognizerListener;
import com.iflytek.cloud.RecognizerResult;
import com.iflytek.cloud.SpeechConstant;
import com.iflytek.cloud.SpeechError;
import com.iflytek.cloud.SpeechRecognizer;import org.json.JSONException;
import org.json.JSONObject;import java.io.File;
import java.util.HashMap;
import java.util.LinkedHashMap;
public class MainActivity extends AppCompatActivity implements View.OnClickListener {//录音权限private String[] permissions = {Manifest.permission.RECORD_AUDIO};private static String TAG = MainActivity.class.getSimpleName();// 语音听写对象private SpeechRecognizer mIat;private Toast mToast;private StringBuffer buffer = new StringBuffer();private EditText mResultText;// 用HashMap存储听写结果private HashMap<String, String> mIatResult = new LinkedHashMap<String, String>();// 引擎类型private String mEngineType = SpeechConstant.TYPE_CLOUD;private String resultType = "json";/*** @param savedInstanceState*/
@Override
protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);//初始化界面initLayout();// 初始化识别无UI识别对象// 使用SpeechRecognizer对象,可根据回调消息自定义界面;mIat = SpeechRecognizer.createRecognizer(MainActivity.this, mInitListener);mToast = Toast.makeText(this, "", Toast.LENGTH_SHORT);mResultText = (EditText) findViewById(R.id.iat_text);
}/*** 初始化界面*/
private void initLayout() {findViewById(R.id.iat_recognize).setOnClickListener(this);findViewById(R.id.iat_stop).setOnClickListener(this);findViewById(R.id.iat_cancel).setOnClickListener(this);
}int ret = 0;//函数调用返回值/*** 点击事件** @param view*/
@Override
public void onClick(View view) {if (null == mIat) {// 创建单例失败,与 21001 错误为同样原因,参考 http://bbs.xfyun.cn/forum.php?mod=viewthread&tid=9688this.showTip("创建对象失败,请确认 libmsc.so 放置正确,且有调用 createUtility 进行初始化");return;}switch (view.getId()) {// 开始听写// 如何判断一次听写结束:OnResult isLast=true 或者 onErrorcase R.id.iat_recognize:buffer.setLength(0);mResultText.setText(null);mIatResult.clear();//设置参数setParam();// 不显示听写对话框ret = mIat.startListening(mRecognizeListener);if (ret != ErrorCode.SUCCESS) {showTip("听写失败,错误码:" + ret + ",请点击网址https://www.xfyun.cn/document/error-code查询解决方案");} else {showTip("请开始说话…");}break;case R.id.iat_stop: {mIat.stopListening();showTip("停止听写");}break;case R.id.iat_cancel: {mIat.cancel();showTip("取消听写");}break;default:break;}
}/*** 听写监听器*/
private RecognizerListener mRecognizeListener = new RecognizerListener() {@Overridepublic void onVolumeChanged(int volume, byte[] date) {showTip("当前正在说话,音量大小:" + volume);}@Overridepublic void onBeginOfSpeech() {}@Overridepublic void onEndOfSpeech() {// 此回调表示:检测到了语音的尾端点,已经进入识别过程,不再接受语音输入showTip("结束说话");}@Overridepublic void onResult(RecognizerResult results, boolean b) {Log.d(TAG, results.getResultString());if (resultType.equals("json")) {printResult(results);} else if (resultType.equals("plain")) {buffer.append(results.getResultString());mResultText.setText(buffer.toString());mResultText.setSelection(mResultText.length());}}@Overridepublic void onError(SpeechError speechError) {}@Overridepublic void onEvent(int i, int i1, int i2, Bundle bundle) {}
};/*** @param results*/
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();}mIatResult.put(sn, text);StringBuffer resultBuffer = new StringBuffer();for (String key : mIatResult.keySet()) {resultBuffer.append(mIatResult.get(key));}mResultText.setText(resultBuffer.toString());mResultText.setSelection(mResultText.length());
}/*** 设置参数*/
private void setParam() {// 清空参数mIat.setParameter(SpeechConstant.PARAMS, null);// 设置听写引擎。TYPE_LOCAL表示本地,TYPE_CLOUD表示云端,TYPE_MIX 表示混合mIat.setParameter(SpeechConstant.ENGINE_TYPE, mEngineType);// 设置返回结果格式mIat.setParameter(SpeechConstant.RESULT_TYPE, resultType);// 设置语音前端点:静音超时时间,即用户多长时间不说话则当做超时处理mIat.setParameter(SpeechConstant.VAD_BOS, "4000");// 设置语音后端点:后端点静音检测时间,即用户停止说话多长时间内即认为不再输入, 自动停止录音mIat.setParameter(SpeechConstant.VAD_EOS, "2000");// 设置标点符号,设置为"0"返回结果无标点,设置为"1"返回结果有标点mIat.setParameter(SpeechConstant.ASR_PTT, "1");// 设置音频保存路径,保存音频格式支持pcm、wav,设置路径为sd卡请注意WRITE_EXTERNAL_STORAGE权限// 注:AUDIO_FORMAT参数语记需要更新版本才能生效mIat.setParameter(SpeechConstant.AUDIO_FORMAT, "wav");mIat.setParameter(SpeechConstant.ASR_AUDIO_PATH, getExternalCacheDirs() + File.separator + System.currentTimeMillis() + ".wav");
}/*** 初始化监听器*/
private InitListener mInitListener = new InitListener() {@Overridepublic void onInit(int code) {Log.e(TAG, "SpeechRecognizer init() code = " + code);if (code != ErrorCode.SUCCESS) {showTip("初始化失败,错误码:" + code);}}
};/*** 显示Toast消息** @param str*/
private void showTip(final String str) {mToast.setText(str);mToast.show();
}
}

特别要注意的是:

mSharedPreferences = getSharedPreferences("wjs.xml", Activity.MODE_PRIVATE);

这里"wjs.xml"是我自己创建用来存放数据的,存放什么数据,其实我也不知道,但是没有办法啊,我当时就是没有这个就是出不来,我能怎么办。。。唉,给大家看看我文件的位置吧。
在这里插入图片描述
一眼就看出来了吧,哈哈哈!
对了对了,还有json解析的类,这个我是直接复制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();
}
}

大致情况就是这样了,如果,我说如果,大家应该能够弄出来了,哈哈哈哈,主要还是给自己看的,怕自己忘记,当然我也希望对大家有帮助!


http://chatgpt.dhexx.cn/article/JdrUtjwR.shtml

相关文章

语音转写和语音听写_如何在Windows 10上使用语音听写

语音转写和语音听写 Windows 10’s Fall Creators Update makes voice dictation much easier to use. Now, you can immediately begin dictation by pressing a key WindowsH on your keyboard. You don’t have to dig through the Control Panel and set anything up first…

【超简单】之基于PaddleSpeech搭建个人语音听写服务

一、【超简单】之基于PaddleSpeech搭建个人语音听写服务 1.需求分析 亲们&#xff0c;你们要写会议纪要嘛&#xff1f;亲们&#xff0c;你们要写会议纪要嘛&#xff1f;亲们&#xff0c;你们要写会议纪要嘛&#xff1f; 当您面对成吨的会议录音&#xff0c;着急写会议纪要而…

遥感技术及高分遥感影像在地震中的应用及高分二号获取

长期以来&#xff0c;地震预报监测、灾害调查、灾情信息获取主要依靠实地勘测手段&#xff0c;其获取的数据精度和置信度虽然较高&#xff0c;但存在工作量大、效率低、费用高和信息不直观等缺点。遥感技术手段可在一定程度上克服传统实地勘测手段的缺点&#xff0c;并具有其他…

高分一号(GF-1)-中国高分辨率对地观测系统的第一颗卫星

2013年4月26日12时13分04秒由长征二号丁运载火箭成功发射&#xff0c;开启了中国对地观测的新时代。卫星全色分辨率是2米&#xff0c;多光谱分辨率为8米。高分一号卫星的宽幅多光谱相机幅宽达到了800公里。 “高分一号”的特点是增加了高分辨率多光谱相机&#xff0c;该相机的性…

历年(2017-2022)国产陆地观测卫星(高分1号2号6号等)外场绝对辐射定标系数

国产卫星绝对辐射定标系数&#xff08;2008——2022&#xff09; 2017年 参考博文&#xff1a;高分一号/二号/六号定标系数_desertsTsung的博客-CSDN博客

第059篇:高分二号遥感影像预处理流程(ENVI5.3.1平台+ENVI App Store中最新的中国国产卫星支持工具)

今天被袁老的新闻刷屏&#xff0c;湖南衡水县水稻基地传出好消息&#xff1a; 袁隆平团队第三代杂交水稻测产&#xff0c;测得晚稻平均亩产为911.7公斤 早稻晚稻实现亩产3061斤 伟大&#xff0c;除了伟大&#xff0c;不知道还能用什么词概括袁老的不凡成就&#xff01; 说到这…

envi5.3处理高分二号影像数据详细过程记录

目录 一、多光谱影像处理 1. 辐射定标 2.大气校正 1. 需要准备一些数据: 2.大气校正过程 3、正射校正 二、全色影像处理 1. 辐射定标 2. 正射校正 三、图像融合 1.几何配准 2.图像融合 高分二号处理流程 envi5.3的安装教程&#xff1a; ENVI5.3安装 安装完ENVI5.3后…

我国高分系列卫星遥感影像介绍

继上一篇介绍《遥感图像处理》的文章之后&#xff0c;本篇文章对我国的高分系列卫星遥感影像进行简单的整理。 高分系列卫星是在高分专项的支持下&#xff0c;也就是高分辨率对地观测系统重大专项&#xff0c;由国防科技工业局牵头&#xff0c;组织实施建设的一系列高分辨率对…

高分辨率遥感卫星影像在交通方面的应用及高分二号影像获取

高分辨率遥感影像在城市交通领域具有广泛的应用前景&#xff1a;如遥感交通调查、遥感影像地图与电子地图制作、道路工程地质遥感解译、交通安全与知道抗灾救灾、交通事故现场快速勘察、交通需求预测、车辆与车牌视频识别等等。高分辨率影像比如高分二号卫星、高分一号卫星&…

中国高分系列卫星介绍

中国高分系列卫星 中国高分系列卫星是"高分专项"所规划的高分辨率对地观测的系列卫星。它是《国家中长期科学和技术发展规划纲要&#xff08;2006&#xff5e;2020年&#xff09;》所确定的16个重大专项之一。由于课程汇报&#xff0c;所以作了一个PPT&#xff0c;在…

高分二号(GF-2)号卫星数据的查询下载地址和方法

高分二号卫星是我国自主研制的首颗空间分辨优于1米的民用光学遥感卫星可在平台中查询到&#xff0c;搭载有两台高分辨率1米全色、4米多光谱相机&#xff0c;具有亚米级空间分辨率、高定位精度和快速姿态机动能力等特点&#xff0c;有效地提升了卫星综合观测效能&#xff0c;达到…

遥感科普|中国高分系列卫星综述(2020版)

遥感科普|中国高分系列卫星综述(2020版) 文章来源&#xff1a;卫星遥感大数据公众号 高分系列卫星概述 中国高分系列卫星是"高分专项"所规划的高分辨率对地观测的系列卫星。它是《国家中长期科学和技术发展规划纲要&#xff08;2006&#xff5e;2020年&#xff09…

国产高分系列卫星平台介绍

目录 高分专项 高分一号&#xff08;GF-1&#xff09; 高分二号&#xff08;GF-2&#xff09; 高分三号&#xff08;GF-3) 高分四号&#xff08;GF-4&#xff09; 高分五号&#xff08;GF-5) 高分六号&#xff08;GF-6&#xff09; 高分七号&#xff08;GF-7&#xff09; 高分八…

高分三号卫星介绍

博主现在要用到高分三号卫星&#xff0c;但是因为高三2016年8月才发射&#xff0c;目前网上相关资料较少&#xff0c;便总结了一些相关信息&#xff0c;希望能为大家提供帮助~ 传感器 高分三号卫星搭载的传感器是C频段多极化合成孔径雷达&#xff0c;是迄今为止世界上成像模式…

法国Pleiades高分卫星/遥感影像/卫星影像/高分二号影像

引言 Pliades高分辨率卫星星座由2颗完全相同的卫星Pliades 1和Pliades 2组成。Pliades 1已于2011 年 12 月17 日成功发射并开始商业运营&#xff0c; Pliades2 于2012年12月1日成功发射并已成功获取第一幅影像。双星配合可实现全球任意地区的每日重访&#xff0c;最快速满足客户…

c语言中d1的分辨率是,高分一号(GF-1)、高分一号B、C、D星 卫星介绍

原标题&#xff1a;高分一号(GF-1)、高分一号B、C、D星 卫星介绍 高分一号卫星全色分辨率2米&#xff0c;多光谱分辨率8米。高分一号是国家高分辨率对地观测系统重大专项天基系统中的首发星&#xff0c;其主要目的是突破高空间分辨率、多光谱与高时间分辨率结合的光学遥感技术&…

使用ERDAS对国产卫星影像进行控制点正射校正—以高分二号卫星(GF2)为例

** 使用ERDAS对国产卫星影像进行控制点正射校正—以高分二号卫星(GF2)为例 ** 一、研究区影像: 1.1.高分二号原始影像 影像为山西介休市的一景获取时间为2019.01.22的GF2影像: 1.2.参考影像 参考影像为往期的该区域的DOM成果: 二、高分二号全色数据正射校正: 首…

天津市高分二号卫星影像获取/高分一号卫星影像

天津&#xff0c;简称津&#xff0c;地处太平洋西岸&#xff0c;华北平原东北部&#xff0c;海河流域下游&#xff0c;东临渤海&#xff0c;北依燕山&#xff0c;西靠首都北京&#xff0c;中华人民共和国直辖市&#xff0c;截止2021年1月27日天津市土地总面积11966.45平方公里&…

内蒙古自治区高分二号卫星影像获取/高分一号卫星影像

内蒙古自治区&#xff08;简称“内蒙古”&#xff09;&#xff0c;位于祖国北部边疆&#xff0c;横跨东北、华北、西北地区&#xff0c;内与黑龙江、吉林、辽宁、河北、山西、陕西、宁夏、甘肃8省区相邻&#xff0c;外与俄罗斯、蒙古国接壤&#xff0c;是中华人民共和国省级行政…

QPSK调制解调原理(IQ调制)

QPSK调制解调原理&#xff08;IQ调制&#xff09; QPSK调制过程 QPSK调制星座图 参考链接&#xff1a;https://www.zhihu.com/question/23107539/answer/72521819?utm_sourcewechat_session&utm_mediumsocial&utm_oi736516591579037696