2016-03-05 18:57:12 ljt2724960661 阅读数 2053
  • C++语音识别开篇

    本篇mark老师将教大家使用第三方库的调用来简单的实现语音识别。随着机器学习和人工智能的热闹,国内语音行业也可谓是百花齐放。 语音识别一个伟大的时代已在我们身边悄悄走来。

    5925 人正在学习 去看看 杨波

总结如下:

第一步 导入armeabi文件夹和Msc.jar文件如图,然后写两个类 


MainActivity中的java代码:


第二步 在activity的onCreate()中写一个方法 initSpeech()方法,并Ctrl+1 实现,如下:

        private RecognizerDialog iatDialog; //识别窗口
private SpeechRecognizer iatRecognizer; //识别对象


               //初始化讯飞语音控件
public void initSpeech(){
SpeechUser.getUser().login(getActivity(), null, null, "appid="+APPID,listener);
//创建听写对象,如果只使用无UI听写功能,不需要创建RecognizerDialog
iatRecognizer=SpeechRecognizer.createRecognizer(getActivity());
//初始化听写Dialog,如果只使用有UI听写功能,无需创建SpeechRecognizer
iatDialog =new RecognizerDialog(getActivity());
}

第三步 写一个点击事件的方法,用于当点击语音按钮时触发该事件,如下:

public void onClick(View v){

showIatDialog();

}

      //语音识别对话框
public void showIatDialog()
{
if(null == iatDialog) {
//初始化听写Dialog
iatDialog =new RecognizerDialog(getActivity());
}
String engine="iat_engine";
//清空Grammar_ID,防止识别后进行听写时Grammar_ID的干扰
iatDialog.setParameter(SpeechConstant.CLOUD_GRAMMAR, null);
//设置听写Dialog的引擎
iatDialog.setParameter(SpeechConstant.DOMAIN, engine);
iatDialog.setParameter(SpeechConstant.SAMPLE_RATE, "16000");
//清空结果显示框.
et_number.setText(null);
//显示听写对话框
iatDialog.setListener(recognizerDialogListener);
iatDialog.show();
showToast("请开始说话...");
}


//用户登录回调监听器.
private SpeechListener listener = new SpeechListener()
{
@Override
public void onData(byte[] arg0) {
}
@Override
public void onCompleted(SpeechError error) {
if(error != null) {
showToast(error.getMessage());
}
}
@Override
public void onEvent(int arg0, Bundle arg1) {
}
};

//识别回调监听器
RecognizerDialogListener recognizerDialogListener=new RecognizerDialogListener()
{
@Override
public void onResult(RecognizerResult results, boolean isLast) {
String text = JsonParser.parseIatResult(results.getResultString());
et_number.append(text.replace("。", ""));
et_number.setSelection(et_number.length());
}
public void onError(SpeechError error) {
showToast(error.getMessage());
}
};


@Override
public void onStop() {
if (null != iatRecognizer) {
iatRecognizer.cancel();
}
if (null != iatDialog) {
iatDialog.cancel();
}
super.onStop();
}



第四步:在创建一个类JsonParser.java 里面的写的代码如下:


import org.json.JSONArray;


import org.json.JSONObject;
import org.json.JSONTokener;


import android.text.TextUtils;


//import com.iflytek.speech.ErrorCode;
//import com.iflytek.speech.SpeechError;
/**
 * 对云端返回的Json结果进行解析
 */
public class JsonParser {

/**
* 听写结果的Json格式解析
* @param json
* @return
*/
public static String parseIatResult(String json) {
if(TextUtils.isEmpty(json))
return "";

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();
}

/**
* 识别结果的Json格式解析
* @param json
* @return
*/
public static String parseGrammarResult(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");
for(int j = 0; j < items.length(); j++)
{
JSONObject obj = items.getJSONObject(j);
if(obj.getString("w").contains("nomatch"))
{
ret.append("没有匹配结果.");
return ret.toString();
}
ret.append("【结果】" + obj.getString("w"));
ret.append("【置信度】" + obj.getInt("sc"));
ret.append("\n");
}
}
} catch (Exception e) {
e.printStackTrace();
ret.append("没有匹配结果.");

return ret.toString();
}

