需求来源:当我们在不方便敲键盘打字的情况下,可以通过说话发出的语音转文字,该功能极大的方便了我们的生活。

首先,你需要去讯飞开放平台注册一个账号。

然后,找到图片中语音听写(流式版)的位置:

AndroidStudio实现语音转文字_java

下载SDK,如下图所示:

AndroidStudio实现语音转文字_android_02

最后创建一个新应用,如下图所示:

AndroidStudio实现语音转文字_android_03

记住你的APPID,后面需要用的。

你刚才不是下载了SDK文件的吗,找到它在电脑中的位置,解压,目录如下:

AndroidStudio实现语音转文字_语音转文字_04

新建一个MainActivity.java文件,把这个assets文件,libs文件,添加到你的Android项目中,如下图所示:

AndroidStudio实现语音转文字_java_05

libs下的Msc.jar文件怎么添加到自己的项目中,自己去查哈!

然后,我们到build.gradle文件中,

位置如下:

AndroidStudio实现语音转文字_语音转文字_06

添加如下代码:

sourceSets {
        main {
            jniLibs.srcDirs = ['libs']
        }
    }

顺便检查一下上面的Msc.jar文件是否添加成功:

AndroidStudio实现语音转文字_语音转文字_07

新建一个接口XunFeiCallbackListener.java:

package com.application.screenshot;

import com.iflytek.cloud.RecognizerResult;

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

创建一个工具类XunFeiUtil.java:

package com.application.screenshot;

import android.content.Context;

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();
    }
    public static String parseInResult(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();
    }
}

activity_main.xml布局如下:

<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="此处显示你所录下的内容"
        />

MainActivity.java代码如下:

package com.application.screenshot;

import androidx.appcompat.app.AppCompatActivity;

import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.media.MediaScannerConnection;
import android.os.Bundle;
import android.os.Environment;
import android.provider.MediaStore;
import android.util.DisplayMetrics;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

import com.iflytek.cloud.RecognizerResult;
import static com.application.screenshot.XunFeiUtil.*;

import java.io.File;
import java.io.FileOutputStream;

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=findViewById(R.id.btn_click);
        mResultText=findViewById(R.id.result);
        btn_click.setOnClickListener(this);
    }

    @Override
    public void onClick(View view) {
        startVoice(this,new XunFeiCallbackListener(){
            @Override
            public void onFinish(RecognizerResult results) {
                String text =parseInResult(results.getResultString());
                mResultText.append(text);
            }
        });
    }
}

最后,重构一下代码,检查是否有问题,

如果是在自己的手机上运行,那你需要先到设置里去打开你的录音权限

运行效果如下:

AndroidStudio实现语音转文字_android_08

如果你的代码运行出现闪退等问题的,欢迎大家评论区讨论或滴滴我!