2016-10-20 21:36:16 blueCat_1128 阅读数 1666
  • C++语音识别开篇

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

    5918 人正在学习 去看看 杨波

苹果在iOS10增加了一个语音识别功能,并且将其封装到了SpeechFramework库中,使用非常方便,在这里我用一个案例进行展示,需求如下图,点击开始录音和停止录音完成录音功能,点击识别录音对录音内容进行识别并展示到Label中
这里写图片描述

配置info.plist文件

想要使用录音和语音识别功能必须先配置info.plist文件,在其中增加授权属性(如果value值不填可能会出现问题)

<key>NSSpeechRecognitionUsageDescription</key>  
<string></string>   
<key>NSMicrophoneUsageDescription</key>  
<string></string> 

或者直接在info.plist中添加
这里写图片描述

录音

1 实例化录音对象(需要引用AVFoundation框架)

- (void)setupAudioRecorder{
    // 设置录音路径
    self.pathRecord = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).lastObject stringByAppendingPathComponent:@"record.caf"];
    // 如果这段代码不添加真机运行会出现问题
    AVAudioSession *session = [AVAudioSession sharedInstance];
    NSError *setCategoryError = nil;
    [session setCategory:AVAudioSessionCategoryPlayAndRecord error:&setCategoryError];
    // 实例化录音对象
    NSError *errorRecord = nil;
    self.recorder = [[AVAudioRecorder alloc]initWithURL:[NSURL fileURLWithPath:self.pathRecord] settings:@{AVNumberOfChannelsKey:@2,AVSampleRateKey:@44100,AVLinearPCMBitDepthKey:@32,AVEncoderAudioQualityKey:@(AVAudioQualityMax),AVEncoderBitRateKey:@128000} error:&errorRecord];
    // 准备录音
    [self.recorder prepareToRecord];
}

2 点击开始录音和结束录音完成录音并将其存入沙盒

// 开始录音
- (IBAction)satrtSoundRecording:(UIButton *)sender {
    [self.recorder record];
}
// 停止录音
- (IBAction)stopSoundRecording:(UIButton *)sender {
    [self.recorder stop];
}

语音识别

首先要导入语音识别的头文件Speech/Speech.h,然后想要使用语音识别要请求用户授权,当用户授权成功之后才可以进行识别,具体代码实现如下

// 识别录音
- (IBAction)identificationSoundRecording:(UIButton *)sender {
    //请求权限
    [SFSpeechRecognizer requestAuthorization:^(SFSpeechRecognizerAuthorizationStatus status) {
        /* 
         status 为请求权限的结果,有以下几个状态:
         1 用户没有选择
         SFSpeechRecognizerAuthorizationStatusNotDetermined,
         2 用户拒绝了语音识别请求
         SFSpeechRecognizerAuthorizationStatusDenied,
         3 使用的设备不支持语音识别
         SFSpeechRecognizerAuthorizationStatusRestricted,
         4 取得了用户的授权
         SFSpeechRecognizerAuthorizationStatusAuthorized,
         */
        // 获取权限成功
        if (status == SFSpeechRecognizerAuthorizationStatusAuthorized) {
            NSURL *url = [NSURL fileURLWithPath:self.pathRecord];
            // 实例化语音识别对象
            SFSpeechRecognizer *recongize = [[SFSpeechRecognizer alloc] init];
            SFSpeechURLRecognitionRequest *request = [[SFSpeechURLRecognitionRequest alloc] initWithURL:url];
            // 根据请求进行语音识别
            [recongize recognitionTaskWithRequest:request resultHandler:^(SFSpeechRecognitionResult * _Nullable result, NSError * _Nullable error) {
                if (error) {
                    NSLog(@"%@",error.description);
                    return ;
                }
                if (result) {
                    // 将语音识别结果展示到UI中
                    self.showRecordLabel.text = result.bestTranscription.formattedString;
                }
            }];
        }
    }];
}

备注:
语音识别为iOS10增加的新特性,Xcode8之前的版本没有SpeechFramework库,所以此方法只能在Xcode8中运行。

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

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

    5918 人正在学习 去看看 杨波


最近自己想接触下语音识别,经过一番了解和摸索,实现了对语音识别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-09-12 17:47:00 weixin_43112746 阅读数 2151
  • C++语音识别开篇

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

    5918 人正在学习 去看看 杨波
 ****科大讯飞的语音识别提供了两种音频来源方式,一个是通过麦克风,一个是来自音频文件。这里介绍本人自己写的通过音频
 文件识别的java代码。****

【离线识别参考我的另一篇】用java调用科大讯飞的离线语音识别dll实现离线识别(JNA实现)

之前的注册、获得注册码、以及SDK的下载这里不再赘述,直接上代码:

注意:
1、msc.jar一定要导入啊
2、本功能实现是在 在线情况下,离线情况下暂时用不了。

package com.iflytek;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;

import com.iflytek.cloud.speech.RecognizerListener;
import com.iflytek.cloud.speech.RecognizerResult;
import com.iflytek.cloud.speech.Setting;
import com.iflytek.cloud.speech.SpeechConstant;
import com.iflytek.cloud.speech.SpeechError;
import com.iflytek.cloud.speech.SpeechRecognizer;
import com.iflytek.cloud.speech.SpeechUtility;


public class VoiceTest {
	
	private static final String APPID="5a******1";//这里是自己的APPID
	private static VoiceTest mObject;
	private static StringBuilder mResult=new StringBuilder();
	private String fileName="test.pcm";//这里要将文件拷贝至根目录下,必须是.pcm文件
	
	//main方法,是否显示日志,语音实用程序验证程序的id
	public static void main(String[] args) {
		if(null!=args&&args.length>0&&args[0].equals("true")) {
			//显示日志
			Setting.setShowLog(true);
		}
		
		SpeechUtility.createUtility("appid="+APPID);
		getVoiceObj().Recognize();
	}
	
	//单例模式,创建对象
	private static VoiceTest getVoiceObj() {
		if(mObject==null) {
			mObject=new VoiceTest();
		}
		return mObject;
	}
	

	//建立语音识别对象
	private boolean mIsEndOfSpeech=false;
	private void Recognize() {
		if(SpeechRecognizer.getRecognizer()==null) {
			SpeechRecognizer.createRecognizer();
		}
		mIsEndOfSpeech=false;
		RecogizePcmFileBite();
	}

	//识别音频文件
	private void RecogizePcmFileBite() {
		//获取语音识别对象
		SpeechRecognizer recognizer=SpeechRecognizer.createRecognizer();
		//设置基本的识别参数,声音来源是音频,结果是自然语言文本
		recognizer.setParameter(SpeechConstant.AUDIO_SOURCE, "-1");
		recognizer.setParameter(SpeechConstant.RESULT_TYPE, "plain");
		//开始监听,参数是监听器对象
		recognizer.startListening(recListener);
		//创建文件输入流
		FileInputStream fis=null;
		//创建字节数组,长度为64K
		byte[] data=new byte[64*1024];
		try {
			fis=new FileInputStream(new File("./"+fileName));
			//文件剩余长度如果没有,就显示没有了
			if(0==fis.available()) {
				mResult.append("no audio avaible!");
				//取消语音识别
				recognizer.cancel();
			//否则有语音文件
			}else {
				int len=data.length;//此时为64*1024即有这么长
				while(data.length==len&&!mIsEndOfSpeech) {
					//读取文件
					len=fis.read(data);
					//写出文件
					recognizer.writeAudio(data, 0, len);
				}
				//停止语音识别
				recognizer.stopListening();
			}
		
		}catch(Exception e) {
			e.printStackTrace();
		}finally {
			try {
				if(null !=fis) {
					fis.close();
					fis=null;
					}
				} catch (IOException e) {
					e.printStackTrace();
				}
		}
	}
	
	//听写监听器
	private RecognizerListener recListener=new RecognizerListener() {
		@Override
		public void onBeginOfSpeech() {
			DebugLog.Log("onBeginOfSpeech enter");
			DebugLog.Log("*****开始录音*****");
			
		}
		
		@Override
		public void onVolumeChanged(int volume) {
			DebugLog.Log( "onVolumeChanged enter" );
			if (volume > 0)
				DebugLog.Log("*************音量值:" + volume + "*************");
			
		}
		
		@Override
		public void onResult(RecognizerResult result, boolean isLast) {
			DebugLog.Log( "onResult enter" );
			//获取监听结果的字符串
			mResult.append(result.getResultString());
			//如果是结尾
			if(isLast) {
				DebugLog.Log("识别结果为:"+mResult.toString());
				mIsEndOfSpeech=true;
				mResult.delete(0, mResult.length());
			}
			
		}
		
		@Override
		public void onEvent(int arg0, int arg1, int arg2, String arg3) {
			// TODO Auto-generated method stub
			
		}
		
		@Override
		public void onError(SpeechError arg0) {
			// TODO Auto-generated method stub
			
		}
		
		@Override
		public void onEndOfSpeech() {
			DebugLog.Log("onEndOfSpeech enter");
			DebugLog.Log("*****结束录音*****");
			mIsEndOfSpeech=true;
			
		}
		
	};
	
	

}

这里如果需要显示日志,记得把工具类粘上(里面的代码都不用动)

package com.iflytek;
import java.text.SimpleDateFormat;

public class DebugLog {
	
	public static void Log(String tag,String log)
	{
		if(true)
		    System.out.println(log);
	}
	
