度秘语音引擎app_带有语音识别功能的APP

实验目的:

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

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

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

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

实验过程:

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

在控制台上创建新的应用程序,并选择语音合成、语音拼写等服务。

[En]

Create a new application on the console and select services such as speech synthesis, speech spelling, etc.

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

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

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

解压sdk安装包,

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

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

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

最终结果如图所示

第三步:调用函数的总体流程图和描述。

[En]

Step 3: the overall flow chart and the description of the calling function.

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

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

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

语音识别模块:该模块主要有两种实现方式。

[En]

Speech recognition module: there are two main implementation methods for this module.

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

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

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

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

2.

RecognizerDialogListener中的

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

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

  1. 显示。

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

这个模块比较简单。创建对象后,设置一些参数,如谁发声、音量、语速等。

[En]

This module is relatively simple. After creating the object, set some parameters, such as who makes the sound, the volume, the speed of speech, and so on.

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

心得想法:

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

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

目前我要改进的有两点,一是通过语音唤醒,二是合成音质(尽量不要太机械化)。

[En]

At present, there are two points I want to improve, one is to wake up through voice, and the other is to synthesize the sound quality (try not to be too mechanized).

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

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();

}

}

Original: https://blog.csdn.net/weixin_39779530/article/details/111738813
Author: weixin_39779530
Title: 度秘语音引擎app_带有语音识别功能的APP

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/525719/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球