Android studio实现语音转文字功能

  • 首先去讯飞开放平台申请一个账号地址,然后点击右上角的“控制台”进入新的页面,创建一个应用,找到“语音听写”,下载相应的SDK。

    解压如下
    在这里插入图片描述
  • 在android studio中新建一个空项目,将libs文件夹中的内容复制到安卓项目的libs文件夹下,其中msc.jar要右键添加Add As Library
    在这里插入图片描述
  • 在AndriodManifest.xml中添加以下权限:
    <!--连接网络权限,用于执行云端语音能力 -->
    <uses-permission android:name="android.permission.INTERNET"/>
    <!--获取手机录音机使用权限,听写、识别、语义理解需要用到此权限 -->
    <uses-permission android:name="android.permission.RECORD_AUDIO"/>
    <uses-permission android:name="Manifest.permission.RECORD_AUDIO" />
    <!--读取网络信息状态 -->
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
    <!--获取当前wifi状态 -->
    <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.READ_CONTACTS"/>
    <!--外存储写权限,构建语法需要用到此权限 -->
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    <!--外存储读权限,构建语法需要用到此权限 -->
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
    <!--配置权限,用来记录应用配置信息 -->
    <uses-permission android:name="android.permission.WRITE_SETTINGS"
        tools:ignore="ProtectedPermissions" />
    <!--手机定位信息,用来为语义等功能提供定位,提供更精准的服务-->
    <!--定位信息是敏感信息,可通过Setting.setLocationEnable(false)关闭定位请求 -->
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
    <!--如需使用人脸识别,还要添加:摄像头权限,拍照需要用到 -->
    <uses-permission android:name="android.permission.CAMERA" />

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

  • 布局文件activity_main.xml中的代码
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/container"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <Button
        android:id="@+id/btn_click"
        android:text="点击打开讯飞语音识别"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        />
    <EditText
        android:id="@+id/result"
        android:layout_below="@id/btn_click"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="此处显示你所录下的内容"
        />
</LinearLayout>

  • 新建一个名为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系统在非动态申请权限的情况下,默认是把麦克风权限是关闭了的,因此需要打开权限,可以在手机的权限中自己修改权限设置

成功后的界面如下:

如果你想去掉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<span style="font-family: Menlo;">     </span>
        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");

猜你喜欢

转载自blog.csdn.net/afufufufu/article/details/123791253