【UE5/UE4】超详细教程接入科大讯飞语音唤醒SDK并初始持久监听(10102错误码解决)
创始人
2024-11-16 07:33:58
0

【UE5/UE4】超详细教程接入科大讯飞语音唤醒SDK并初始持久监听(10102错误码解决)

先导

Windows环境下
**UE版本为UE4.27及以下
你需要具备一定的C++基础,或全程一对一对照我的代码编写你的代码
使用Offline Voice Recognition插件作为录音插件(仅做录音插件使用)
基于https://github.com/zhangmei126/XunFei二次开发
语音识别部分参考CSDNUE4如何接入科大讯飞的语音识别
在此基础上增加了语音唤醒功能,实际上语音唤醒与上述文章中是两个模块
由于讯飞插件的使用需要调用MSPLogin,也就是需要先注册
在这里插入图片描述
其插件中的SpeechInit()方法已经为我们注册好了,如果可以自己写注册的话,后述本文语音唤醒部分是不分引擎版本的

语音唤醒环境配置

参考UE4如何接入科大讯飞的语音识别接入科大讯飞sdk以及使用Offline Voice Recognition插件了后,在plugins中确保他们都是开启的状态
在这里插入图片描述
在这里插入图片描述
你要确保你的SDK下载的是Windows版本以及一下SDK文件包
在这里插入图片描述
你要确保你的SDK下载后正确导入了且appid已经拥有了正确的配置
在这里插入图片描述
你要确保你SDK下载后将Windows_awaken_exp1227_iat1226_af12f15d\bin\msc\res\ivw\wakeupresource.jet放置到了你的c盘根目录下
在这里插入图片描述
to在这里插入图片描述
如果你是为了10102错误码来此文章:
此处是讯飞的坑,讯飞的wakeupresource.jet的路径必须是绝对路径
c++中也就必须要使用转义符"\\"即
const char* params = "ivw_threshold=0:5, ivw_res_path =fo|c:\\wakeupresource.jet";
至此10102解决了,就这么简单,但是很坑
打开VisualStudio

  1. 打开讯飞插件文件夹
    在这里插入图片描述
  2. 在SpeechActor.cpp中引入qivw.h
    在这里插入图片描述
    qivw.h语音唤醒具备以下方法
    在这里插入图片描述
  3. 在SpeechActor.h中
#pragma once  #include "SpeechTask.h"  #include "CoreMinimal.h" #include "GameFramework/Actor.h" #include "SpeechActor.generated.h"  UCLASS() class XUNFEI_API ASpeechActor : public AActor { 	GENERATED_BODY() private: 	FString Result; 	DECLARE_DYNAMIC_MULTICAST_DELEGATE(FWakeUpBufferDelegate); public: 	// Sets default values for this actor's properties 	ASpeechActor();  protected: 	// Called when the game starts or when spawned 	virtual void BeginPlay() override;  public: 	 	// Called every frame 	virtual void Tick(float DeltaTime) override;  	UFUNCTION(BlueprintCallable, Category = "XunFei", meta = (DisplayName = "SpeechInit", Keywords = "Speech Recognition Initialization")) 	void SpeechInit();  	UFUNCTION(BlueprintCallable, Category = "XunFei", meta = (DisplayName = "SpeechOpen", Keywords = "Speech Recognition Open")) 	void SpeechOpen();  	UFUNCTION(BlueprintCallable, Category = "XunFei", meta = (DisplayName = "SpeechStop", Keywords = "Speech Recognition Stop")) 	void SpeechStop();  	UFUNCTION(BlueprintCallable, Category = "XunFei", meta = (DisplayName = "SpeechQuit", Keywords = "Speech Recognition Quit")) 	void SpeechQuit(); 	 	UFUNCTION(BlueprintCallable, Category = "XunFei", meta = (DisplayName = "SpeechResult", Keywords = "Speech Recognition GetResult")) 	FString SpeechResult(); 	UFUNCTION(BlueprintCallable, Category = "XunFei", meta = (DisplayName = "WakeUpStart", Keywords = "Speech Recognition GetResult")) 	FString WakeUpStart(); 	UFUNCTION(BlueprintCallable, Category = "XunFei", meta = (DisplayName = "WakeUpEnd", Keywords = "Speech Recognition GetResult")) 	bool WakeUpEnd(FString SessionID); 	UFUNCTION(BlueprintCallable, Category = "XunFei", meta = (DisplayName = "WakeUpBuffer", Keywords = "Speech Recognition GetResult")) 	bool WakeUpBuffer(TArray MyArray, FString SessionID);  	//这是一个回调函数 	UPROPERTY(BlueprintAssignable) 	 FWakeUpBufferDelegate OnWakeUpBuffer; 	 }; 
  1. 在SpeechActor.cpp中