/**
* 语义结果的Json格式解析
* @param json
* @return
*/
public static String parseUnderstandResult(String json) {
StringBuffer ret = new StringBuffer();
try {
JSONTokener tokener = new JSONTokener(json);
JSONObject joResult = new JSONObject(tokener);


ret.append("【应答码】" + joResult.getString("rc") + "\n");
ret.append("【转写结果】" + joResult.getString("text") + "\n");
ret.append("【服务名称】" + joResult.getString("service") + "\n");

ret.append("【操作名称】" + joResult.getString("operation") + "\n");
ret.append("【完整结果】" + json);
} catch (Exception e) {
e.printStackTrace();
ret.append("没有匹配结果.");

return ret.toString();
}
}








2019-08-01 11:32:20 weixin_40796925 阅读数 1051
  • C++语音识别开篇

    本篇mark老师将教大家使用第三方库的调用来简单的实现语音识别。随着机器学习和人工智能的热闹,国内语音行业也可谓是百花齐放。 语音识别一个伟大的时代已在我们身边悄悄走来。

    5925 人正在学习 去看看 杨波


最近自己想接触下语音识别,经过一番了解和摸索,实现了对语音识别API的简单调用,正好写文章记录下。目前搜到的帖子里,有现成的调用百度语音API来对音频文件进行识别的;也有通过谷歌语音服务来实现了实时语音识别的。由于我这谷歌语音一直调用不成功,就将二者结合,简单实现了通过百度语音API来进行实时语音识别。

语音识别

语音识别技术就是让机器通过识别和理解过程把语音信号转变为相应的文本或命令的技术,微信中将语音消息转文字,以及“Hi Siri”启用Siri时对其进行发号施令,都是语音识别的现实应用。

语音识别API

百度语音识别通过REST API的方式给开发者提供一个通用的HTTP接口。任意操作系统、任意编程语言,只要可以对百度语音服务器发起http请求,均可使用此接口来实现语音识别。调用API的流程在百度语音官方文档中有说明。

在这里插入图片描述

语音识别步骤

  1. 先注册百度云的账号,控制台中创建百度语音的应用,获取API Key和Secret Key
  2. 通过API Key 和 Secret Key获取token
  3. 将token和本地音频数据上传到API链接
  4. 根据API返回结果获取解析后的文字结果

注意上述过程中我们是使用的本地音频数据,那么我们如何将自己的语音转为相应的数据呢?只要调用麦克风记录我们的语音信息存为wav格式的文件即可。而实时语音识别,即一直保持检测麦克风,只要有声音就生成wav文件向API发送请求;当识别不到语音信息时,自动停止。

代码中我参考了调用谷歌语音的 speech_recognition 模块,因为它调用麦克风的命令特别简单,而且会根据检测麦克风结果自动结束录音。

需要通过pip install SpeechRecognition 下载 speech_recognition 模块来实现上述录音工作。

效果展示

语音识别结果如下图:
在这里插入图片描述

代码下载

语音识别代码下载

百度网盘下载:
链接:https://pan.baidu.com/s/1l8JrYKn1pR5CZPCCme17OA
提取码:rc2e

GitHub代码下载:
https://github.com/pengfexue2/yuyin.git

以上算是对语音识别的初步实现,希望后续能挖掘些更有意思的应用,欢迎继续关注哈~
最后也希望推下自己记录学习 Python、前端以及微信小程序开发的公众号 TEDxPY
在这里插入图片描述

