实验目的:

调用讯飞api实现一个带有语音识别功能的app,

功能主要包括 1.实现语音输入转换成文本,显示在输入文本框中

2. 实现语音合成,能让文本框中的文字转换成语音输出

先跑通这样的一个demo,后续需求再慢慢添加学习。拒绝使用官方的样例

实验过程:

第一步:申请科大讯飞的api

在控制台上创建一个新应用,在里面选择 语音合成,语音拼写等服务

下载sdk (这个就不图示了,也比较简单)

吐槽:讯飞官网时常崩溃...不知道是我的浏览器问题,还是就是讯飞的官网有问题

第二步:将SDK 配置到项目环境当中。

解压sdk安装包,

将libs文件夹下的两个jar包 复制到 项目的libs

将libs文件夹下的剩余文件夹 复制到 项目的src/main下 新创建的jniLibs目录下

将assets文件夹 复制到 main目录下

最终结果如图所示

第三步:整体流程图及调用函数说明。

a. 初始化sdk,调用申请的科大讯飞appid

b. 点击识别按钮,开启语音识别模块,将输入的语音转换成文字在文本框显示

c. 点击播放按钮,开启语音合成模块,将文本框的内容做语音输出

语音识别模块:这个模块主要有两种实现方法,

一种是自带识别对话框的RecognizerDialog类,

另外一种是不带对话框识别的SpeechRecognizer类。

这里我主要使用了第一种RecognizerDialog类。

1. RecognizerDialog(上下文环境变量context,初始化监听器listener) :构造初始化一个识别对话框。

2.

RecognizerDialogListener中的

onResult(识别结果result,最后一次返回结果判定isLast)方法:

将输入的语音采用JSON格式解析,返回一个字符串。

3. 显示。

语音合成模块:SpeechSynthesizer类 用于文语转换的类

这个模块比较简单,创建对象后,设置一些参数,如发声的人,音量大小,语速快慢等

再调用startSpeaking方法实现播放,这里要传入一个SynthesizerListener 监听器对象,用途是关注合成的语音进度概况。

心得想法:

本次完成一个比较简单的app,实现了语音的输入输出,还是挺有成就感的。由本次动手实践,首先就是更加熟悉了调用api的流程(之前也调用过百度地图的api 写过一个地图app),然后是通过查阅api文档去实现语音合成和语音识别,对自我能力也是一种提高。

这次完成的内容还是比较简单,主要是想通过跑通简单的demo来建立自信,后续还要完善。

目前我想完善的两个点,一个是通过语音唤醒,另外一个是合成声音的音质(尽量不要太机械化)。

具体代码如下 (布局文件为两个按钮,一个输入文本框,这个很简单)

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

private EditText editText;

private Button bt1,bt2;

private HashMap mIatResults=new LinkedHashMap();

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

bt1=(Button)findViewById(R.id.recognize);

bt2=(Button)findViewById(R.id.play);

editText=(EditText)findViewById(R.id.et);

bt1.setOnClickListener(this);

bt2.setOnClickListener(this);

//调用科大讯飞申请的appid 这里要填自己申请的api

SpeechUtility.createUtility(this,SpeechConstant.APPID+"=11111111");

}

@Override

public void onClick(View view) {

switch (view.getId()){

case R.id.recognize:

startSpeechDialog();//语音识别 把声音转成文字

break;

case R.id.play:

speekText();//语音合成 文字转声音

break;

}

}

private void speekText(){

//创建SpeechSynthesizer对象

SpeechSynthesizer speechSynthesizer=SpeechSynthesizer.createSynthesizer(this,null);

// speechSynthesizer.setParameter(SpeechConstant.VOICE_NAME,"vixyun");//发音人

speechSynthesizer.setParameter(SpeechConstant.SPEED,"50");//设置语速

speechSynthesizer.setParameter(SpeechConstant.VOLUME,"80");//设置音量

speechSynthesizer.setParameter(SpeechConstant.ENGINE_TYPE,SpeechConstant.TYPE_CLOUD);//设置云端

speechSynthesizer.setParameter(SpeechConstant.TTS_AUDIO_PATH,"./sdcard/iflytek.pcm");

speechSynthesizer.startSpeaking(editText.getText().toString(),new MySynthesizeListener());

}

