2016-05-09 11:48:36 vseeker 阅读数 9123
  • C++语音识别开篇

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

    5905 人正在学习 去看看 杨波

百度语音API地址:https://github.com/DelightRun/PyBaiduYuyin

google语音API地址:https://github.com/Uberi/speech_recognition

首先二者都可以实现中英文语言的识别,但考虑到google对英文的识别会更好,而百度语音对中文的识别会更好一点,所以在自己的项目中用了这两个API,而且利用google语音识别中在设置上会更麻烦一点,所以基于种种原因,中文识别我选择了百度语音。

鉴于百度语音的github项目中的帮助文档(与google 语音操作方式类似),实际上在测试的时候在有些方面还是不同的,没有良好的异常处理机制,google语音识别是一个相对完善的API,鉴于此希望做相关测试的小伙伴先进行google语音的测试,然后再测试百度语音,因为仅仅参考github的百度语音的帮助文档在运行代码时会提醒缺少 flac(flac.exe/flac.mac)这个与平台相关,解决这个问题只要将google语音 pip安装之后的安装目录下的flac文件拷到百度云语音的目录下(这个目录报错会提示),根据该提示新建目录,并做响应的拷贝操作即可

这了附上一点百度语音测试的代码:这是完全参考google 语音的Example目录下的示例代码进行修改的,还有一些修改痕迹没有去掉,所以先参考google的语音api会认识的比较 全面

# coding=utf-8

# NOTE: this example requires PyAudio because it uses the Microphone class

import PyBaiduYuyin as pby

# obtain audio from the microphone
r = pby.Recognizer()
with pby.Microphone() as source:
    # 监听一秒钟用于设定相关阈值
    r.adjust_for_ambient_noise(source) # listen for 1 second to calibrate the energy threshold for ambient noise levels
    print("Say something!")
    audio = r.listen(source)


# for testing purposes, we're just using the default API key
# to use another API key, use `r.recognize_google(audio, key="GOOGLE_SPEECH_RECOGNITION_API_KEY", show_all=True)`
# instead of `r.recognize_google(audio, show_all=True)`
print "trying to recognize ... "
print("Speech Recognition results:")
resultTmp = r.recognize(audio)
# print resultTmp[u'alternative'], type(resultTmp[u'alternative'])
print resultTmp 


这里测试用的都是默认的app_key,app_id,若想用自己的,可以在模块文件里修改即可,即下面这两个文件


等自己的项目完善后 会贴出个人的项目地址

2019-03-31 17:51:25 thinktothings 阅读数 747
  • C++语音识别开篇

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

    5905 人正在学习 去看看 杨波

google

[优点]

  • ).很牛逼,实时解析这么精准,了不起
  • ).有歧义的语句,复杂的语句,自动纠正能力很强,哪怕发音差(普通话差)也能识别
  • ).语音识别能力:丧心病狂
  • ).完全免费的: speechTexter

[缺点]

  • ).不能自动断句,查了官网说明,只支持英文,不支持中文(不能自动加标点符号)

百度

[优点]

  • ).非常不错,翻译的很好
  • ).免费版本,(收费版本,更精准)

[缺点]

  • ).QPS (每秒钟的并发 10)
  • ).复杂语句,自动纠正,还是做的还不够好
  • ).免费版的QPS太低,断句,丢字的现象

丧心病狂的谷歌语音识别能力

语音技术(google VS 百度)

2015-12-05 19:16:43 yangzhaomuma 阅读数 5513
  • C++语音识别开篇

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

    5905 人正在学习 去看看 杨波

Android语音识别,简单的理解就是把语音转化为文字。

在日常中,语音识别,车载导航、语音输入等,虽然不一定准确,但用途广泛。

这里就介绍下谷歌原生的语音识别与百度的语音识别

谷歌语音识别

谷歌语音识别做法很简单

1、首先检测本地是否有语音识别工具,比如谷歌语音搜索,如果没有就结束;