	public static void Log(String log)
	{
		SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 
		String date=dateFormat.format(new java.util.Date());
		if(true)
		    System.out.println("<" + date + ">" + log);
	}
	
	public static boolean isEmpty(String string){
		if(string == null)
		{
			return true;
		}
		if(string.isEmpty())
		{
			return true;
		}
		return false;
	}
}

最后直接run起来,就会将test.pcm这个音频文件的内容变为汉字输出到控制台
结果如下:

<2018-09-12 16:25:23>语音识别的结果是:汉堡包多少钱?一个英文怎么说?

test.pcm这个文件,SDK包里面有啊,不用问我要,在这

这里写图片描述

2018-07-31 17:08:50 yibuerbusanbu 阅读数 3433
  • C++语音识别开篇

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

    5918 人正在学习 去看看 杨波

1.前言:
本科毕业之后,开始了北漂,一直想从事一些偏上层方面的工作,开始找工作期间各种碰壁。可能自己c语言的基础还可以的原因,被现在的单位的引擎组招了过来,起初只是被用来干一些引擎的支持和测试,慢慢的开始接触到了语音识别等引擎的开发,所以利用自己在工作中所了解得在这里班门弄斧地谈谈语音识别,也是想工作进行总结。也欢迎大家指出错误和不足。
1.语音识别简介:
语音识别技术即AutomaticSpeechRecognition(简称ASR),是指将人说话的语音信号转换为可被计算机程序所识别的信息,从而识别说话人的语音指令及文字内容的技术。目前语音识别被广泛的应用于客服质检,导航,智能家居等领域。
2.语音识别过程:
在这里插入图片描述
语音识别大体上包含前端处理,特征提取,模型训练,解码四个模块。其中前端处理包括了,语音转码,高通滤波,端点检测等。
上图目前语音识别的基本流程,输入的语音数据流经过前端处理(语音格式转码,高通,端点检测),语音格式转码是将输入的语音数据转成pcm或者wav格式的语音,端点检测是检测出转码后语音中的有效语音,这样对解码速度和识别率上都会改善。经过前端处理之后的得到的分段语音数据送入特征提取模块,进行声学特征提取。最后解码模块对提取的特征数据进行解码,解码过程中利用发音字典,声学模型,语言模型等信息构建WFST搜索空间,在搜索空间内寻找匹配概率最大的最优路径,便得到最优的识别结果。
在其他章节中会详细介绍以上四个模块。
3.语音识别的学习:
由于语音识别本事就是一个非常大并且繁琐的工程,设计到知识面很广,目前我也在想如何把这个学习过程更加系统化,简单化。希望这一块能得到前辈的指点。
目前我再看这些书籍:
1).数学之美,这本书对整个语音识别过程以及各个模块讲的很详细,也很通俗易懂,是一本不错的语音识别入门的书。
2).语音信号处理,这本书对前端处理模块的学习有很大的帮助,由于是一本教材书籍,自己在有些地方看起来也很晦涩,目前也想在网上找一些相关网课看看,这样更加深理解,找到的话也会第一时间分享。
3).关于特征提起模块,网上有很多帖子写的都很详细,后面我也会整理一下。
4).解码和模型训练…未完!!!

2016-10-14 11:24:34 qq_30970529 阅读数 4665
  • C++语音识别开篇

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

    5918 人正在学习 去看看 杨波

iOS10苹果开放了语音识别接口,这让我们可以自己自由的把音频转为文本了。iOS的语音识别主要分为识别音频文件和识别音频缓存(按我的理解就是识别音频输入流达到实时转换的效果)。
因为iOS10对权限的要求更严格了所以在一切的工作之前我们要在info.plist文件里面增加两个节点。第一个节点:

key: Privacy - Speech Recognition Usage Description     value:语音识别(这个值可以自定义,需要你描述Speech Recognition的用法)

第二个节点:

key: Privacy - Microphone Usage Description     value:麦克风(这个值也是自定义的,同样是用来描述Microphone的用法的)

下面我们看看怎么识别音频文件:
首先我们要请求权限,
+ (void)requestAuthorization:(void(^)(SFSpeechRecognizerAuthorizationStatus status))handler
这个方法是SFSpeechRecognizer的类方法,SFSpeechRecognizerAuthorizationStatus是个枚举类型表示请求权限的结果,只有当status的值是SFSpeechRecognizerAuthorizationStatusAuthorized时才表示有使用语音识别的权限,增枚举类型的其他三个成员值分别是:
用户未决定SFSpeechRecognizerAuthorizationStatusNotDetermined、
拒绝SFSpeechRecognizerAuthorizationStatusDenied、
不支持SFSpeechRecognizerAuthorizationStatusRestricted
看代码:

 //请求权限
    [SFSpeechRecognizer requestAuthorization:^(SFSpeechRecognizerAuthorizationStatus status) {
        if (status == SFSpeechRecognizerAuthorizationStatusAuthorized) {
            NSURL *url = [[NSBundle mainBundle] URLForResource:@"speech" withExtension:@"m4a"];
            [self recognizeAudioFile:url];
        }
    }];

