2014-02-25 21:02:22 u013513947 阅读数 2486
  • C++语音识别开篇

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

    5905 人正在学习 去看看 杨波

如果你实在闲的蛋疼,不妨拿起你的 iPhone 用标准的四川话对 Siri 说,“放心巴适得很绝对正宗 ”,当然来自美帝国的 Siri 是不可能听明白四川话的(但她可以听懂粤语......)。事实上不仅是 Siri,市面上的语音助手类产品,几乎没有听得懂四川话的。不过这一现象将很快得到改善,科大讯飞率先发布了四川话语音识别技术

国内目前做方言识别技术的公司不多,其中最大困难就在于国内的方言实在是太多了,需要建立不同的识别模型。而且各个方言缺乏足够多的语料,训练不足,导致识别准确性不高。所以优先只能够解决使用人数比较多,或者是范围比较广的方言,例如很多语音类产品都可以识别粤语。

科大讯飞的解决办法是,主要是通过深度神经网络等技术,做出一个方言语音识别引擎,用于方言口音适配。同时跟国家语委合作,征集到了足够多的方言语音数据来训练识别引擎,通过大量的预料训练,提升方言识别的准确性。据科大讯飞宣称,他们的四川话语音识别引擎,识别准确率超过 85%。

据科大讯飞向36氪透露,四川话语音识别技术将率先应用于输入法产品,很快将发布支持四川话语音输入的讯飞输入法将。此前讯飞输入法已经支持普通话、英语、粤语语音输入。除了手机输入外,方言音识别技术还是有比较丰富的使用场景,例如语音驾驶导航、智能电视、可穿戴设备都用得上;甚至还可以成为教育教学、考试考评的公众平台;另外,在聆听京剧、川剧、昆曲、黄梅戏等戏曲时,提供普通话意思“翻译”......

虽然不像普通话这么有普世意义,但四川话总是有非常独特的魅力。而且据不完全统计,在全球大约有 1 亿 2 千万人说四川话,是一个非常庞大的群体。而且随着智能语音技术的普及,非要让四川的同学说普通话才能够享受到,这是非常不科学的...... 所以干脆研发四川话语音识别技术来得比较实在。

除了四川话,科大讯飞正在研发的东北话、上海话等方言语音识别技术也将在年内陆续发布。

演示地址:http://v.youku.com/v_show/id_XNjc3NDg3ODQ4.html

更多关于讯飞最新资讯,请关注http://club.voicecloud.cn/

2014-06-23 20:37:05 zpf8861 阅读数 6278
  • C++语音识别开篇

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

    5905 人正在学习 去看看 杨波

Android引入了对语音识别的支持。语音识别主要位于android.speech包中,主要的类包括SpeechRecognizer、RecognitionService、RecognizerIntent、RecognizerResultsIntent、RecognitionListener等类和接口。

SpeechRecognizer提供了接入语音识别服务的接口,下面是SpeechRecognizer的常用方法:  

<span style="font-size:18px;">  createSpeechRecognizer()    //创建语音识别器
        setRecognitionListener()    //设置监听器
        startListening()    //开始语音识别
        stopListening()    //结束语音识别</span>

语音识别要求"android.permission.RECORD_AUDIO"权限。

为了进行语音识别,首先需要发布一个语音识别的Activity,然后系统会启动语音识别引擎,并对用户的语音进行处理,处理的结果将会通过onActivityResult()方法被返回。下面是Android中的一个实现:

SpeechRecognizer sr = SpeechRecognizer.createSpeechRecognizer(this, new ComponentName(getPackageName(),
                BDRecognitionService.class.getName()));
        sr.setRecognitionListener(new listener());
        sr.startListening(new Intent(getIntent().getAction()).putExtras(getIntent()));

回调方法

<span style="text-indent: 24px; background-color: rgb(240, 240, 240);">class listener implements RecognitionListener{</span>
        @Override
        public void onReadyForSpeech(Bundle params) {
            
        }

        @Override
        public void onBeginningOfSpeech() {
            
        }

        @Override
        public void onRmsChanged(float rmsdB) {
            
        }

        @Override
        public void onBufferReceived(byte[] buffer) {
           
        }

        @Override
        public void onEndOfSpeech() {
        
        }

        @Override
        public void onError(int error) {
            
            
        }

        @Override
        public void onResults(Bundle results) {
            
            //具体处理识别结果
        }

        @Override
        public void onPartialResults(Bundle partialResults) {
          
            
        }

        @Override
        public void onEvent(int eventType, Bundle params) {
           
        }
        
    }



注意:android虽然提供了该接口,但是没有提供具体的识别功能

