讯飞语音——带你简单实现语音听写

语音听写 de 简单实现


一、前言

        如果你没有在讯飞语音平台上创建应用,请先参考讯飞语音的详细配置使用

二、功能描述

        语音听写和语音合成都是较为基础也是最常使用的两个基本功能。

        语音合成是将文本转化为语音说出来,就是读文章。

        语音听写是什么呢?

                开启或者说触发语音听写的功能,我们开始讲话,然后讲话结束;该服务能将说话的内容转化为文本;

当然功能是这样,用途不仅仅是讲说话内容转化为文本。理解说话者的意图,这才是人工智能的方向。

        这里我们简单的以一个小项目实例实现简单的语音听写。

三、项目实例

        <1.1>项目结构如下图所示:

讯飞语音——带你简单实现语音听写_第1张图片

        <2.1>.新建Android Application Project 项目,命名为TestHearerDemo,

            <2.1.1>说明:

                项目结构基本和上一个项目一样,如果看过上一个语音合成可直接跳过该步骤,去看代码实现部分。首先有几个注意点,避免初始化错误,讯飞语音版本自升级后要求,SDK Appid 一一对应。导入配置文件到新建工程TestHearerDemo

            <2.1.2>配置文件:

                assetslibs 下的包

        注意arm中的so文件必须与当前key值是对应的。就是创建应用时下载的 SDK中所包含的文件,appid 是创建应用时所产生的,不同的应用key值不同。

讯飞语音——带你简单实现语音听写_第2张图片


四、项目代码

        <1.1>.test.layout布局文件


 
     
 
     
 
     

        <1.2>MainActivity.java 代码如下:

package pers.rfeng.demo;

import java.util.HashMap;
import java.util.LinkedHashMap;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import org.json.JSONTokener;

import com.iflytek.cloud.RecognizerResult;
import com.iflytek.cloud.SpeechConstant;
import com.iflytek.cloud.SpeechError;
import com.iflytek.cloud.SpeechRecognizer;
import com.iflytek.cloud.SpeechUtility;
import com.iflytek.cloud.ui.RecognizerDialog;
import com.iflytek.cloud.ui.RecognizerDialogListener;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;

public class MainActivity extends Activity implements OnClickListener {

    //存放听写分析结果文本
    private HashMap hashMapTexts = new LinkedHashMap();
    private Button b_btn;  //初始化控件
    private EditText e_text;
    
    SpeechRecognizer hearer;  //听写对象

    RecognizerDialog dialog;  //讯飞提示框
    
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.test);

        b_btn = (Button) findViewById(R.id.listen_btn);
        e_text = (EditText) findViewById(R.id.content_et);

        b_btn.setOnClickListener(this);

    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
        case R.id.listen_btn:

            // 语音配置对象初始化
            SpeechUtility.createUtility(MainActivity.this, SpeechConstant.APPID + "=57b2decc");

            // 1.创建SpeechRecognizer对象,第2个参数:本地听写时传InitListener
            hearer = SpeechRecognizer.createRecognizer( MainActivity.this, null);
            // 交互动画
            dialog = new RecognizerDialog(MainActivity.this, null);
            // 2.设置听写参数,详见《科大讯飞MSC API手册(Android)》SpeechConstant类
            hearer.setParameter(SpeechConstant.DOMAIN, "iat"); // domain:域名
            hearer.setParameter(SpeechConstant.LANGUAGE, "zh_cn");
            hearer.setParameter(SpeechConstant.ACCENT, "mandarin"); // mandarin:普通话
            
            //3.开始听写
            dialog.setListener(new RecognizerDialogListener() {  //设置对话框

                @Override
                public void onResult(RecognizerResult results, boolean isLast) {
                    // TODO 自动生成的方法存根
                     Log.d("Result", results.getResultString());
                     //(1) 解析 json 数据<< 一个一个分析文本 >>
                	StringBuffer strBuffer = new StringBuffer();
            		try {
            			JSONTokener tokener = new JSONTokener(results.getResultString());
            			Log.i("TAG", "Test"+results.getResultString());
            			Log.i("TAG", "Test"+results.toString());
            			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);
            				strBuffer.append(obj.getString("w"));

            			}
            		} catch (Exception e) {
            			e.printStackTrace();
            		} 
//            		String text = strBuffer.toString();
            		// (2)读取json结果中的sn字段
            		String sn = null;
            		
            		try {
            			JSONObject resultJson = new JSONObject(results.getResultString());
            			sn = resultJson.optString("sn");
            		} catch (JSONException e) {
            			e.printStackTrace();
            		}

            		//(3) 解析语音文本<< 将文本叠加成语音分析结果  >>
            		hashMapTexts.put(sn, strBuffer.toString());
            		StringBuffer resultBuffer = new StringBuffer();  //最后结果
            		for (String key : hashMapTexts.keySet()) {
            			resultBuffer.append(hashMapTexts.get(key));
            		}

            		e_text.setText(resultBuffer.toString());
            		e_text.requestFocus();//获取焦点
                    e_text.setSelection(1);//将光标定位到文字最后,以便修改

                }

                @Override
                public void onError(SpeechError error) {
                    // TODO 自动生成的方法存根
                    error.getPlainDescription(true);
                }
            });
            
            dialog.show();  //显示对话框

            break;
        default:
            break;
        }
    }
}

        <1.3> AndroidManifest.xml 配置文件

        注意权限配置




    

    
        
            
                

                
            
        
        
        
        
        
    

     
     
     
      
       
       
       
       
     
     
       
       
       
     

五、项目演示

        运行项目效果如下:

                界面可能有点儿不好看,嘻嘻

        说明:

                点击按钮,可以开始说话,讯飞语音默认说话最长时长不超过 1 分钟

讯飞语音——带你简单实现语音听写_第3张图片


讯飞语音——带你简单实现语音听写_第4张图片


        语音听写分析结果显示

讯飞语音——带你简单实现语音听写_第5张图片


希望对你有所帮助,更多功能请参考开发文档


你可能感兴趣的:([Java],API)