然后我们再看具体的怎么进行语音识别:
SFSpeechRecognizer这个类是具体用来进行语音识别的,默认初始化方法init表示识别本地语言环境,就是说如果你手机是中文那么你说中文就可以直接识别了。当然了如果我们想指定识别某种语言就要使用:- (nullable instancetype)initWithLocale:(NSLocale *)locale 这个方法进行初始化了。
然后我们再创建一个SFSpeechURLRecognitionRequest类的实例,这个实例包含了音频信息。最后再调用SFSpeechRecognizer实例的

- (SFSpeechRecognitionTask *)recognitionTaskWithRequest:(SFSpeechRecognitionRequest *)request
                                          resultHandler:(void (^)(SFSpeechRecognitionResult * __nullable result, NSError * __nullable error))resultHandler;

方法,将音频信息传给苹果的服务器然后,苹果会直接返回转换后的信息。直接看代码:

 SFSpeechRecognizer *recongize = [[SFSpeechRecognizer alloc] init];
    SFSpeechURLRecognitionRequest *request = [[SFSpeechURLRecognitionRequest alloc] initWithURL:url];
    [recongize recognitionTaskWithRequest:request resultHandler:^(SFSpeechRecognitionResult * _Nullable result, NSError * _Nullable error) {
        if (result) {
            self.speechText.text = result.bestTranscription.formattedString;
        }
        if (error) {
            self.speechText.text = error.description;
        }
    }];

到此为止已经完成了音频文件的识别了。下面我们再说说怎样实时识别音频输入流:
识别音频输入流的步骤与上面的大体相似,最主要的不同是音频资源的区别一个是直接从文件获取另外一个是从AVAudioNode的输出数据获取的。所以我们首先要开启麦克风获取AVAudioNode输出的音频信息,这部分就不细说了直接看代码:

 AVAudioSession *session = [AVAudioSession sharedInstance];
    NSError *error;
    [session setCategory:AVAudioSessionCategoryRecord error:&error];
    if (error) {
        self.speechText.text = error.description;
        return;
    }
    [session setMode:AVAudioSessionModeMeasurement error:&error];
    if (error) {
        self.speechText.text = error.description;
        return;
    }
    [session setActive:YES withOptions:AVAudioSessionSetActiveOptionNotifyOthersOnDeactivation error:&error];
    if (error) {
         self.speechText.text = error.description;
        return;
    }

    if (!auengine.inputNode) {
        self.speechText.text = @"无输入节点";
        return;

    }


    [auengine.inputNode installTapOnBus:0 bufferSize:1024 format:[auengine.inputNode outputFormatForBus:0] block:^(AVAudioPCMBuffer * _Nonnull buffer, AVAudioTime * _Nonnull when) {
        if (buffer) {
            [requestbuffer appendAudioPCMBuffer:buffer];
        }
    }];

    [auengine prepare];
    [auengine startAndReturnError:&error];

这样我们在- (void)installTapOnBus:(AVAudioNodeBus)bus bufferSize:(AVAudioFrameCount)bufferSize format:(AVAudioFormat * __nullable)format block:(AVAudioNodeTapBlock)tapBlock
这个方法的block里面就可以获取到输出的音频信息,接下来我们再识别这个信息:
第一步都是创建一个SFSpeechRecognizer实例,第二步有区别我们要创建SFSpeechAudioBufferRecognitionRequest这个对象的实例,第三步还一样的调用:- (SFSpeechRecognitionTask *)recognitionTaskWithRequest:(SFSpeechRecognitionRequest *)request
resultHandler:(void (^)(SFSpeechRecognitionResult * __nullable result, NSError * __nullable error))resultHandler;
的方法。

看代码:

 SFSpeechRecognizer *recognize = [[SFSpeechRecognizer alloc] init];
    SFSpeechAudioBufferRecognitionRequest *requestbuffer = [[SFSpeechAudioBufferRecognitionRequest alloc] init];

 [recognize recognitionTaskWithRequest:requestbuffer resultHandler:^(SFSpeechRecognitionResult * _Nullable result, NSError * _Nullable error) {
        if (result) {
            self.speechText.text = result.bestTranscription.formattedString;
        }
        if (error) {
            self.speechText.text = error.description;
        }
    }];

完整的源码已经上传到了github,下载源码

百度语音识别

阅读数 35

语音识别初识

阅读数 1003

语音识别

博文 来自: tangyuanjieDD
没有更多推荐了,返回首页