new ComponentName(getPackageName(),BDRecognitionService.class.getName())

因此实例化时的参数指定了具体实现功能的service,这就需要开发者实现RecognitionService这个服务接口,下一篇文章将介绍如何实现该类。




2012-03-26 11:17:23 huazaihepa 阅读数 301
  • C++语音识别开篇

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

    5905 人正在学习 去看看 杨波

 最近语音识别很火,但是都是用的在线语音识别,研究了一下离线语音识别,小范围内的语音识别率还不错,在此记录一下

首先本文要说的两个前提1.android平台离线语音识别 2.小范围语音

小范围语音指的是相对固定的命令。本文的例子大概实现了20条语音命令,超出范围的无法识别。因此本文中离线语音的使用范围也有限,对于一些固定的输入可能有用,比如用语音命令代替打开,播放,重启这些简单的固定的命令。

先上个例子

1.按照 http://leiwuluan.iteye.com/blog/1287305 的方法,先跑一个PocketSphinxDemo的例子起来。跑起来之后会发现语音识别率很低,大概20%不到。下面来优化一下

2.编写自己的命令集

<s>百度</s>
<s>谷歌</s>
<s>音乐</s>
<s>抬头</s>
<s>低头</s>

保存为command.txt

http://www.speech.cs.cmu.edu/tools/lmtool.html上点Browse,提交command.txt,在线生成语言模型文件。这里只要生成的lm文件,命名为test.lm。从这里下载pocketsphinx-win32,解压后在/model/lm/zh_cn有个mandarin_notone.dic的文件,打开后,搜索command.txt里面的词,然后替换相应的内容,替换后的内容如下

 存为test.dic

3.替换语言模型文件。下载附件中的data.zip,解压后文件如下(之前附件中的data不可用,已更新)

分别放到一下目录

/sdcard/Android/data/test/hmm/tdt_sc_8k
/sdcard/Android/data/test/lm/test.dic
/sdcard/Android/data/test/lm/test.lm

如果要换目录的话,对应修改RecognizerTask.RecognizerTask()里的如下代码

  c.setString("-hmm", "/sdcard/Android/data/test/hmm/tdt_sc_8k");
  c.setString("-dict", "/sdcard/Android/data/test/lm/test.dic");
  c.setString("-lm", "/sdcard/Android/data/test/lm/test.lm");

lm和dic文件即3中生成的文件,tdt_sc_8k也可以从这里下载。

4.文件准备完毕,重新跑1中的demo。语音输入2中的命令,识别率99%以上,但是输入命令集以外的无法识别。



 

6.附件为工程文件,将data解压,按照3里面写的位置放到sd卡里面即可。以下字典内的词可以识别

 

 

2013-08-12 13:47:01 rhljiayou 阅读数 6980
  • C++语音识别开篇

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

    5905 人正在学习 去看看 杨波

1、首先下载讯飞sdk及文档:http://open.voicecloud.cn/

2、学习里面的demo简单实现了一个小的语音识别功能

先做一个简单demo,看看识别效果。注:语音识别必须联网。

所有接口必需在联网状态下才能正常使用。

效果图:


#import <UIKit/UIKit.h>
#import "iflyMSC/IFlySpeechRecognizer.h"
#import "iflyMSC/IFlyDataUploader.h"

@protocol SpeechAlertViewDelegate <NSObject>
@optional
- (void)getResultText:(NSString *)text;
@end

@interface SpeechAlertView : UIAlertView<IFlySpeechRecognizerDelegate>
{
    UIImageView *speechImage;//声音图片
    
    IFlySpeechRecognizer * _iFlySpeechRecognizer;//语音识别对象
    UIView *backgroundView;
}
@property (assign, nonatomic)id<SpeechAlertViewDelegate> speechDelegate;
@end

#import "SpeechAlertView.h"
#define APPID @"51de5743"
#define TIMEOUT @"20000"
// timeout      连接超时的时间,以ms为单位,毫秒,符号ms ,1000 毫秒 = 1秒,30000=30秒
//timeout:网络超时时间,单位:ms,默认为20000,范围0-30000
@implementation SpeechAlertView

-(id)init
{
    self = [super initWithFrame:CGRectMake(0, 0, 300, 220)];
    if (self) {
        // Initialization code
    }
    return self;
}
- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        // Initialization code
    }
    return self;
}

