Android studio实现语音转文字功能

  • 首先去讯飞开放平台申请一个账号地址,然后点击右上角的“控制台”进入新的页面,创建一个应用,找到“语音听写”,下载相应的SDK。
    Android studio实现语音转文字功能_第1张图片
    解压如下
    Android studio实现语音转文字功能_第2张图片
  • 在android studio中新建一个空项目,将libs文件夹中的内容复制到安卓项目的libs文件夹下,其中msc.jar要右键添加Add As Library
    Android studio实现语音转文字功能_第3张图片
  • 在AndriodManifest.xml中添加以下权限:
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    

  • 在app目录下的build.gradle中添加以下代码
sourceSets {
        main {
            jniLibs.srcDirs = ['libs']
        }
    }

  • 布局文件activity_main.xml中的代码



    
  • 新建一个名为XunFeiCallbackListener的接口
package com.example.myapplication;
import com.iflytek.cloud.RecognizerResult;

public interface XunFeiCallbackListener {
    void onFinish(RecognizerResult results);
}

  • 新建一个名为XunFeiUtil的类
package com.example.myapplication;
import android.content.Context;
        import android.widget.Toast;
        import com.iflytek.cloud.RecognizerResult;
        import com.iflytek.cloud.SpeechConstant;
        import com.iflytek.cloud.SpeechError;
        import com.iflytek.cloud.SpeechUtility;
        import com.iflytek.cloud.ui.RecognizerDialog;
        import com.iflytek.cloud.ui.RecognizerDialogListener;
        import org.json.JSONArray;
        import org.json.JSONObject;
        import org.json.JSONTokener;

public class XunFeiUtil {

    public static String appid = "自己的appid";

    public static void initXunFei(Context context){
        SpeechUtility.createUtility(context, SpeechConstant.APPID +"="+appid);
    }



    public static void startVoice(Context context, final XunFeiCallbackListener callbackListener) {
        RecognizerDialog dialog = new RecognizerDialog(context,null);
        dialog.setParameter(SpeechConstant.LANGUAGE, "zh_cn");
        dialog.setParameter(SpeechConstant.ACCENT, "mandarin");
        dialog.setParameter(SpeechConstant.ASR_PTT, "0");
        dialog.setListener(new RecognizerDialogListener() {
            @Override
            public void onResult(RecognizerResult recognizerResult, boolean b) {
                callbackListener.onFinish(recognizerResult);
            }
            @Override
            public void onError(SpeechError speechError) {
            }
        });
        dialog.show();
        //Toast.makeText(this, "请开始说话", Toast.LENGTH_SHORT).show();
    }

    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"));
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return ret.toString();
    }
}


  • MainActivity
package com.example.myapplication;

import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import com.iflytek.cloud.RecognizerResult;
import static com.example.myapplication.XunFeiUtil.parseIatResult;
import static com.example.myapplication.XunFeiUtil.*;

public class MainActivity extends AppCompatActivity implements View.OnClickListener{

    private Button btn_click;
    private EditText mResultText;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initXunFei(this);
        btn_click = (Button) findViewById(R.id.btn_click);
        mResultText = ((EditText) findViewById(R.id.result));
        btn_click.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        startVoice(this, new XunFeiCallbackListener() {
            @Override
            public void onFinish(RecognizerResult results) {
                String text = parseIatResult(results.getResultString());
                // 自动填写地址
                mResultText.append(text);
            }
        });
    }

}

完成后运行项目,会出现语音开启失败,错误码为20006的错误,如下图

Android studio实现语音转文字功能_第4张图片

出错原因是android系统在非动态申请权限的情况下,默认是把麦克风权限是关闭了的,因此需要打开权限,可以在手机的权限中自己修改权限设置

  • 也可以参考动态获取权限
  • 或者手动赋予权限如下:
Android studio实现语音转文字功能_第5张图片 Android studio实现语音转文字功能_第6张图片

成功后的界面如下:

Android studio实现语音转文字功能_第7张图片 Android studio实现语音转文字功能_第8张图片
如果你想去掉Dialog中语音识别能力由讯飞输入法提供去掉这几个字 点击参考链接
如果 讯飞集成 “组件未安装.(错误码:21002)” 点解参考解决链接
  • 常用的设置参数
        // 清空参数
        mIat.setParameter(SpeechConstant.PARAMS, null);
        //短信和日常用语:iat (默认)  视频:video  地图:poi  音乐:music
        mIat.setParameter(SpeechConstant.DOMAIN, "iat");
        // 简体中文:"zh_cn", 美式英文:"en_us"
        mIat.setParameter(SpeechConstant.LANGUAGE, "zh_cn");
        //普通话:mandarin(默认)
        //粤 语:cantonese
        //四川话:lmz
        //河南话:henanese     
        mIat.setParameter(SpeechConstant.ACCENT, "mandarin ");
        // 设置听写引擎 "cloud", "local","mixed"  在线  本地  混合
        //本地的需要本地功能集成
        mIat.setParameter(SpeechConstant.ENGINE_TYPE, "cloud");
        // 设置返回结果格式 听写会话支持json和plain
        mIat.setParameter(SpeechConstant.RESULT_TYPE, "json");
        //设置是否带标点符号 0表示不带标点,1则表示带标点。
        mIat.setParameter(SpeechConstant.ASR_PTT, "0");
        //只有设置这个属性为1时,VAD_BOS  VAD_EOS才会生效,且RecognizerListener.onVolumeChanged才有音量返回默认:1
        mIat.setParameter(SpeechConstant.VAD_ENABLE,"1");
        // 设置语音前端点:静音超时时间,即用户多长时间不说话则当做超时处理1000~10000
        mIat.setParameter(SpeechConstant.VAD_BOS, "5000");
        // 设置语音后端点:后端点静音检测时间,即用户停止说话多长时间内即认为不再输入, 自动停止录音0~10000
        mIat.setParameter(SpeechConstant.VAD_EOS, "1800");
        // 设置音频保存路径,保存音频格式支持pcm、wav,设置路径为sd卡请注意WRITE_EXTERNAL_STORAGE权限
        // 注:AUDIO_FORMAT参数语记需要更新版本才能生效
        mIat.setParameter(SpeechConstant.AUDIO_FORMAT, "wav");
        //设置识别会话被中断时(如当前会话未结束就开启了新会话等),
        //是否通 过RecognizerListener.onError(com.iflytek.cloud.SpeechError)回调ErrorCode.ERROR_INTERRUPT错误。
        //默认false    [null,true,false]
        mIat.setParameter(SpeechConstant.ASR_INTERRUPT_ERROR,"false");
        //音频采样率  8000~16000  默认:16000
        mIat.setParameter(SpeechConstant.SAMPLE_RATE,"16000");
        //默认:麦克风(1)(MediaRecorder.AudioSource.MIC)
        //在写音频流方式(-1)下,应用层通过writeAudio函数送入音频;
        //在传文件路径方式(-2)下,SDK通过应用层设置的ASR_SOURCE_PATH值, 直接读取音频文件。目前仅在SpeechRecognizer中支持。
        mIat.setParameter(SpeechConstant.AUDIO_SOURCE, "-1");
        //保存音频文件的路径   仅支持pcm和wav
        mIat.setParameter(SpeechConstant.ASR_SOURCE_PATH, Environment.getExternalStorageDirectory().getAbsolutePath() + "test.wav");

你可能感兴趣的:(mysql,android-studio)