class MySynthesizeListener implements SynthesizerListener{

@Override

public void onSpeakBegin() {

Toast.makeText(MainActivity.this,"开始播放",Toast.LENGTH_SHORT).show();

}

@Override

public void onBufferProgress(int i, int i1, int i2, String s) {

//合成进度

}

@Override

public void onSpeakPaused() {

Toast.makeText(MainActivity.this,"暂停播放",Toast.LENGTH_SHORT).show();

}

@Override

public void onSpeakResumed() {

Toast.makeText(MainActivity.this,"继续播放",Toast.LENGTH_SHORT).show();

}

@Override

public void onSpeakProgress(int i, int i1, int i2) {

//播放进度

}

@Override

public void onCompleted(SpeechError speechError) {

if(speechError==null){

Toast.makeText(MainActivity.this,"播放完成",Toast.LENGTH_SHORT).show();

}else if(speechError!=null){

Toast.makeText(MainActivity.this,speechError.getErrorDescription(),Toast.LENGTH_SHORT).show();

}

}

@Override

public void onEvent(int i, int i1, int i2, Bundle bundle) {

}

}

private void startSpeechDialog(){

//创建RecognizerDialog对象

RecognizerDialog mDialog=new RecognizerDialog(this,new MyInitListener());

mDialog.setParameter(SpeechConstant.LANGUAGE,"zh_cn");//设置中文

mDialog.setParameter(SpeechConstant.ACCENT,"mandarin");//普通话

mDialog.setListener(new MyRecognizerDialogListener());//回调接口

mDialog.show();//显示框 接收语音输入

}

class MyRecognizerDialogListener implements RecognizerDialogListener{

@Override

public void onResult(RecognizerResult recognizerResult, boolean b) {

//b 表示是否说完了

String result=recognizerResult.getResultString();

String text=JsonParser.parseIatResult(result);

String sn=null;

try{

JSONObject resultJson=new JSONObject(recognizerResult.getResultString());

sn=resultJson.optString("sn");

}catch (JSONException e){

e.printStackTrace();

}

mIatResults.put(sn,text);

StringBuffer resultBuffer =new StringBuffer();

for(String key :mIatResults.keySet()){

resultBuffer.append(mIatResults.get(key));

}

editText.setText(resultBuffer.toString());//设置输入框的文本

editText.setSelection(editText.length());//光标定位到末尾

}

@Override

public void onError(SpeechError speechError) {}

}

class MyInitListener implements InitListener{

@Override

public void onInit(int i) {

if(i!= ErrorCode.SUCCESS) {

Toast.makeText(MainActivity.this, "初始化失败", Toast.LENGTH_SHORT).show();

}

}

}

// /**

// * 语音识别 另外一种识别方法

// */

// private void startSpeech(){

// //语音识别器对象,听写、语法识别功能 把人的自然语言音频数据转换为文本数据

// SpeechRecognizer SR=SpeechRecognizer.createRecognizer(this,null);

// SR.setParameter(SpeechConstant.DOMAIN,"iat");//默认

// SR.setParameter(SpeechConstant.LANGUAGE,"zh_cn");//设置中文

// SR.setParameter(SpeechConstant.ACCENT,"mandarin");//设置普通话

// SR.startListening(mRecoListener);

// }

// //听写监听

// private RecognizerListener mRecoListener=new RecognizerListener() {

// //听写结果回调接口

// //通过onResults接口多次返回结果,完整的识别内容是多次结果的累加

// @Override

// public void onResult(RecognizerResult recognizerResult, boolean b) {

// Log.d("MainActivity.this",recognizerResult.getResultString());

// Toast.makeText(MainActivity.this,recognizerResult.getResultString(),Toast.LENGTH_SHORT).show();

// }

// @Override

// public void onVolumeChanged(int i, byte[] bytes) {

//

// }

//

// @Override

// public void onBeginOfSpeech() {

//

// }

//

// @Override

// public void onEndOfSpeech() {

//

// }

// @Override

// public void onError(SpeechError speechError) {

//

// }

//

// @Override

// public void onEvent(int i, int i1, int i2, Bundle bundle) {

//

// }

// };

}

Josn解析

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

JSONArray items=words.getJSONObject(i).getJSONArray("cw");

JSONObject obj=items.getJSONObject(0);

ret.append(obj.getString("w"));

}

} catch (JSONException e) {

e.printStackTrace();

}

return ret.toString();

}

}