2018-08-08 15:26:48 qq_42749116 阅读数 3319
  • C++语音识别开篇

    本篇mark老师将教大家使用第三方库的调用来简单的实现语音识别。随着机器学习和人工智能的热闹,国内语音行业也可谓是百花齐放。 语音识别一个伟大的时代已在我们身边悄悄走来。

    5925 人正在学习 去看看 杨波

  我们的语音文件在很多的时候都会进行识别,因为语音在某些场合不适合听,我们就会转换成语音尽心,但是你在使用的语音识别软件可以识别完全的语音吗?识别出来的文字会和语音的内容相同吗?其实很多的语音识别软件都会都这种错误,识别不出来语音的面的某些字,今天给大家推荐一款在线进行语音识别的软件——迅捷PDF在线转换器,我们一起来操作一下吧。

  步骤一:打开浏览器,搜索迅捷PDF在线转换器,点击进入网站首页。

  

  步骤二:进入网站首页,在导航栏的位置找到语音识别,把鼠标移动到语音识别,会看到语音转文字。

  

  步骤三:进入转换页面,点击选择文件,选择需要进行识别的语音文件。

  

  步骤四:添加完文件以后,点击开始转换,需要识别的语音文件就会在识别的过程中,请耐心等待。

  步骤五:转换完成的文件可以直接进行下载,也会在导航栏上方的我的文件里进行保存。

  

  以上就是进行语音识别的软件,以及语音识别的步骤。

2018-06-03 10:35:58 sty945 阅读数 5696
  • C++语音识别开篇

    本篇mark老师将教大家使用第三方库的调用来简单的实现语音识别。随着机器学习和人工智能的热闹,国内语音行业也可谓是百花齐放。 语音识别一个伟大的时代已在我们身边悄悄走来。

    5925 人正在学习 去看看 杨波

语音识别的过程

这里写图片描述

2016-11-24 16:25:52 KwunYamShan 阅读数 6024
  • C++语音识别开篇

    本篇mark老师将教大家使用第三方库的调用来简单的实现语音识别。随着机器学习和人工智能的热闹,国内语音行业也可谓是百花齐放。 语音识别一个伟大的时代已在我们身边悄悄走来。

    5925 人正在学习 去看看 杨波

#科大讯飞-语音识别开发

##在线语音识别
将连续语音快速识别为文字

语音识别在模拟器上是无法测试的,虚拟机mac接收不到声音或者语音识别是访问云端数据,所以如果手机的网络没有开启,就无法实现识别声音的!一定要开启手机的网络,如果手机不存在语音识别功能的话,也是无法启用识别!

##效果图
这里写图片描述

##源码

新下载地址(Android Studio工程):https://download.csdn.net/download/kwunyamshan/11259989
由于旧下载地址下载次数过多分数已经超高所以新建了一个内容一样,放心下载
注意:源码中是我的sdk,只有三个装机量35天试用期限,你们试用需要替换掉SpeechApp中配置的Appid以及so库!

旧下载地址(Android Studio工程):http://download.csdn.net/detail/kwunyamshan/9692791

##集成步骤

开通服务,下载SDK
之前介绍过,地址:http://blog.csdn.net/kwunyamshan/article/details/53320164

Step 1. 导入so库
 
	 eclipse将so库导入到libs目录下
	 AS用户将so导入到jniLibs目录下
	 下载的官方SDK中有七个so库目前已经支持市面上98%的手机
	 armeabi目录下libmsc.so只支持市面上百分之八十的手机,如果不需要做适配的话导入这一个so库也是极好的

这里写图片描述

Step 2. 拷贝资产文件
		将 SDK 资源包assets 路径下的资源文件拷贝至 Android 工程 asstes 目录下

这里写图片描述

Step 3.  初始化
		这是很重要并且是必须的一步操作,实际上初始化的操作是异步进行的,如果初始化还没有完成你就开始调用了语音识别,是会出现很多问题的,建议在你程序刚刚启动的时候调用
public class SpeechApp extends Application {

