zoukankan      html  css  js  c++  java
  • 语音识别技术

    通过谷歌语音接口的实现语音识别

    最近在项目中有需要实现语音识别的功能。折腾了几天才搞好。刚开始做的时候没点头绪 ,网上找的资料都是乱七八糟的,要不就是非常古老的实现方法,一些简单的代码片段。所以我决定把我的经验分享给大家。

    要在IOS中实现语音识别流程如下:

    录音->pcm格式->转换wav->转换flac->向谷歌发送请求->等待返回的json数据->解析数据;

    首先如果你要使用谷歌的接口实现语音识别必须知道下面着几点:

    1.如何发送POST请求。(可以使用开源库ASIHttpRequest,AFNetWorking,这些库都封装了网络请求,使用起来非常简单);

     2.了解音频格式pcm,wav,flac,(着三个音频格式的关系是,因为谷歌接口只接受flac音频格式,其他格式无法识别,IOS中无法录制flac音频格式,也无法录制wav,只能录制pcm,所以要一步一步转换);

    3.了解AVAudioRecorder类如何使用,怎么配置.

    在IOS中录音就要使用AVAudioRecorder这个类,这个类的实例方法如下:

    - (id)initWithURL:(NSURL *)url settings:(NSDictionary *)settings error:(NSError **)outError;
    url:录音完成后声音存放的位置,

              settings:设置录制声音的参数,只有一个关键的key跟大家讲下AVFormatIDKey,这个key决定你录制出来声音的格式,我们要录成lpcm格式,未压缩的原音数据,以便我们转换,所以使用kAudioFormatLinearPCM值.其他key可以在帮助文档看,

      NSMutableDictionary *recordSetting = [[NSMutableDictionaryalloc]init];

      [recordSetting setValue:[NSNumbernumberWithInt:kAudioFormatLinearPCM]forKey:AVFormatIDKey];

        [recordSetting setValue:[NSNumbernumberWithFloat:16000.0]forKey:AVSampleRateKey];

        [recordSetting setValue:[NSNumbernumberWithInt:1]forKey:AVNumberOfChannelsKey];

        [recordSetting setValue:[NSNumbernumberWithInt:16]forKey:AVLinearPCMBitDepthKey];

        [recordSetting setValue:[NSNumbernumberWithInt:AVAudioQualityHigh]forKey:AVEncoderAudioQualityKey];

        [recordSetting setValue:@(NO)forKey:AVLinearPCMIsBigEndianKey];

    设置完这个对象后就可以开始录音了.得到lpcm格式音频数据后就开始我们的第一次转换,转换成wav,什么是wav呢?点击,  知道wav是什么之后就可以开始转码了.转码是用C实现的,着部分代码在下面我打包的文件里面;

    文件转换成WAV之后还需要将WAV的转换成FLAC才能上传到谷歌接口进行语音识别,幸好在在github上有人封装好了一个FLAC的开源库:https://github.com/jhurt/FLACiOS

    下载这个源码后要去掉OGG的支持,不然编译不过。直接点击文件 -,编译后进入,Products目录拿到.a和framework,把这个两个文件一起加入你的工程。

    声音处理完毕后就要往谷歌语音接口发请求了。我是使用ASI发的请求,大家可以用其他库来发,毕竟ASI有点太老了,我只是用习惯了而已。这里的filePath就是转换后FLAC文件的地址;

    #define GOOGLE_AUDIO_URL @"http://www.google.com/speech-api/v1/recognize?xjerr=1&client=chromium&lang=zh-CN"

    NSURL *URL = [NSURL URLWithString:GOOGLE_AUDIO_URL];

         ASIFormDataRequest *request = [ASIFormDataRequestrequestWithURL:URL];

        [request addRequestHeader:@"Content-Type"value:@"audio/x-flac; rate=16000"];

        [request appendPostDataFromFile:filePath];

        [request setRequestMethod:@"POST"];

        

        request.completionBlock = ^{

            NSLog(@"json: %@",request.responseString);

            NSData *data = request.responseData;

            id ret = nil;

            ret = [NSJSONSerializationJSONObjectWithData:data options:NSJSONReadingMutableContainerserror:nil];

            NSLog(@"ret %@",ret);

            results(ret);

        };

        request.failedBlock = ^{

            UIAlertView *alert = [[UIAlertViewalloc]initWithTitle:@"错误"message:@"网络请求错误"delegate:nilcancelButtonTitle:@"确定" otherButtonTitles:nil,nil];

            [alert show];

            NSLog(@"网络请求错误:%@",request.error);

        };

        [request startSynchronous];

    -----------------------------------------------------------------------------------------------以下是谷歌返回的JSON解析--------------------------------------------------------------------------------------------

    if(dic ==nil || [dic count] == 0){

                    return;

                }

                NSArray *array = [dic objectForKey:@"hypotheses"];

         if ([arraycount] ) {

                     NSDictionary *dic_hypotheses  = [arrayobjectAtIndex:0];

                    NSString *  sContent = [NSStringstringWithFormat:@"%@", [dic_hypothesesobjectForKey:@"utterance"]];

                    self.textField.text = sContent;

      }

    这里是我写的一个测试工程全部代码 http://pan.baidu.com/s/1kTMBBk7 ;直接可以用。有什么问题请留言,期待于大家交流

  • 相关阅读:
    Redis 事务相关的命令有哪几个?
    是否了解字典树?
    memcached 是如何做身份验证的?
    memcached 和服务器的 local cache(比如 PHP 的 APC、 mmap 文件等)相比,有什么优缺点?
    memcached 如何处理容错的?
    memcached 的多线程是什么?如何使用它们?
    memcached 的内存分配器是如何工作的?为什么不适用 malloc/free!?为何要使用 slabs?
    memcached 如何实现冗余机制?
    memcached 最大能存储多大的单个 item?
    memcached 能接受的 key 的最大长度是多少?
  • 原文地址:https://www.cnblogs.com/yulang314/p/3837855.html
Copyright © 2011-2022 走看看