精华内容
下载资源
问答
  • 语音唤醒

    2021-05-16 08:19:19
    语音唤醒前言一、语音唤醒相关环境搭建二、使用步骤1.使用流程2.示例代码总结 前言 针对语音交互过程,提供了一种语音唤醒的方法供大家参考,语音交互采用snowboy离线语音唤醒引擎,snowboy已经被kitt.AI团队下架,...


    前言

    针对语音交互过程,提供了一种语音唤醒的方法供大家参考,语音交互采用snowboy离线语音唤醒引擎,snowboy已经被kitt.AI团队下架,但我们仍能够在github中找到该项目


    获取相关工具开发包网址:
    链接: link.

    一、语音唤醒相关环境搭建

    下载完成后,文件夹中文件如下图所示,在终端处打开swig文件夹进入python文件夹通过make指令编译生成python文件及二进制链接文件即可使用
    在这里插入图片描述

    二、使用步骤

    1.使用流程

    1.传入热词模型snowboy.umdl
    2.使用snowboydecoder模块创建对象snowboydecoder.HotwordDetector(model,sensitivity=0.5)
    3.开始热词检测,detector.start(detected_callback=function_name,interrupt_callback,sleep_time=0.03)

    2.示例代码

    代码如下(示例):

    #_*_coding=UTF-8_*_
    
    #导入SDK包
    import sys
    sys.path.append('/home/pi/SnowBoy')
    import my1audio
    import snowboydecoder
    import signal
    
    interrupted = False
    
    def signal_handler(signal,frame):
    	global interrupted
    	interrupted = True
    #play()为所传入的函数
    def play():
    	my1audio.play('snowboy_rouse.wav')
    	return True
    
    def interrupt_callback():
    	global interrupted
    	return interrupted
    
    def rouse(function):
    #判断命令行指令是否传入唤醒词模型,无则退出程序
    	if len(sys.argv)==1:
    		print("Error:need to specify model name")
    		print("Usage:python demo.py your.model")
    		sys.exit(-1)
    
    #唤醒词模型为输入的参数,这里可以进行修改
    #modle = sys.argv[1]
    
    	modle = '/home/pi/SnowBoy/resources/snowboy.umdl'  #修改model,指定其文件名
    
    #capture Sigint signal ,e.g.,Ctrl+C
    	signal.signal(signal.SIGINT,signal_handler)
    
    #唤醒词检测函数,调整sensitivity参数可修改唤醒词检测的准确性
    	detector = snowboydecoder.HotwordDetector(modle,sensitivity=0.5)
    	
    
    	print "Listening......Please Ctrl+C to exit"
    
    #main loop
    #回调函数detected_callback=snowboydecoder.play_audio_file
    #修改回调函数可实现我们的功能
    	detector.start(detected_callback=function,interrupt_check=interrupt_callback,sleep_time=0.3)
    
    #资源释放
    	detector.terminate()
    
    ##实现自己的语音唤醒平台,我们只需要修改三个参数:
    ##1.修改model,model=‘resources/snowboy.umdl’   修改model,指定model的文件名
    ##2.修改热度检测灵敏度修改sensitivity
    ##3.修改回调函数 detected_callback=own_callbacks
    if __name__=='__main__':
    	rouse(play)
    	print 'aaaa'
    
    

    总结

    通过采用离线语音唤醒引擎能够实现系统被唤醒后执行相应的功能

    展开全文
  • 3.程序默认执行语音唤醒模块,当语音唤醒标志符awaken_flag == true时,关闭唤醒服务,打开听写服务; 4.根据听写的文本,自做简单语音识别算法,并填写在相应的textbox中,适合特定场景开发; 4.同时利用System....
  • 最近项目上需要实现语音调度,一开始是想用苹果原生speech Framework框架的,但是网上找了很久都没有原生实现语音唤醒功能的栗子,到时有不少百度,讯飞的语音唤醒,语音识别的栗子,不过都是单独实现的代码,没有将...

    前言
    最近项目上需要实现语音调度,一开始是想用苹果原生speech Framework框架的,但是网上找了很久都没有原生实现语音唤醒功能的栗子,到时有不少百度,讯飞的语音唤醒,语音识别的栗子,不过都是单独实现的代码,没有将这两个功能整合到一块,就有下面这篇博客语音唤醒+语音识别,实现语音控制效果。

    一、项目环境配置

    注册讯飞开放平台,创建应用得到APPID,下载SDK,配置项目

    讯飞开放平台 https://www.xfyun.cn/

    打开👆链接,选择注册,进行注册账号

    在这里插入图片描述

    注册完成,进入控制台,创建应用得到appid

    在这里插入图片描述

    进入应用,选择语音唤醒,设置唤醒词,可以设置多个,以逗号分隔

    在这里插入图片描述

    设置完,直接前往SDK下载中心

    在这里插入图片描述

    下载 语音唤醒,离线命令词识别IOS SDK

    在这里插入图片描述

    将离线命令词识别Demo中的lib文件copy到自己项目路径下

    打开项目,加入

    库名称 添加范围 功能
    iflyMSC.framework 必要 讯飞开放平台静态库。
    libz.tbd 必要 用于压缩、加密算法。
    AVFoundation.framework 必要 用于系统录音和播放 。
    SystemConfiguration.framework 系统库 用于系统设置。
    Foundation.framework 必要 基本库。
    CoreTelephony.framework 必要 用于电话相关操作。
    AudioToolbox.framework 必要 用于系统录音和播放。
    UIKit.framework 必要 用于界面显示。
    CoreLocation.framework 必要 用于定位。
    Contacts.framework 必要 用于联系人。
    AddressBook.framework 必要 用于联系人。
    QuartzCore.framework 必要 用于界面显示。
    CoreGraphics.framework 必要 用于界面显示。
    libc++.tbd 必要 用于支持C++。
    在这里插入图片描述

    info.plist文件中配置Privacy - Microphone Usage Description

    在这里插入图片描述

    需要确保以上框架导入,不然就会出现👇这些问题

    在这里插入图片描述

    在配置一下Enable Bitcode选项为NO,

    在这里插入图片描述
    不配置出现以下错误在这里插入图片描述

    版本过低,编译就会出现👇问题,选一下IOS 10.0即可

    版本过低错误
    解决在这里插入图片描述

    以上基本配置完成了,有点啰嗦。

    二、整合语音唤醒+语音识别,实现语音控制

    SpeechControlManagers.h

    //
    //  SpeechControlManagers.h
    //  SpeechControlDemo
    //
    //  Created by FF on 2020/11/10.
    //  Copyright © 2020 www.ff.com. All rights reserved.
    //
    
    #import <Foundation/Foundation.h>
    #import "IFlyMSC/IFlyMSC.h"
    
    NS_ASSUME_NONNULL_BEGIN
    
    @interface SpeechControlManagers : NSObject<IFlyVoiceWakeuperDelegate,IFlySpeechRecognizerDelegate>
    /**语音识别类*/
    @property (nonatomic, strong) IFlySpeechRecognizer * iflySpeechRecognizer;
    /**语音唤醒类*/
    @property (nonatomic,strong)  IFlyVoiceWakeuper    * iflyVoiceWakeuper;
    /**当前会议的结果*/
    @property (nonatomic, strong) NSMutableString      * curResult;
    /**取消*/
    @property (nonatomic)         BOOL                  isCanceled;
    /**线程循环状态*/
    @property (nonatomic)         BOOL                  m_isCanRun;
    /**语音唤醒状态 YES已经开启识别,NO未开启识别*/
    @property (nonatomic)         BOOL                  isVoiceWakeuperState;
    /**语音识别状态 YES已经开启识别,NO未开启识别*/
    @property (nonatomic)         BOOL                  isSpeechRecognizerState;
    /*用于播放提供的音频文件*/
    @property (nonatomic,assign) SystemSoundID soundId;
    
    /**识别引擎类型*/
    @property (nonatomic, strong)         NSString             * engineType;
    /**语法类型*/
    @property (nonatomic, strong)         NSString             * grammarType;
    /**云端识别唯一ID,需上传语法才会返回*/
    @property (nonatomic, strong)         NSString             * cloudGrammerid;
    /**本地识别唯一ID,需上传语法才会返回*/
    @property (nonatomic, strong)         NSString             * localgrammerId;
    /**grm路径*/
    @property (nonatomic, strong)         NSString             * grammBuildPath;
    /**common.jet文件路径*/
    @property (nonatomic, strong)         NSString             * aitalkResourcePath;
    /**本地语法文件路径*/
    @property (nonatomic, strong)         NSString             * bnfFilePath;
    /**云端语法文件路径*/
    @property (nonatomic, strong)         NSString             * abnfFilePath;
    /**唤醒词文件路径*/
    @property (nonatomic, strong)         NSString             * wakupEnginPath;
    
    @property (nonatomic, strong) NSArray              * engineTypesArray;
    /**唤醒词*/
    @property (nonatomic,strong)  NSDictionary         * wakeupWordsDictionary;
    
    /**单例*/
    +(instancetype) shareInstance;
    /**初始化讯飞语音接口*/
    - (void) initIFly;
    /**初始化语音控制相关对象*/
    - (void) initVoiceControlObject;
    /**初始化音频播放器*/
    - (void) initAudioPlayer;
    /**构建语法并上传*/
    - (void) buildGrammar;
    /**配置语音唤醒参数*/
    - (void) configureVoiceWakeuperParam;
    /**开始语音控制*/
    - (void) startVoiceControl;
    /**停止语音控制*/
    - (void) stopVoiceControl;
    /**开始播放语音*/
    -(void) startAudioPlayer;
    @end
    
    NS_ASSUME_NONNULL_END
    
    

    SpeechControlManagers.m

    //
    //  SpeechControlManagers.m
    //  SpeechControlDemo
    //
    //  Created by FF on 2020/11/10.
    //  Copyright © 2020 www.ff.com. All rights reserved.
    //
    
    #import "SpeechControlManagers.h"
    #import "Definition.h"
    #import "RecognizerFactory.h"
    #import "SpeechDataHelper.h"
    #import "SpeechControlDataHelper.h"
    #import <AudioToolbox/AudioToolbox.h>
    #define kOFFSET_FOR_KEYBOARD 110.0
    
    #define GRAMMAR_TYPE_BNF    @"bnf"
    #define GRAMMAR_TYPE_ABNF    @"abnf"
    #define GRAMMAR_DICRECTORY  @"/grm"
    
    static SpeechControlManagers* _instance = nil;
    
    @implementation SpeechControlManagers
    +(instancetype) shareInstance
    {
        
        static dispatch_once_t onceToken;
        dispatch_once(&onceToken, ^{
            _instance = [[self alloc]init];
        });
        return _instance;
    
    }
    
    - (void) initIFly
    {
        //设置日志打印等级
        [IFlySetting setLogFile:LVL_NONE];
        
        //设置是否打印控制台
        [IFlySetting showLogcat:YES];
    
        //设置日志文件的路径
        NSArray *paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);
        NSString *cachePath = [paths objectAtIndex:0];
        [IFlySetting setLogFilePath:cachePath];
        
        //设置APPID
        NSString *initString = [[NSString alloc] initWithFormat:@"appid=%@",APPID_VALUE];
        
        [IFlySpeechUtility createUtility:initString];
    }
    
    #pragma mark - Initialization
    
    -(void) initParam
    {
        //初始化类型
        NSString *documentsPath = nil;
        NSArray *appArray = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
        if ([appArray count] > 0) {
            documentsPath = [appArray objectAtIndex:0];
        }
        NSString *appPath = [[NSBundle mainBundle] resourcePath];
        
        _grammBuildPath = [documentsPath stringByAppendingString:GRAMMAR_DICRECTORY];
        
        _aitalkResourcePath = [[NSString alloc] initWithFormat:@"fo|%@/aitalk/common.jet",appPath] ;
        
        _bnfFilePath = [[NSString alloc] initWithFormat:@"%@/bnf/call.bnf",appPath];
        
        _abnfFilePath = [[NSString alloc] initWithFormat:@"%@/oneshotbnf/oneshot_cloud.abnf",appPath];
        
        _wakupEnginPath = [[NSString alloc] initWithFormat:@"%@/ivw/%@.jet",appPath,APPID_VALUE];
    }
    
    - (void) initAudioPlayer
    {
        //定义URl,要播放的音乐文件是win.wav
        NSURL *audioPath = [[NSURL alloc] initFileURLWithPath:[[NSBundle mainBundle] pathForResource:@"operating_face_rec"ofType:@"wav"]];
        
        //C语言的方法调用
        //注册服务
        AudioServicesCreateSystemSoundID((__bridge CFURLRef)audioPath, &_soundId);
        
        //增添回调方法
        AudioServicesAddSystemSoundCompletion(_soundId,NULL, NULL, NULL,NULL);
    }
    
    - (void) initVoiceControlObject
    {
        
        [self initParam];//初始化配置文件路径
        self.wakeupWordsDictionary = [[NSDictionary alloc] initWithObjectsAndKeys:@"小扣小扣",@"0",nil];
        
        [self initAudioPlayer];//初始化音频播放器
        
        //配置默认为本地识别
        self.engineType = [IFlySpeechConstant TYPE_LOCAL];
        self.grammarType = GRAMMAR_TYPE_BNF;
        self.isCanceled = NO;
        self.isVoiceWakeuperState = NO;
        self.isSpeechRecognizerState = NO;
        self.m_isCanRun = YES;
        self.localgrammerId = nil;
        self.cloudGrammerid = nil;
    
        //创建语音唤醒
        self.iflyVoiceWakeuper = [IFlyVoiceWakeuper sharedInstance];
        self.iflyVoiceWakeuper.delegate = self;
        [_iflyVoiceWakeuper setParameter:@"" forKey:[IFlySpeechConstant PARAMS]];
        
        //创建语音识别类
        self.iflySpeechRecognizer = [RecognizerFactory CreateRecognizer:self Domain:@"asr"];
        [_iflySpeechRecognizer setParameter:@"" forKey:[IFlySpeechConstant PARAMS]];
        [self.iflySpeechRecognizer setParameter:@"1" forKey:@"asr_wbest"];
        [self createDirec:GRAMMAR_DICRECTORY];//
        
        //构建语法并上传
        [self buildGrammar];
        
        //配置语音唤醒参数
        [self configureVoiceWakeuperParam];
        
        __weak typeof(self) weakSelf = self;
        /* 创建一个并发队列 */
        dispatch_async(dispatch_queue_create("net.bujige.testQueue", DISPATCH_QUEUE_CONCURRENT), ^{
            /* 耗时任务... */
            //开始语音控制
            [weakSelf startVoiceControl];
        });
    }
    
    
    
    -(void) startAudioPlayer
    {
        //开始播放
        AudioServicesPlayAlertSound(_soundId);
    }
    //-(void)sound{
    //
    //    SystemSoundID soundID;
    //    //NSBundle来返回音频文件路径
    //    NSString *soundFile = [[NSBundle mainBundle] pathForResource:@"operating_face_rec" ofType:@"wav"];
    //    //建立SystemSoundID对象,但是这里要传地址(加&符号)。 第一个参数需要一个CFURLRef类型的url参数,要新建一个NSString来做桥接转换(bridge),而这个NSString的值,就是上面的音频文件路径
    //    AudioServicesCreateSystemSoundID((__bridge CFURLRef)[NSURL fileURLWithPath:soundFile], &soundID);
    //    //播放提示音 带震动
        AudioServicesPlayAlertSound(soundID);
    //    //播放系统声音
    //    AudioServicesPlaySystemSound(soundID);
    //}
    
    - (void)startVoiceControl
    {
        while (_m_isCanRun) {
            if (!self.isVoiceWakeuperState) {//判断唤醒状态
                self.isVoiceWakeuperState = [_iflyVoiceWakeuper startListening];
                if(self.isVoiceWakeuperState)
                {
                    NSLog(@"==>开启唤醒");
                }
                else
                {
    //                NSLog(@"启动识别服务失败,请稍后重试!");
                }
            }else{
    //            NSLog(@"请先上传语法!");
            }
            if ( [self isCommitted] && self.isSpeechRecognizerState) {//判断语法是否已经上传,是否上传成功
                [self startAudioPlayer];
    
                //睡眠两秒,等待语音播放完
                [NSThread sleepForTimeInterval:2];
                
                BOOL ret = [_iflySpeechRecognizer startListening];
                if (ret) {
                    NSLog(@"启动语音识别成功");
                    self.isSpeechRecognizerState = NO;
                }
                else
                {
    //                NSLog(@"启动语音识别失败");
                }
            }else{
            }
            usleep(10);
        };
      
    }
    
    /**停止语音控制*/
    - (void) stopVoiceControl
    {
         [_iflyVoiceWakeuper stopListening];
    }
    
    #pragma mark - upload grammar
    
    -(void) buildGrammar
    {
        NSString *grammarContent = nil;
    
        //set engine type, clound or local
    
        [[IFlySpeechUtility getUtility] setParameter:@"asr" forKey:[IFlyResourceUtil ENGINE_START]];
    
        [_iflySpeechRecognizer setParameter:@"" forKey:[IFlySpeechConstant PARAMS]];
        [_iflySpeechRecognizer setParameter:@"utf-8" forKey:[IFlySpeechConstant TEXT_ENCODING]];
        [_iflySpeechRecognizer setParameter:self.engineType forKey:[IFlySpeechConstant ENGINE_TYPE]];
        [_iflySpeechRecognizer setParameter:self.grammarType forKey:[IFlyResourceUtil GRAMMARTYPE]];
        [_iflySpeechRecognizer setParameter:@"asr" forKey:[IFlySpeechConstant IFLY_DOMAIN]];
        
        if([self.engineType isEqualToString: [IFlySpeechConstant TYPE_LOCAL]])
        {//类型:本地识别
            grammarContent = [self readFile:_bnfFilePath];
    
            [_iflySpeechRecognizer setParameter:_grammBuildPath forKey:[IFlyResourceUtil GRM_BUILD_PATH]];
            [_iflySpeechRecognizer setParameter:_aitalkResourcePath forKey:[IFlyResourceUtil ASR_RES_PATH]];
            [_iflySpeechRecognizer setParameter: @"utf-8" forKey:@"result_encoding"];
            [_iflySpeechRecognizer setParameter:@"json" forKey:[IFlySpeechConstant RESULT_TYPE]];
        }
        else
        {//类型:在线识别
            grammarContent = [self readFile:_abnfFilePath];
        }
    
        //开始上传语法
        __weak typeof(self) weakSelf = self;
        [_iflySpeechRecognizer buildGrammarCompletionHandler:^(NSString * grammerID, IFlySpeechError *error){
    
            dispatch_async(dispatch_get_main_queue(), ^{
                
                if (![error errorCode]) {
                    NSLog(@"=====>上传成功 errorCode=%d",[error errorCode]);
                }
                else {
                    NSLog(@"=====>上传失败,错误码:%d",error.errorCode);
                }
                if ([weakSelf.engineType isEqualToString: [IFlySpeechConstant TYPE_LOCAL]]) {
                    weakSelf.localgrammerId = grammerID;
                    [weakSelf.iflySpeechRecognizer setParameter:weakSelf.localgrammerId  forKey:[IFlySpeechConstant LOCAL_GRAMMAR]];
                }
                else{
                    weakSelf.cloudGrammerid = grammerID;
                    [weakSelf.iflySpeechRecognizer setParameter:weakSelf.cloudGrammerid forKey:[IFlySpeechConstant CLOUD_GRAMMAR]];
                
                }
            });
    
        }grammarType:self.grammarType grammarContent:grammarContent];
    
    }
    
    - (void)configureVoiceWakeuperParam
    {
        
        [_iflyVoiceWakeuper setParameter:@"0:1450" forKey:[IFlySpeechConstant IVW_THRESHOLD]];
        NSString *ivwResourcePath = [IFlyResourceUtil generateResourcePath:_wakupEnginPath];
        [self.iflyVoiceWakeuper setParameter:ivwResourcePath forKey:@"ivw_res_path"];
        [_iflyVoiceWakeuper setParameter:self.engineType forKey:[IFlySpeechConstant ENGINE_TYPE]];
        [_iflyVoiceWakeuper setParameter:@"utf8" forKey:[IFlySpeechConstant RESULT_ENCODING]];
        [self.iflyVoiceWakeuper setParameter:@"2000" forKey:[IFlySpeechConstant VAD_EOS]];
        [self.iflyVoiceWakeuper setParameter:@"wakeup" forKey:[IFlySpeechConstant IVW_SST]];
        [self.iflyVoiceWakeuper setParameter:@"0" forKey:[IFlySpeechConstant KEEP_ALIVE]];
        [self.iflyVoiceWakeuper setParameter:@"json" forKey:[IFlySpeechConstant RESULT_TYPE]];
        [_iflyVoiceWakeuper setParameter:@"asr" forKey:[IFlySpeechConstant IFLY_DOMAIN]];
        
    }
    
    
    -(BOOL) createDirec:(NSString *) direcName
    {
        NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
        NSString *documentsDirectory = [paths objectAtIndex:0];
        
        NSFileManager *fileManager = [NSFileManager defaultManager];
        NSString *subDirectory = [documentsDirectory stringByAppendingPathComponent:direcName];
        
        BOOL ret = YES;
        if(![fileManager fileExistsAtPath:subDirectory])
        {
            ret = [fileManager createDirectoryAtPath:subDirectory withIntermediateDirectories:YES attributes:nil error:nil];
        }
        
        return ret;
    }
    
    /*
     read file 读取在线识别或本地识别的语法文件
     */
    -(NSString *)readFile:(NSString *)filePath
    {
        NSData *reader = [NSData dataWithContentsOfFile:filePath];
        return [[NSString alloc] initWithData:reader
                                     encoding:NSUTF8StringEncoding];
    }
    
    
    -(BOOL) isCommitted
    {
        if ([self.engineType isEqualToString:[IFlySpeechConstant TYPE_LOCAL]]) {
            if(_localgrammerId == nil || _localgrammerId.length ==0)
                return NO;
        }
        else{
            if (_cloudGrammerid == nil || _cloudGrammerid.length == 0) {
                return NO;
            }
        }
        return YES;
    }
    
    
    #pragma mark - IFlyVoiceWakeuperDelegate
    /**音量值改变*/
    - (void) onVolumeChanged: (int)volume
    {
    //    NSString * vol = [NSString stringWithFormat:@"%@:%d", NSLocalizedString(@"T_RecVol", nil),volume];
    }
    
    /**开始录音*/
    - (void) onBeginOfSpeech
    {
        NSLog(@"onBeginOfSpeech");
    }
    
    /**停止录音*/
    - (void) onEndOfSpeech
    {
        
        NSLog(@"onEndOfSpeech");
    }
    
    /**
    语音结束
     */
    - (void) onCompleted:(IFlySpeechError *) error
    {
        NSLog(@"error=%d",[error errorCode]);
    }
    
    /**
    唤醒成功后回调
     */
    -(void) onResult:(NSMutableDictionary *)resultDic
    {
        
        NSLog(@"我在,你说");
        self.isSpeechRecognizerState = YES;
        
    }
    /**
    识别成功后回调
     */
    - (void) onResults:(NSArray *) results isLast:(BOOL)isLast
    {
        NSMutableString *result = [[NSMutableString alloc] init];
        NSDictionary *dic = results[0];
        for (NSString *key in dic) {
            [result appendFormat:@"%@",key];
            NSLog(@"----%@",key);
            if([self.engineType isEqualToString:[IFlySpeechConstant TYPE_LOCAL]])
            {
                [[SpeechControlDataHelper shareInstance]analysisLocalSpeechControlData:result];
            }
            else
            {
                [[SpeechControlDataHelper shareInstance]analysisCloudSpeechControlData:result];
            }
        }
        
        self.isVoiceWakeuperState = NO;
    
    }
    @end
    
    

    AppDelegate.m 中初始一下讯飞SDK接口

    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
        // Override point for customization after application launch.
        [[SpeechControlManagers shareInstance]initIFly];//初始化讯飞SDK接口
        return YES;
    }
    

    调用 initVoiceControlObject 接口开启语音识别

    - (void)viewDidLoad {
        [super viewDidLoad];
        // Do any additional setup after loading the view.
        [[SpeechControlManagers shareInstance]initVoiceControlObject];//初始化语音控制相关对象
    }
    

    主要实现将语音唤醒+语音识别整合到一块并加入唤醒后语音回应功能,讯飞SDK中是提供oneshot模式就是唤醒+识别模式的,但oneshot模式是唤醒后是不中断录音的,导致就无法语音唤醒后播放语音回应,就需要自己重新将这两个功能整合到一块。👆解析部分代码的缺少其他类,可以直接注释掉,需要哪些类的话,下载demo

    最后凡是讯飞框架有错误码的问题,都用👇这个链接查一下,可以快速定位问题
    SDK&API 错误码查询 https://www.xfyun.cn/document/error-code?code=23108

    展开全文
  • 场景:进入程序后处于语音唤醒状态,当说到某个关键词的时候打开某个子界面(如:语音识别界面) 技术要点: 1、 // 设置唤醒一直保持,直到调用stopListening,传入0则完成一次唤醒后,会话立即结束(默认0) ...

    场景:进入程序后处于语音唤醒状态,当说到某个关键词的时候打开某个子界面(如:语音识别界面)

    技术要点:

    1、

    // 设置唤醒一直保持,直到调用stopListening,传入0则完成一次唤醒后,会话立即结束(默认0)
    mIvw.setParameter(SpeechConstant.KEEP_ALIVE, "1");

    2、添加资源文件appid.jet    很奇怪为什么这里demo里面不需要语法文件

    关键代码:

    /*********************************语音唤醒************************************************/
            // 语音唤醒对象
            private VoiceWakeuper mIvw;
            // 唤醒结果内容
            private String resultString;
            private void initAwake()
            {
                StringBuffer param = new StringBuffer();
                String resPath = ResourceUtil.generateResourcePath(MainActivity.this,RESOURCE_TYPE.assets, "ivw/" + getString(R.string.app_id) + ".jet");
                param.append(ResourceUtil.IVW_RES_PATH + "=" + resPath);
                param.append("," + ResourceUtil.ENGINE_START + "=" + SpeechConstant.ENG_IVW);
                boolean ret = SpeechUtility.getUtility().setParameter(
                        ResourceUtil.ENGINE_START, param.toString());
                if (!ret) {
                    Log.d(TAG, "启动本地引擎失败!");
                }
                // 初始化唤醒对象
                mIvw = VoiceWakeuper.createWakeuper(this, null);
                
                //非空判断,防止因空指针使程序崩溃
                mIvw = VoiceWakeuper.getWakeuper();
                if(mIvw != null) {
    //                resultString = "";
    //                textView.setText(resultString);
                    // 清空参数
                    mIvw.setParameter(SpeechConstant.PARAMS, null);
                    // 唤醒门限值,根据资源携带的唤醒词个数按照“id:门限;id:门限”的格式传入
                    mIvw.setParameter(SpeechConstant.IVW_THRESHOLD, "0:"+ 0);  //20为门阀值
                    // 设置唤醒模式
                    mIvw.setParameter(SpeechConstant.IVW_SST, "wakeup");
                    // 设置唤醒一直保持,直到调用stopListening,传入0则完成一次唤醒后,会话立即结束(默认0)  
                    mIvw.setParameter(SpeechConstant.KEEP_ALIVE, "1");
    //                mIvw.startListening(mWakeuperListener); //onresume中操作
                } else {
                    showTip("唤醒未初始化");
                }
            }
            private WakeuperListener mWakeuperListener = new WakeuperListener() {
    
                @Override
                public void onResult(WakeuperResult result) {
                    try {
                        String text = result.getResultString();
                        resultString = text;
                        JSONObject object;
                        object = new JSONObject(text);
                        String awakeId = object.optString("id");
                        if(!StringUtil.isNullorEmpty(awakeId))
                        {
                            //打开语音识别界面
                            boolean needShowVoiceTips = (Boolean) SPUtils.get(MainActivity.this,getResources().getString(R.string.needShowUseVoiceTips), true);
                            Log.v(TAG, "IsShowVoiceTips="+needShowVoiceTips);
                            mIvw = VoiceWakeuper.getWakeuper();
                            if (mIvw != null) {
                                mIvw.stopListening();
                                mIvw = null;
                            } else {
                                showTip("唤醒未初始化");
                            }
                            if(!needShowVoiceTips)
                            {
                                
                                if(voicePop==null||!voicePop.isShowing())
                                {
                                    voicePop = new VoiceInputPopView(MainActivity.this);
                                    //显示窗口
                                    voicePop.showAtLocation(iv_setting, Gravity.CENTER, 0, 0); //设置layout在PopupWindow中显示的位置
                                }
                            }
                            else
                            {
                                voidTipsPop= new UseVoiceTipsPop(MainActivity.this);
                                //显示窗口
                                voidTipsPop.showAtLocation(iv_setting, Gravity.CENTER, 0, 0); //设置layout在PopupWindow中显示的位置
                            }
                            
                        }
                    } catch (JSONException e) {
                        resultString = "结果解析出错";
                        e.printStackTrace();
                    }
                    catch (Exception e) {
                        e.printStackTrace();
                    }
    //                Toast.makeText(MainActivity.this, "结果"+resultString, Toast.LENGTH_SHORT).show();
                }
    
                @Override
                public void onError(SpeechError error) {
                    showTip(error.getPlainDescription(true));
                }
    
                @Override
                public void onBeginOfSpeech() {
                    showTip("尝试说【讯飞语点】唤醒语音识别界面");
                }
    
                @Override
                public void onEvent(int eventType, int isLast, int arg2, Bundle obj) {
    
                }
            };

     

    转载于:https://www.cnblogs.com/feijian/p/4519927.html

    展开全文
  • 唤醒词: 小虎贝贝 | 小贝小贝 | 你好小贝 音量调节: 增大音量 | 音量增大 减小音量 | 音量调小 控制空调相关的命令字: 打开空调 关闭空调 自动模式 制冷模式 制热模式 升高温度 | 升高一度 降低温度 | 降低一度 ...

    唤醒词:
    小虎贝贝 | 小贝小贝 | 你好小贝

    音量调节:
    增大音量 | 音量增大
    减小音量 | 音量调小

    控制空调相关的命令字:
    打开空调
    关闭空调
    自动模式
    制冷模式
    制热模式
    升高温度 | 升高一度
    降低温度 | 降低一度
    十六度
    十七度
    十八度
    十九度
    二十度
    二十一度
    二十二度
    二十三度
    二十四度
    二十五度
    二十六度
    二十七度
    二十八度
    二十九度
    三十度
    开始匹配
    打开扫风
    关闭扫风

    控制插座相关的命令字:
    打开第一路 | 打开开关
    打开第二路
    打开第三路
    打开第四路
    关闭第一路 | 关闭开关
    关闭第二路
    关闭第三路
    关闭第四路

    再上几张中控的内部结构图
    中控内部结构
    中控内部结构

    接下来会上传一些实测效果

    展开全文
  • JLing JLing是一个可以工作在Linux的中文语音对话机器人 (csdn:... ... 需要使用JLing的离线语音唤醒功能,就需要编译出适合自己用的_snowboydetect.so 版本:Ubuntu18.03 1、打开文件夹Su...
  • 在之前博客(Python开发之路(4)— 使用 snowboy 做语音唤醒功能)的基础上,对代码进行修改。 因为在打开声卡的过程中需要消耗比较多的时间,所以我们在打开声卡后,打印一行提示符, 因为我们之后要使用声卡播放...
  • 在之前博客(树莓派学习之旅(3)— 使用 snowboy 做语音唤醒功能)的基础上,对代码进行修改。 因为在打开声卡的过程中需要消耗比较多的时间,所以我们在打开声卡后,打印一行提示符, 因为我们之后要使用声卡播放...
  • 12 月 5 日,阿里巴巴、蚂蚁金服和申通地铁集团联合推出新一代售票机,可以让乘客用语音交互的形式买票,具有指定站名或票价购票、目的地模糊搜索购票等功能。 搭地铁,有几个步骤? 你可能需要掏
  • 语音机器人

    2016-08-04 11:08:15
    智能机器人,集成讯飞...通过“讯飞语点”“讯飞语音唤醒。 比如: 你:讯飞语点。 机器人:我在。 你:打开天气(或者打开闹钟, 花千骨,开灯,关灯,给...打电话, 唱首歌吧......) 更多功能等你发现......。
  • siri语音功能测试点

    2020-12-17 23:49:37
    是否打开siri唤醒 都支持什么语言
  • TensorFlow Lite Micro语音模型可检测唤醒词并打开不同颜色的LED灯以模拟交通信号灯。
  • 视频演示地址: ...当语音唤醒LD3320模块后用户可以说的指令 开窗:42BYGH34电机正转 关窗:42BYGH34电机反转 打开防风装置:DM860H电机正转 关闭防风装置:DM860H电机反转 当雨滴模块检测到有水的时
  • 其中之一是“打开窗口”漏洞,例如,恶意人员在打开的窗户旁边行走并大喊:“嘿,打开门!” 并获得进入房屋的权限。 研究人员还为Alexa和Google识别了数千个假阳性唤醒词 ,这是注入恶意命令的潜在攻击媒介。 ...
  • 要在浏览器中运行此程序,您需要具有Alexa语音服务应用程序的客户端ID和产品ID。 如果您没有,请转到并创建一个。 在那里,还请确保您应用的安全配置文件包含正确的“允许的来源”和“允许的返回URL”。 完成后,...
  • 这包括语音识别、唤醒词和自然语言理解,以及使用 Spokestack 语音将文本合成为语音。 要求 React Native: 0.60.0+ Android: Android SDK 21+ iOS: iOS 13+ 安装使用 npm: npm install --save react-native-...
  • 一直在留意关于离线式语音识别的新方案,一次偶然的机会发现esp...可是死活只能识别“HI乐鑫”的唤醒词,默认添加的如“打开空调”等命令词怎么都不能识别。 一开始一直认为是配置问题,make menuconfig各种操作,因...
  • 前一段时间做了一个架设在微信上的打车软件,司机端是在浏览器中打开,网页上的导航无法实时定位与语音播报,后因甲方强制要求,必须打开本地谷歌地图,并传入用户的起点终点,于是翻译了相关博客,完美解决,亲测...
  • 若需要修改词条,通过USB接口接入电脑,打开setup.ini配置文件,修改词条即可,前面5条不 要轻易动,最好从第6条开始修改相应的识别句子。此外,CH1~CH4四路控制接口的高低电平可 以自行更改,这样,识别成功则取反...
  • 测试部反馈,红外模式下,按power键进入假待机,按红外语音键会唤醒。 背景交代:红外语言键是我们自定义的按键,键值225。在红外模式下按会弹提示框“没连蓝牙,请连蓝牙使用语音键 【问题结论】 不是问题,这是...
  • #HiRemoteMeetCortana.RemoteCortana是使用用户界面Cortana打开灯泡警报的遥控器。 作为Windows 10家族的通用Windows平台应用程序构建。 Cortana是由Microsoft创建的智能个人助理,它是一种语音控件。 #...
  • 特别鸣谢:我爱林尼玛及其博文“[技术]分享一个比较无聊的,Win10用你好小娜唤醒语音关机”,网址:http://bbs.pcbeta.com/viewthread-1632891-1-1.html 以上博文给人以灵感,基于此,我让小娜实现了可以如愿打开...
  • Siri的测试用例

    2020-12-18 07:22:18
    是否打开siri唤醒 都支持什么语种 是否有唤醒siri无反应的情况 在无网络情况下,是否能使用siri 唤醒siri需要多久时间 唤醒siri是否马上能做出反应 是否支持侧边按钮唤醒siri 手机锁定时是否支持唤醒siri siri是否...
  • 快来在win10上提前体验小爱同学吧!

    千次阅读 2021-02-27 13:54:03
    小爱在红米笔记本上支持快捷键和语音唤醒,其它电脑暂不支持 小爱较小娜功能更为强大 链接 度盘链接: 链接:https://pan.baidu.com/s/1xcslaCB7QH5_h2BZ0_R4pA 提取码:0i2r (文件>100M,传不了蓝奏云)
  • Qt+JAVA混合开发App

    千次阅读 2019-02-20 20:17:58
    2.集成【百度】语音识别/语音合成/语音唤醒; 3.集成【腾讯】X5浏览器/X5打开doc/ppt/excel等文件; 4.集成【微信】分享链接/图片/MP3/MP4/小程序到朋友圈/朋友/收藏;集成微信登陆/微信支付; 5.集成二维码...
  • 集语音识别、语音合成、语义理解、人脸识别、声纹识别、语音唤醒、语音评测、语言云于一体的讯飞智能硬件整体解决方案再添利器,或将全面催生智能硬件新品开发浪潮及应用场景的创新空间,行业新一轮风口已经打开。...
  • 然而有的时候,我们可能并不是很方便使用语音唤醒手机,比如上班时或者在某个特殊场合。 如此一来,对于手机的常用功能,或者紧急要用的功能,就需要一个快捷的渠道来达到了。这也就是所谓的走捷径。 它可以快速满足...

空空如也

空空如也

1 2 3
收藏数 52
精华内容 20
关键字:

打开语音唤醒