度秘语音引擎app_带有语音识别功能的APP相关推荐

  1. 度秘语音引擎app_语音机器人哪家强 度秘/小冰/Siri/小娜横向评测

    关于智能语音机器人,想必大家都不陌生,它们在某种程度上给我们带来了极大的便利. 近日,百度推出了基于百度人工智能的手机助理产品--度秘.笔者也进行了体验,感觉不错,就顺带连着微软小冰.小娜和苹果Sir ...

  2. 度秘语音引擎app_「资源」9个(实时)语音转文字APP分享(推荐收藏)

    " 做会议记录.看无字幕网课再也不用担心,解放双手,提高效率." 随着语音转文字技术的发展,我们记录会议.上课内容等有了更好的方式. 实时语音转文字实现边听边看,并且还可回看转译记 ...

  3. 度秘语音引擎app_三款语音写作App的选择

    最近,想开始尝试语音的写作方式.这样,对于一些题材(特别是小说类)的写作,在节省很多的码字时间的同时,也促使我可以利用其它的时间进行写作. 开始在网上找了一些可以实现我需求的APP.我的需求主要包括以 ...

  4. 度秘会重新定义语音助理吗?跟Siri不同在哪里?

    就在苹果秋季发布会的前一天,近20家中国科技企业在北京召开发布会,其中最受关注的是一年一度的"百度世界".百度世界大会对标苹果的WWDC或Google I/O,向开发者.合作伙伴和 ...

  5. Speech模块管理语音输入功能,提供语音识别功能,可支持用户通过麦克风设备进行语音输入内容。通过plus.speech可获取语音输入管理对象

    Speech模块管理语音输入功能,提供语音识别功能,可支持用户通过麦克风设备进行语音输入内容.通过plus.speech可获取语音输入管理对象. 语音输入接口可使得网页开发人员能快速调用设备的麦克风进 ...

  6. iOS中 语音识别功能/语音转文字教程具体解释 韩俊强的博客

    前言:近期研究了一下语音识别,从百度语音识别到讯飞语音识别:首先说一下个人针对两者的看法,讯飞毫无疑问比較专业.识别率也非常高真对语音识别是比較精准的,可是非常多开发人员和我一样期望离线识别,而讯飞离 ...

  7. 安卓调用系统语音识别功能全解(谷歌语音服务):获取识别结果,使用语音识别进行搜索。

    全栈工程师开发手册 (作者:栾鹏) 安卓教程全解 安卓调用系统语音识别功能全解(谷歌语音服务):获取识别结果,使用语音识别进行搜索. 首先要添加权限 <uses-permission andro ...

  8. Android App开发语音处理之系统自带的语音引擎、文字转语音、语音识别的讲解及实战(超详细 附源码)

    需要源码请点赞关注收藏后评论区留下QQ~~~ 一.系统自带的语音引擎 语音播报的本质是将书面文字转换成自然语言的音频流,这个转换操作被称作语音合成,又称TTS(从文本到语音)在转换过程中,为了避免机械 ...

  9. 华为手机计算机怎么语音算术,华为自带的语音识别功能太实用了!这样操作,3秒语音变文字...

    原标题:华为自带的语音识别功能太实用了!这样操作,3秒语音变文字 如果用过华为手机的小伙伴肯定都知道,华为手机有很多实用的实用的功能,对于商务人士来说,特别有用,例如:无线投屏.智能识物等功能,又方便 ...

最新文章

  1. Java项目:酒店管理系统(java+SSM+jsp+mysql+maven)
  2. 基于MTCNN的人脸自动对齐技术原理及其Tensorflow实现测试
  3. 《智能网联汽车技术路线图 2.0》重磅发布
  4. CSharpGL(19)用glReadPixels把渲染的内容保存为PNG图片(C#)
  5. 【计组实验】P3 Verilog多周期处理器开发 MIPS指令集
  6. 基于SOA的银行系统架构
  7. mysql 重复字段查询及排除重复值
  8. 系统架构师学习笔记-操作系统(三)
  9. ZZULIOJ 1123: 最佳校友
  10. 在一个C程序中,main()函数可以放在哪?
  11. AWS 人工智能黑客马拉松正式开启!用实力演绎科技向善!
  12. java 对象排重_现代化的 Java (八)——重说对象序列化
  13. 设计模式之-模版模式(Template Pattern)
  14. python调用dll时路径问题_使用ctypes(python)在带括号的路径中加载dll时出错
  15. 关于总时差和自由时差的作用及理由
  16. php mocking,php – Mocking Static Eloquent Models方法包括find()
  17. android模拟器安装
  18. 小猫爪:PMSM之FOC控制07-有传感器的速度环
  19. python多线程下载小姐姐图片
  20. 半导体功率器件静态参数测试仪系统 能测 IGBT. Mosfet. Diode. BJT......

热门文章

  1. springboot校园交友网站
  2. GPT-4掀起智能革命浪潮,AI风口下将涌现哪些新机遇?
  3. 如何才能成为一名医生?
  4. OriginPro2022安装过程
  5. 2022全新超火超热门模板的姓氏头像制作生成微信小程序源码下载
  6. java排队买票_春运还需多少通宵排队买票猝死的悲剧
  7. 使用QT程序控制Linux开发板上的继电器(一)
  8. 密集匹配SGM python
  9. 写一篇《活着》读后感
  10. 2021年全球和中国海绵钛产量、产能和产业链整体分析,进出口和价格回归正常「图」