2、用intent意图表示语音识别;

3、发送这个intent,并等待返回;

4、显示返回的内容;

具体的代码如下:

package com.example.speak_csdn;

import java.util.ArrayList;
import java.util.List;

import android.os.Bundle;
import android.speech.RecognizerIntent;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;
import android.app.Activity;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;

public class MainActivity extends Activity {

	final int RESPONCERESULT=99;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		Button btnButton=(Button)findViewById(R.id.mybtn);
		btnButton.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
				speak();
			}
		});
	}

	public void speak()
	{
            try{  
             //通过Intent传递语音识别的模式,开启语音  
             Intent intent=new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);  
             //语言模式和自由模式的语音识别  
             intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL, RecognizerIntent.LANGUAGE_MODEL_FREE_FORM);  
             //提示语音开始  
             intent.putExtra(RecognizerIntent.EXTRA_PROMPT, "开始语音");  
             
             //开始语音识别  
             startActivityForResult(intent, RESPONCERESULT);  
             }catch (Exception e) {  
                 // TODO: handle exception  
                 e.printStackTrace();  
                 Toast.makeText(getApplicationContext(), "找不到语音设备", 1).show();  
             }  
	}

	@Override
	protected void onActivityResult(int requestCode, int resultCode, Intent data) {
		// TODO Auto-generated method stub
		
		//回调获取从谷歌得到的数据   
        if(requestCode==RESPONCERESULT && resultCode==RESULT_OK){  
            //取得语音的字符  
            ArrayList<String> results=data.getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS);  
            //谷歌可能有许多语音类似的返回,越往上优先级越高,这里列出所有的返回并拼接成字符串   
            String resultString="";  
            for(int i=0;i<results.size();i++){  
                resultString+=results.get(i);  
            }  
            Toast.makeText(this, resultString, 1).show();  
        }  
		super.onActivityResult(requestCode, resultCode, data);
	}
	
	

}

代码完成了,注意要加上网络访问权限,因为这个是在线语音识读,代码关键的语句在以下几句:

 //通过Intent传递语音识别的模式,开启语音  
             Intent intent=new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);  
             //语言模式和自由模式的语音识别  
             intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL, RecognizerIntent.LANGUAGE_MODEL_FREE_FORM);  
             //提示语音开始  
             intent.putExtra(RecognizerIntent.EXTRA_PROMPT, "开始语音");  
             
             //开始语音识别  
             startActivityForResult(intent, RESPONCERESULT);  


对应这个的布局语句很简单,只有一个button按钮。给这个按钮绑定事件,点击运行...


这和我们预料的不同啊,网络没有问题,测试了WIFI和GPRS都是同样的结果。最终这只能归结为谷歌后台服务无法连接,你或者可以通过翻墙来看到效果。

悲伤。

那现在我们看看中国本地的语音识别,百度语音。

百度语音识别

百度语音识别,应用的是百度提供的SDK来实现。这个在百度的开放平台上可以看到很详细的说明。
应用它的步骤如下:
1、下载jar包;
2、添加权限;
3、在代码中,用给定的API来做语音识别;
4、显示返回内容;

jar包、so文件下载

以下是从百度开放平台上下载的jar包以及so文件,用于后续的开发使用

权限添加

AndroidManifest.xml中添加需要的权限,如下:
    <uses-permission android:name="android.permission.RECORD_AUDIO" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.WRITE_SETTINGS" />
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.READ_PHONE_STATE" />
    <uses-permission android:name="android.permission.WAKE_LOCK" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    <!-- 蓝牙录音 -->
    <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
    <!-- 某些手机启动SCO音频连接需要此权限 -->
    <uses-permission android:name="android.permission.BROADCAST_STICKY" />
    <!-- 蓝牙录音检测耳机状态 -->
    <uses-permission android:name="android.permission.BLUETOOTH" />

代码中使用API

这个就是使用API的过程,如下代码:
package com.example.baiduspeak_csdn;