// Fill out your copyright notice in the Description page of Project Settings. #pragma once  #include "SpeechActor.h" #include "XunFei.h" #include "Dom/JsonObject.h" #include "Serialization/JsonReader.h" #include "Serialization/JsonSerializer.h" #include   // Sets default values ASpeechActor::ASpeechActor() : 	Result{} {  	// Set this actor to call Tick() every frame.  You can turn this off to improve performance if you don't need it. 	PrimaryActorTick.bCanEverTick = false; }    // Called when the game starts or when spawned void ASpeechActor::BeginPlay() { 	Super::BeginPlay(); }  // Called every frame void ASpeechActor::Tick(float DeltaTime) { 	Super::Tick(DeltaTime);  }  void ASpeechActor::SpeechInit() { 	FAutoDeleteAsyncTask* SpeechTask = new FAutoDeleteAsyncTask();  	if (SpeechTask) 	{ 		SpeechTask->StartBackgroundTask(); 	} 	else 	{ 		UE_LOG(XunFeiLog, Error, TEXT("XunFei task object could not be create !")); 		return; 	}  	UE_LOG(XunFeiLog, Log, TEXT("XunFei Task Stopped !")); 	return; }  void ASpeechActor::SpeechOpen() { 	xunfeispeech->SetStart(); 	return; }  void ASpeechActor::SpeechStop() { 	xunfeispeech->SetStop(); 	return; }  void ASpeechActor::SpeechQuit() { 	xunfeispeech->SetQuit(); 	Sleep(300); 	return; }  FString ASpeechActor::SpeechResult() {	 	Result = FString(UTF8_TO_TCHAR(xunfeispeech->get_result()));  	FString LajiString("{\"sn\":2,\"ls\":true,\"bg\":0,\"ed\":0,\"ws\":[{\"bg\":0,\"cw\":[{\"sc\":0.00,\"w\":\"\"}]}]}");  	int32 LajiIndex = Result.Find(*LajiString);  	if (LajiIndex != -1) 	{ 		Result.RemoveFromEnd(LajiString); 	}  	TSharedPtr JsonObject;  	TSharedRef< TJsonReader > Reader = TJsonReaderFactory::Create(Result);  	if (FJsonSerializer::Deserialize(Reader, JsonObject)) 	{ 		Result.Reset(); 		TArray< TSharedPtr > TempArray = JsonObject->GetArrayField("ws"); 		for (auto rs : TempArray) 		{ 			Result.Append((rs->AsObject()->GetArrayField("cw"))[0]->AsObject()->GetStringField("w")); 		} 	}  	UE_LOG(XunFeiLog, Log, TEXT("%s"), *Result); 	 	return Result; }  // 在 cb_ivw_msg_proc 静态函数中进行事件触发 int cb_ivw_msg_proc(const char* sessionID1, int msg, int param1, int param2, const void* info, void* userData) { 	if (MSP_IVW_MSG_ERROR == msg) //唤醒出错消息 	{ 		UE_LOG(LogTemp, Warning, TEXT("不在")); 		return 0; 	} 	else if (MSP_IVW_MSG_WAKEUP == msg) //唤醒成功消息 	{ 		UE_LOG(LogTemp, Warning, TEXT("imhere")); 		if (userData) { 			ASpeechActor* MYThis = reinterpret_cast(userData); 			if (MYThis) { 				UE_LOG(LogTemp, Warning, TEXT("diaoyongle")); 				MYThis->OnWakeUpBuffer.Broadcast(); 				return 1; 			} 		} 	} 	return 0; } FString ASpeechActor::WakeUpStart() { 	int err_code = MSP_SUCCESS; 	const char* params = "ivw_threshold=0:5, ivw_res_path =fo|c:\\wakeupresource.jet"; 	int ret = 0; 	const char* sessionID = QIVWSessionBegin(NULL, params, &ret); 	err_code = QIVWRegisterNotify(sessionID,cb_ivw_msg_proc, this); 	if (err_code != MSP_SUCCESS) 	{ 		UE_LOG(LogTemp, Warning, TEXT("QIVWRegisterNotify failed, error code is: %d"), ret); 	} 	else { 		UE_LOG(LogTemp, Warning, TEXT("QIVWRegisterNotify success, error code is: %d"), ret); 	} 	 	if (MSP_SUCCESS != ret) 	{ 		 		 		UE_LOG(LogTemp, Warning, TEXT("QIVWSessionBegin failed, error code is: %d"),ret); 	} 	return FString(sessionID); 	UE_LOG(LogTemp, Warning, TEXT("QIVWSessionBegin is working")); 	 	 }  bool ASpeechActor::WakeUpEnd(FString SessionID) { 	 		int ret = QIVWSessionEnd(TCHAR_TO_ANSI(*SessionID) , "normal end"); 	if (MSP_SUCCESS != ret) 	{ 		UE_LOG(LogTemp, Warning, TEXT("QIVWSessionEnd failed, error code is: %d"), ret); 		return false; 	} 	UE_LOG(LogTemp, Warning, TEXT("QIVWSessioniSEnd")); 	return true; }   bool ASpeechActor::WakeUpBuffer(TArray BitArray, FString SessionID) { 	int ret = 0;  	if (BitArray.Num() == 0) 	{ 		 		return false; 	} 	else 	{ 		int audio_len = BitArray.Num(); 		int audio_status =2;  // 设置音频状态,这里假设为MSP_AUDIO_SAMPLE_LAST  		ret = QIVWAudioWrite(TCHAR_TO_ANSI(*SessionID), BitArray.GetData(), audio_len, audio_status); 		if (MSP_SUCCESS != ret) 		{ 				printf("QIVWAudioWrite failed, error code is: %d", ret); 				return false; 		} 		return true; 	} }  