//uialertview的大小位置
-(void)setFrame:(CGRect)frame{
    //重新设置弹出框的大小和位置    
    UIWindow *window =  [UIApplication sharedApplication].keyWindow;

    [super setFrame:CGRectMake((window.frame.size.width-self.frame.size.width)/2, (window.frame.size.height-self.frame.size.height)/2, self.frame.size.width, self.frame.size.height)];
}
//重新写界面内容
- (void) layoutSubviews {
    //屏蔽系统的ImageView 和 UIButton
    for (UIView *v in [self subviews]) {
        if ([v class] == [UIImageView class]){
            [v setHidden:YES];
        }
        
        
        if ([v isKindOfClass:[UIButton class]] ||
            [v isKindOfClass:NSClassFromString(@"UIThreePartButton")]) {
            [v setHidden:YES];
        }
    }
    
    //添加背影图
    UIView *backView = [[UIView alloc]initWithFrame:CGRectMake(0, 0, self.frame.size.width, self.frame.size.height)];
    backView.backgroundColor = [UIColor colorWithRed:66/255.0 green:68/255.0 blue:70/255.0 alpha:1.0];
    [self addSubview:backView];
    
    //添加标题
    UILabel *titleLabel = [[UILabel alloc]initWithFrame:CGRectMake(10, 0, backView.frame.size.width-20, 30)];
    titleLabel.backgroundColor = [UIColor clearColor];
    titleLabel.text = @"语音识别";
    titleLabel.font = [UIFont systemFontOfSize:16];
    titleLabel.textColor = [UIColor colorWithRed:218.0/255.0 green:217.0/255.0 blue:217.0/255.0 alpha:1];
    [backView addSubview:titleLabel];
    
    //添加关闭按钮huati_close
    UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
    [button setImage:[UIImage imageNamed:@"alert_close.png"] forState:UIControlStateNormal];
    [backView addSubview:button];
    button.tag = 1;
    button.frame = CGRectMake(backView.frame.size.width-25, 5, 20, 20);
    [button addTarget:self action:@selector(buttonClicked:) forControlEvents:UIControlEventTouchUpInside];
    
    //添加黄线
    UIView *xianView = [[UIView alloc]initWithFrame:CGRectMake(0, 30, backView.frame.size.width, 1)];
    xianView.backgroundColor = [UIColor yellowColor];
    [backView addSubview:xianView];
    
    //添加内容
    UILabel *label = [[UILabel alloc]initWithFrame:CGRectMake(0, 35, backView.frame.size.width, 40)];
    label.backgroundColor = [UIColor clearColor];
    label.text = @"默认不讲话5秒后自动关闭,间隔不讲话2秒后关闭,最多说20秒";
    label.font = [UIFont boldSystemFontOfSize:15];
    label.textAlignment = UITextAlignmentCenter;
    label.textColor = [UIColor yellowColor];
    [backView addSubview:label];
    label.numberOfLines = 0;
    
    //添加中间图片
    speechImage = [[UIImageView alloc]initWithFrame:CGRectMake((self.frame.size.width-50)/2, 80, 50, 85)];
    speechImage.image = [UIImage imageNamed:@"yuyin_01.png"];
    [backView addSubview:speechImage];
    
    //添加说完了按钮
    UIButton *submitButton = [UIButton buttonWithType:UIButtonTypeCustom];
    
    submitButton.frame = CGRectMake((backView.frame.size.width-170)/2, 170, 150, 35);
    submitButton.tag = 2;
    [submitButton setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
    [submitButton setTitle:@"说完了" forState:UIControlStateNormal];
    [submitButton setBackgroundImage:[UIImage imageNamed:@"alert_tButton.png"] forState:UIControlStateNormal];
    [submitButton addTarget:self action:@selector(buttonClicked:) forControlEvents:UIControlEventTouchUpInside];
    [backView addSubview:submitButton];
    //想添加什么由此添加
    
    //创建对象
    NSString *initString = [[NSString alloc] initWithFormat:@"appid=%@,timeout=%@",APPID,TIMEOUT];
    //语音识别对象创建
    _iFlySpeechRecognizer = nil;
    _iFlySpeechRecognizer = [IFlySpeechRecognizer createRecognizer:initString delegate:self];
//    _iFlySpeechRecognizer.delegate = self;
    /*
     2.vad_bos:静音超时时间,即用户多长时间不说话则当做超 时处理,单位:ms,engine 指定 sms 识别默认值为 5000,其他 情况默认值为 4000,范围 0-10000;
     3.vad_eos:后端点静音检测时间,即用户停止说话多长时间 内即认为不再输入,自动停止录音,单位:ms,sms 识别默认 值为 1800,其他默认值为 700,范围 0-10000;
     */
    [_iFlySpeechRecognizer setParameter:@"domain" value:@"sms"];
    [_iFlySpeechRecognizer setParameter:@"sample_rate" value:@"16000"];
    [_iFlySpeechRecognizer setParameter:@"plain_result" value:@"0"];
    initString = nil;
    
    //开始识别
    [_iFlySpeechRecognizer startListening];
    
}
//按钮处理方法
-(void) buttonClicked:(id)sender
{
    [self dismissWithClickedButtonIndex:0 animated:YES];
    
}

//显示
-(void)show
{
//    [super show];
    UIWindow *window =  [UIApplication sharedApplication].keyWindow;
    backgroundView = [[UIView alloc]initWithFrame:window.frame];
    backgroundView.backgroundColor = [UIColor clearColor];
    [backgroundView addSubview:self];
    [window addSubview:backgroundView];
}
//弹出框消失
-(void)dismissWithClickedButtonIndex:(NSInteger)buttonIndex animated:(BOOL)animated
{
    [_iFlySpeechRecognizer stopListening];
    [_iFlySpeechRecognizer cancel];
    [_iFlySpeechRecognizer setDelegate:nil];
    _iFlySpeechRecognizer = nil;
    speechImage = nil;
    [backgroundView removeFromSuperview];
    backgroundView = nil;
}


#pragma mark - IFlySpeechRecognizerDelegate
- (void) onVolumeChanged: (int)volume
{
    NSLog(@"%d",volume);
    //录音的音量,音量范围1~100
    if (volume>=0 &&volume<=5) {
        speechImage.image = [UIImage imageNamed:@"yuyin_01.png"];
    }else if(volume>5 && volume<=30){
        speechImage.image = [UIImage imageNamed:@"yuyin_02.png"];
    }else{
        speechImage.image = [UIImage imageNamed:@"yuyin_03.png"];
    }
}

- (void) onBeginOfSpeech
{
    NSLog(@"正在录音");
}

- (void) onEndOfSpeech
{
    NSLog(@"停止录音");
}

- (void) onError:(IFlySpeechError *) error
{
    NSLog(@"停止录音%@,%@",error,[error errorDesc]);
    [self dismissWithClickedButtonIndex:0 animated:YES];
}

//结果
- (void) onResults:(NSArray *) results
{
    NSMutableString *result = [[NSMutableString alloc] init];
    NSDictionary *dic = [results objectAtIndex:0];
    for (NSString *key in dic) {
        [result appendFormat:@"%@",key];
    }
    NSLog(@"转写结果:%@--results:%@",result,results);
    
    //返回结果
    [_speechDelegate getResultText:result];
}

@end

源码下载地址:

http://download.csdn.net/detail/rhljiayou/5889565

2016-06-21 12:16:02 roboyun 阅读数 3117
  • C++语音识别开篇

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

    5905 人正在学习 去看看 杨波

说明

前一篇的语义理解主要是跑通ROS Node的一个流程,下面开发的语音Node略有点实际意义,其中构建node的过程,如同语义理解Node,略有不同。

整理的代码放在github上,语音合成https://github.com/roboyun/ros_tts,语音识别https://github.com/roboyun/ros_asr

准备

在开始之前,先做一些准备工作,就是播放音频和录音相关的代码。因为树莓派本身没有录音的接口,所以需要外接一个usb声卡。音频输出暂时直接用树莓派上面的耳机接口。

测试播放mp3

首先用mplayer播放一下mp3,一般是可以听见的。
当然可以直接在python中调用mplayer区播放mp3,
import os
os.system('mplayer out.mp3')
或者
import subprocess
subprocess.call('mplayer out.mp3',shell=True)
或者
subprocess.Popen(['mplayer','out.mp3'])

测试录音

录音可以用arecord
$ sudo apt-get install alsa-utils
这个工具包包含
alsactl, aconnect, alsamixer, amidi, amixer, aplay, aplaymidi, arecord, arecordmidi,
aseqnet, iecset, speaker-test
我们只使用其中的arecord
$ arecord -D 'plughw:1,0' -d 10 test.wav
-D表示设备,外接的usb录音设备,如果不是在树莓派上测试,这个会不一样
-d 10 表示录制10秒钟的时间
-t 表示type,可以加参数-t wav也可以不加
最后是文件名。
录完之后可以用aplay或者mplayer播放,有一个问题是当录音距离比较远的时候,声音很小。alsamixer有一个在命令行之下的图形界面,可以对不同的声卡调节音量,我实验了下录音mac的音量,并没有改变。

实验完成以后写两个服务很简单,代码放在上面给出的github地址,这里就不贴了。

TODO

语音识别这个node还是有很多工作需要做的,比如应该将模块改为publisher/subscriber模式,在运行过程中一直保持着语音监听,还有就是语音识别中通常需要的端点检测,流失识别等。

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