import java.util.ArrayList;

import com.baidu.voicerecognition.android.ui.BaiduASRDigitalDialog;
import com.baidu.voicerecognition.android.ui.DialogRecognitionListener;

import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;
import android.app.Activity;

public class MainActivity extends Activity {

	//百度自定义对话框
	 private BaiduASRDigitalDialog mDialog = null;
	 //对话框监听
	 private DialogRecognitionListener mRecognitionListener;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		
		Button btnButton=(Button)findViewById(R.id.mybtn);
		btnButton.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
				speak_Baidu();
			}
		});
		
		mRecognitionListener = new DialogRecognitionListener() {

            @Override
            public void onResults(Bundle results) {
                ArrayList<String> rs = results != null ? results.getStringArrayList(RESULTS_RECOGNITION) : null;
                if (rs != null && rs.size() > 0) {
                	Toast.makeText(MainActivity.this, rs.get(0), 1).show();
                }

            }
        };
	}
    //百度语音识别
	public void speak_Baidu()
	{
		if (mDialog != null) {
            mDialog.dismiss();
        }
        Bundle params = new Bundle();
        //设置注册百度开放平台得到的值 API_KEY,SECRET_KEY
        params.putString(BaiduASRDigitalDialog.PARAM_API_KEY, Constants.API_KEY);
        params.putString(BaiduASRDigitalDialog.PARAM_SECRET_KEY, Constants.SECRET_KEY);
        //设置对话框模式
        params.putInt(BaiduASRDigitalDialog.PARAM_DIALOG_THEME, Config.DIALOG_THEME);
        //根据设置新建对话框
        mDialog = new BaiduASRDigitalDialog(this, params);
        //设置对话框的监听
        mDialog.setDialogRecognitionListener(mRecognitionListener);
        //对话框设置
	    mDialog.getParams().putInt(BaiduASRDigitalDialog.PARAM_PROP, Config.CURRENT_PROP);
	    mDialog.getParams().putString(BaiduASRDigitalDialog.PARAM_LANGUAGE, Config.getCurrentLanguage());
	    mDialog.getParams().putBoolean(BaiduASRDigitalDialog.PARAM_START_TONE_ENABLE, Config.PLAY_START_SOUND);
	    mDialog.getParams().putBoolean(BaiduASRDigitalDialog.PARAM_END_TONE_ENABLE, Config.PLAY_END_SOUND);
	    mDialog.getParams().putBoolean(BaiduASRDigitalDialog.PARAM_TIPS_TONE_ENABLE, Config.DIALOG_TIPS_SOUND);
	    mDialog.show();
	}
	 @Override
	    protected void onDestroy() {
	        if (mDialog != null) {
	            mDialog.dismiss();
	        }
	        super.onDestroy();
	    }

}
代码也只是简单的定义一个按钮,按钮绑定一个事件。
事件发起时,我们设定了挺多参数,重要的有平台分配的APP_KEY,SECRET_KEY,PROP,语言的选择等。
根据这些,百度对我们发出的声音,在服务端,得到匹配的内容并返回前端。
效果如下:


这个效果我们是能看到的。简单的用法就是这样的。类似谷歌语音,一个请求即可。

源码

源码包括以上的谷歌和百度语音识别,可供下载:

2018-10-25 15:18:53 Soumns_Kris 阅读数 842
  • C++语音识别开篇

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

    5905 人正在学习 去看看 杨波

1.调用Google原生语音识别

 Intent intent = new Intent(
                RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
        intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL, RecognizerIntent.LANGUAGE_MODEL_FREE_FORM); //设置识别模式
        intent.putExtra(RecognizerIntent.EXTRA_PROMPT, "Please start your voice");//开始说话描述
        try {
            startActivityForResult(intent, RESULT_SPEECH); //RESULT_SPEECH为Activity回调时的code值
        } catch (ActivityNotFoundException a) { //当前设备无法支持google语音识别
            Toast t = Toast.makeText(getApplicationContext(),
                    "Opps! Your device doesn't support Speech to Text",
                    Toast.LENGTH_SHORT);
            t.show();
        }

