本次的工作对整个工程中我负责的部分进行了收尾。
首先将ChatInputLayout中的所有功能进行了完善,首先是语音识别功能的输出形式,系统键盘模式下正常输出,自定义键盘模式下需要将识别出的句子的字母与个性化字体库中的字体进行匹配。
给开始识别按钮添加的监听器
btStart.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
checkSoIsInstallSucceed();
//mEtInput.setText("");
//mIatResults.clear();
// 设置参数
setParam();
boolean isShowDialog = mSharedPreferences.getBoolean(
getResources().getString(R.string.pref_key_iat_show), true);
if(isShowDialog){
ret=mIat.startListening(mRecognizerListener);
if(ret!= ErrorCode.SUCCESS)
{
showTip("听写失败,错误码:"+ret);
}else{
showTip("请开始说话");
}
}
}
});
其中showTip用来显示提示文字
private void showTip(final String str) {
mToast.setText(str);
mToast.show();
}
mIat是一个语音听写对象,setParam方法就是用来在听写前设置其参数,来自讯飞语音识别
private SpeechRecognizer mIat;
public void setParam() {
//参数设置
// 清空参数
mIat.setParameter(SpeechConstant.PARAMS, null);
// 设置听写引擎
mIat.setParameter(SpeechConstant.ENGINE_TYPE, mEngineType);
// 设置返回结果格式
mIat.setParameter(SpeechConstant.RESULT_TYPE, "json");
mIat.setParameter(SpeechConstant.LANGUAGE,"en_us");
// 设置语音前端点:静音超时时间,即用户多长时间不说话则当做超时处理
mIat.setParameter(SpeechConstant.VAD_BOS, mSharedPreferences.getString("iat_vadbos_preference", "4000"));
// 设置语音后端点:后端点静音检测时间,即用户停止说话多长时间内即认为不再输入, 自动停止录音
mIat.setParameter(SpeechConstant.VAD_EOS, mSharedPreferences.getString("iat_vadeos_preference", "1000"));
// 设置标点符号,设置为"0"返回结果无标点,设置为"1"返回结果有标点
mIat.setParameter(SpeechConstant.ASR_PTT, mSharedPreferences.getString("iat_punc_preference", "1"));
// 设置音频保存路径,保存音频格式支持pcm、wav,设置路径为sd卡请注意WRITE_EXTERNAL_STORAGE权限
// 注:AUDIO_FORMAT参数语记需要更新版本才能生效
mIat.setParameter(SpeechConstant.AUDIO_FORMAT, "wav");
mIat.setParameter(SpeechConstant.ASR_AUDIO_PATH, Environment.getExternalStorageDirectory() + "/msc/iat.wav");
}
最后根据不同的输入模式来确定识别后的文本的输出形式,如果是自定义键盘模式,得到语音识别的文本后对文本进行的字母逐个判断并与字体库对应,根据音量进行粗细的变形。
private RecognizerListener mRecognizerListener = new RecognizerListener() {
@Override
public void onBeginOfSpeech() {
// 此回调表示:sdk内部录音机已经准备好了,用户可以开始语音输入
showTip("开始说话");
}
@Override
public void onError(SpeechError error) {
// Tips:
// 错误码:10118(您没有说话),可能是录音机权限被禁,需要提示用户打开应用的录音权限。
// 如果使用本地功能(语记)需要提示用户开启语记的录音权限。
showTip(error.getPlainDescription(true));
}
@Override
public void onEndOfSpeech() {
// 此回调表示:检测到了语音的尾端点,已经进入识别过程,不再接受语音输入
showTip("结束说话");
}
@Override
public void onResult(RecognizerResult results, boolean isLast) {
//Log.L(results.getResultString());
System.out.println("间断结果——————————————————————————————————");
printResult(results);
if(isLast){
//因为是last,所以new_piece稳定到了最终结果,不再变化。
result_string+=new_piece;
//针对不同的文本显示方式,系统字体,手写个性化字体
String tag=mChangeModeLayout.getTag().toString();
switch (tag){
case "1":
//系统字体
mEtInput.setText(result_string);
break;
case "2":
//手写个性化字体
//音量
sound=sound/soundCount;
showTip("平均音量"+sound);
if(sound<=18){
sound=2;
}else{
sound=sound/3;
}
for(int i=0;i<new_piece.length();i++){
int start=mEtInput.getSelectionStart();
char singleLetter=new_piece.charAt(i);
int pos=singleLetter-33;
Bitmap bmp;
if(pos==-1){
//空格键
bmp = Bitmap.createBitmap(MY_COL/2,MY_ROW, Bitmap.Config.ARGB_8888);//空白图片
}else if(myImageArrays[pos]!=null){
bmp = paintNewImage(myImageArrays[pos],10,sound,0);
}else{
bmp = Bitmap.createBitmap(MY_COL/2,MY_ROW, Bitmap.Config.ARGB_8888);//空白图片
showTip("个人字体库不完整!");
}
SpannableString ss=getBitmapMime1(bmp);
insertPhotoToEditText(ss);
count++;
inputBmpList.add(start,bmp);
}
sound=0;
soundCount=0;
break;
default:
break;
}
}
}
@Override
public void onVolumeChanged(int volume, byte[] data) {
showTip("当前正在说话,音量大小:" + volume);
//LogUtil.L("返回音频数据:"+data.length);
if(volume>5){
sound+=volume;
soundCount+=1;
}
}
@Override
public void onEvent(int eventType, int arg1, int arg2, Bundle obj) {
}
};
三种信息输入方式的跳转(文本、语音识别、录音)
@OnClick(R.id.iv_input_type)
public void clickInputTypeBtn(){
String tag=mIvInputType.getTag().toString();
switch(tag){
case "1":
//说明现在为键盘输入界面,要更改为语音识别界面
hideSoftInput(3);
mExtensionLayout.setVisibility(GONE);
mExpressLayout.setVisibility(GONE);
mIvExpress.setImageResource(R.mipmap.expression);
mIvInputType.setImageResource(R.mipmap.sound);
mSoundRecogLayout.setVisibility(VISIBLE);
mIvInputType.setTag("2");
break;
case "2":
//说明现在为语音识别界面,要更改为录音界面
hideSoftInput(3);
mExtensionLayout.setVisibility(GONE);
mExpressLayout.setVisibility(GONE);
mIvExpress.setImageResource(R.mipmap.expression);
mSoundRecogLayout.setVisibility(GONE);
mEtInput.setVisibility(GONE);
mBtnAudioRecord.setVisibility(VISIBLE);
mIvInputType.setImageResource(R.mipmap.keyboard);
mIvInputType.setTag("3");
break;
case "3":
//说明现在为录音界面,要更改为键盘输入界面
mBtnAudioRecord.setVisibility(GONE);
mEtInput.setVisibility(VISIBLE);
mIvInputType.setImageResource(R.mipmap.sound_recognise);
//hideSoftInput(3);
showSoftInput();
mIvInputType.setTag("1");
default:
break;
}
}
隐藏键盘的方法,包括隐藏系统键盘和自定义键盘以及全部都隐藏
private void hideSoftInput(int i) {
switch(i){
case 1://系统
mInputManager.hideSoftInputFromWindow(mEtInput.getWindowToken(), 0);
break;
case 2://自定义
mKeyboardLayout.setVisibility(GONE);
myKeyboard.hideKeyboard();
break;
case 3://both
mInputManager.hideSoftInputFromWindow(mEtInput.getWindowToken(), 0);
mKeyboardLayout.setVisibility(GONE);
myKeyboard.hideKeyboard();
break;
default:
break;
}
}
隐藏所有已经显示的布局(键盘、表情、扩展)
public void hideOverView(){
if (isSoftInputShow()){
hideSoftInput(3);
}
if (mExpressLayout.isShown()){
mExpressLayout.setVisibility(GONE);
mIvExpress.setImageResource(R.mipmap.expression);
}
if (mExtensionLayout.isShown()){
mExtensionLayout.setVisibility(GONE);
}
if(mSoundRecogLayout.isShown())
{
mSoundRecogLayout.setVisibility(GONE);
}
}
和小组其他成员合并代码后基本完成项目内容,虽然还有很多不足之处,但是在这个过程中我对Android的开发知识有了一定的掌握,提高了自己的编程能力和团队协作能力。