    @Override
    public void onCreate() {
        // 应用程序入口处调用,避免手机内存过小,杀死后台进程后通过历史intent进入Activity造成SpeechUtility对象为null
        // 如在Application中调用初始化,需要在Mainifest中注册该Applicaiton
        // 注意:此接口在非主进程调用会返回null对象,如需在非主进程使用语音功能,请增加参数:SpeechConstant.FORCE_LOGIN+"=true"
        // 参数间使用半角“,”分隔。
        // 设置你申请的应用appid,请勿在'='与appid之间添加空格及空转义符

        // 注意: appid 必须和下载的SDK保持一致,否则会出现10407错误

        SpeechUtility.createUtility(SpeechApp.this, "appid=" + getString(R.string.app_id));

        // 以下语句用于设置日志开关(默认开启),设置成false时关闭语音云SDK日志打印
        // Setting.setShowLog(false);
        super.onCreate();
    }

}
Step 4.  添加用户权限,官方给的API中不规范有几条权限中间有空格导致编译不通过 ,注意一下
<!--连接网络权限,用于执行云端语音能力 -->
    <uses-permission android:name="android.permission.INTERNET"/>
    <!--获取手机录音机使用权限,听写、识别、语义理解需要用到此权限 -->
    <uses-permission android:name="android.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"/>
    <!--手机定位信息,用来为语义等功能提供定位, 提供更精准的服务-->
    <!--定位信息是敏感信息, 可通过Setting.setLocationEnable(false)关闭定位请求 -->
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
    <!--如需使用人脸识别,还要添加:摄相头权限, 拍照需要用到-->
    <uses-permission android:name="android.permission.CAMERA" />
Step 5. 代码
public class MainActivity extends Activity {


    private StringBuffer mBuffer;
    private TextView tv;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        tv = (TextView) findViewById(R.id.tv_translate_text);
    }

    public void startVoice(View view) {
        //1.创建RecognizerDialog对象
        RecognizerDialog mDialog = new RecognizerDialog(this, null);
        //2.设置accent、 language等参数
        mDialog.setParameter(SpeechConstant.LANGUAGE, "zh_cn");
        mDialog.setParameter(SpeechConstant.ACCENT, "mandarin");
        //若要将UI控件用于语义理解,必须添加以下参数设置,设置之后onResult回调返回将是语义理解结果
        // mDialog.setParameter("asr_sch", "1");
        // mDialog.setParameter("nlp_version", "2.0");

        mBuffer = new StringBuffer();
        //3.设置回调接口
        mDialog.setListener(mRecognizerDialogListener);
        //4.显示dialog,接收语音输入
        mDialog.show();
    }

    RecognizerDialogListener mRecognizerDialogListener = new RecognizerDialogListener() {
        //听写结果回调接口(返回Json格式结果,用户可参见附录13.1);
        //一般情况下会通过onResults接口多次返回结果,完整的识别内容是多次结果的累加;
        //关于解析Json的代码可参见Demo中JsonParser类;
        //isLast等于true时会话结束。
        @Override
        public void onResult(RecognizerResult results, boolean isLast) {
            String result = results.getResultString();//语音听写的结果

            String resultString = processData(result);

            mBuffer.append(resultString);

            if (isLast) {
                //话已经说完了
                String finalResult = mBuffer.toString();
                System.out.println("解析结果:" + finalResult);
                tv.setText(finalResult);

            }

        }

        @Override
        public void onError(SpeechError error) {

        }
    };

    //解析json
    protected String processData(String result) {
        Gson gson = new Gson();
        VoiceBean voiceBean = gson.fromJson(result, VoiceBean.class);

        StringBuffer sb = new StringBuffer();

        ArrayList<VoiceBean.WsBean> ws = voiceBean.ws;
        for (VoiceBean.WsBean wsBean : ws) {
            String word = wsBean.cw.get(0).w;
            sb.append(word);
        }

        return sb.toString();
    }


}

layout

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent"

    >
<TextView
    android:padding="5dip"
    android:layout_width="match_parent"
    android:layout_height="230dip"
    android:id="@+id/tv_translate_text"
    android:background="#fff"
    android:textSize="22sp"
    android:textColor="#000"
    android:hint="请点击按钮"
    />
<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal"
    android:background="#F1AF5A"
    android:gravity="center"
    >
    <ImageButton
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:background="@drawable/button"
        android:onClick="startVoice"
        />
</LinearLayout>

</LinearLayout>
Step 6. 目录结构

这里写图片描述

遇到问题可以留言探讨会尽快回复,也可以访问官方地址
网址:http://bbs.xfyun.cn/forum.php?mod=viewthread&tid=13040&fromuid=86908

没有更多推荐了,返回首页