2.Activity回调结果

  @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        switch (requestCode) {
            case RESULT_SPEECH: {
                if (resultCode == RESULT_OK && data != null) {
                    ArrayList<String> text = data
                            .getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS);
                    //此集合列表第一个值为匹配度最高的值
                    tv_open.setText(text.get(0));
                }
                break;
            }

        }
    }

3.由于Google语音识别有一定的限制,所以很多设备可能不支持。但又无法提取获取是否支持此功能,因此提供一个判断此Intent是否可用的方法

 public static boolean isIntentAvailable(Context context) {
        final PackageManager packageManager = context.getPackageManager();
        final Intent intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);//参数为需要启动Google识别的action,也可动态传递
        List<ResolveInfo> list =
                packageManager.queryIntentActivities(intent,
                        PackageManager.MATCH_DEFAULT_ONLY);
        return list.size() > 0;
    }

——————————-

三样东西有助于缓解生命的辛劳:希望,睡眠和微笑

2017-10-22 12:10:48 luanpeng825485697 阅读数 4249
  • C++语音识别开篇

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

    5905 人正在学习 去看看 杨波

全栈工程师开发手册 (作者:栾鹏)

安卓教程全解

安卓调用系统语音识别功能全解(谷歌语音服务):获取识别结果,使用语音识别进行搜索。

首先要添加权限

<uses-permission android:name="android.permission.INTERNET"/>

先初始化一个语音识别请求,调用系统语音识别功能,返回识别结果。

其主要原理就是将语音发送到google云端,然后云端处理,匹配相应的数据,发送到客户端。不过一般谷歌语音被阉割了,或无法翻墙,推荐使用讯飞或百度

    private void speechInput() {
        try {
              Intent intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);  //ACTION_RECOGNIZE_SPEECH接收输入语音,ACTION_WEB_SEARCH触发网络搜索或语音操作
              //指定自有形式的输入
              intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL,RecognizerIntent.LANGUAGE_MODEL_FREE_FORM);  //EXTRA_LANGUAGE_MODEL表示用于输入音频的语言模型
              intent.putExtra(RecognizerIntent.EXTRA_PROMPT,"开始语音");//EXTRA_PROMPT语音输入对话框中的提示字符串
              //intent.putExtra(RecognizerIntent.EXTRA_MAX_RESULTS, 1);  //EXTRA_MAX_RESULTS限制潜在识别结果的数目
              //intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE, Locale.ENGLISH);  //EXTRA_LANGUAGE指定默认值以外的输入语言
              startActivityForResult(intent, VOICE_RECOGNITION);
        } catch (Exception e) {
            e.printStackTrace();
            Toast.makeText(getApplicationContext(), "找不到语音设备", 1).show();
        }
    }

接收语音识别返回结果

    //查找一个语音识别请求的结果
    @Override
    protected void onActivityResult(int requestCode,int resultCode,Intent data) {
      if (requestCode == VOICE_RECOGNITION && resultCode == RESULT_OK) {
        ArrayList<String> results;
        results = data.getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS);
        float[] confidence;
        String confidenceExtra = RecognizerIntent.EXTRA_CONFIDENCE_SCORES;
        confidence = data.getFloatArrayExtra(confidenceExtra);

        //在这里使用识别的语音字符串results做点事情
      }
      super.onActivityResult(requestCode, resultCode, data);
    }

调用系统语音识别后直接进行网络搜索

    private void speechWebSearch() {
      Intent intent = new Intent(RecognizerIntent.ACTION_WEB_SEARCH);
      intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL,RecognizerIntent.LANGUAGE_MODEL_WEB_SEARCH); //LANGUAGE_MODEL_WEB_SEARCH表示进行网络搜索
      startActivityForResult(intent, 0);
    }
没有更多推荐了,返回首页