至此准备工作完成
打开我们的蓝图

  1. 在确保你的Offline Voice Recognition插件打开的前提下添加vosk插件
    在这里插入图片描述

  2. 考虑本文的应用环境需要他初始化时就持续监听
    故而让其开始运行时就开启录音(语音唤醒需要录音文件才能监听)

在这里插入图片描述

  1. 接下里我们需要注册讯飞,并且在运行结束释放讯飞注册
    在这里插入图片描述
    4.讯飞注册后等待两秒注册我们的wakeup语音唤醒
    在这里插入图片描述
  2. 绑定一个唤醒事件

在这里插入图片描述
3. 在设置一个1.1秒的定时器
在这里插入图片描述
4. 定时器内部(正在语音识别默认值为false)
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
5. 语音唤醒的自定义事件(唤醒五秒钟后恢复继续监听)
在这里插入图片描述
蓝图文件以绑定
author:Dacimal
定制化开发联系:19815779273(不闲聊)

相关内容

热门资讯

我来教你/游戏推荐牛牛房卡出售... 复仇者联盟是一款非常受欢迎的棋牌游戏,咨询房/卡添加微信:【3329006910】或QQ:33290...
微信炸金花链接怎么买房卡/牛牛... 炸金花是一款非常受欢迎的棋牌游戏,咨询房/卡添加微信:8488009许多玩家在游戏中会购买房卡来享受...
科技实测!牛牛房卡怎么购买先锋... 科技实测!牛牛房卡怎么购买先锋大厅/新道游/正规房卡链接在哪购买Sa9Ix苹果iPhone 17手机...
推荐一款!金花房卡是正规的青鸟... 您好!微信青鸟大厅大厅链接获取房卡可以通过以下几种方式购买: 1.微信渠道:(青鸟大厅)大厅介绍:...
正规平台有哪些,斗牛房间怎么创... 今 日消息,海贝之城房卡添加微信33549083 苹果今日发布了 iOS 16.1 正式版更新,简单...
安卓系统不升级的坏处,安卓系统... 亲爱的手机用户们,你是不是也遇到了这样的烦恼:安卓系统的更新通知总是跳出来,但你却总是犹豫不决,担心...
正规平台有哪些,金花房卡专卖店... 正规平台有哪些,金花房卡专卖店乐游联盟/正规房卡平台有哪些乐游联盟是一款非常受欢迎的游戏,咨询房/卡...
微信群上炸金花房间链接怎么开/... 炸金花是一款非常受欢迎的棋牌游戏,咨询房/卡添加微信:33903369许多玩家在游戏中会购买房卡来享...
科技实测!游戏微信牛牛房卡龙马... 微信游戏中心:龙马大厅房卡在哪里买打开微信,添加客服微信【88355042】,进入游戏中心或相关小程...
重大通报,牛牛房卡代理天龙大厅... 重大通报,牛牛房卡代理天龙大厅/房卡在哪里购买Sa9Ix苹果iPhone 17手机即将进入量产阶段。...
微信金花房卡链接使用方法/微信... 牛牛是一款非常受欢迎的棋牌游戏,咨询房/卡添加微信:15984933许多玩家在游戏中会购买房卡来享受...
微信群炸金花房间怎么开/神牛大... 炸金花是一款非常受欢迎的棋牌游戏,咨询房/卡添加微信:55051770许多玩家在游戏中会购买房卡来享...
我来教你/金花房卡专卖店豌豆互... 今 日消息,豌豆互娱房卡添加微信33549083 苹果今日发布了 iOS 16.1 正式版更新,简单...
玩家攻略,牛牛充值房卡九游联盟... 九游联盟房卡更多详情添加微:33549083、 2、在商城页面中选择房卡选项。 3、根...
IA解析/游戏推荐牛牛房卡出售... IA解析/游戏推荐牛牛房卡出售新全游/飞鹰互娱/微信链接房卡批发价新全游/飞鹰互娱是一款非常受欢迎的...
微信链接炸金花房卡怎么买/新海... 炸金花是一款非常受欢迎的棋牌游戏,咨询房/卡添加微信:8488009许多玩家在游戏中会购买房卡来享受...
在哪里买炸金花房卡便宜又好玩/... 金花是一款非常受欢迎的棋牌游戏,咨询房/卡添加微信:160470940许多玩家在游戏中会购买房卡来享...
科技实测!金花房卡是正规的九哥... 微信游戏中心:九哥联盟房卡在哪里买打开微信,添加客服微信【88355042】,进入游戏中心或相关小程...
推荐一款!金花微信链接市场价格... 推荐一款!金花微信链接市场价格表乐乐大厅/微信链接房卡充值购买Sa9Ix苹果iPhone 17手机即...
推荐一款!金花房间怎么创建新超... 您好!微信新超圣/樱花大厅大厅链接获取房卡可以通过以下几种方式购买: 1.微信渠道:(新超圣/樱花...