一、来认识一下 Rokid:那个让设备 “秒懂你” 的 AR 交互行家
提起 AR(加强现实)这个圈子,必定要提及 Rokid 这家公司,它一直致力于研究“自然人机交互”。设想一下,你佩戴着 Rokid AR 眼镜,随便说一句“若琪,导航去咖啡厅”,设备就会马上为你做好一切准备,这靠的就是 Rokid 自家研发的语音唤醒系统。
在国内,可以全面掌握语音交互技术的公司并不多,Rokid 属于其中之一,它给自家诸如 Station 系列,Rokid Max 眼镜之类的宝贝设备装上了灵敏的“耳朵”,并且还慷慨地经由开放平台(ar.rokid.com)把这套技术共享给所有的开发者,使得大家能够轻而易举地开发出“一喊即应”的智能设备,归根结底,Rokid 的语音唤醒技术就在于高唤醒率,低误触率,超省电这三件宝物之上,也正因为如此,它才成为 AR 设备达成“无感交互”的重要一步。
@[toc]
二、技术探秘:三层架构如何让设备“听得清、听得懂、还省电”?
想象一下,你正在热气腾腾的火锅店里同朋友聊天,想要唤醒自己的AR眼镜,这个过程中,设备内部需执行三项任务:“去除杂音”“识别唤醒词”“省电聆听”,这正好与Rokid语音唤醒技术的三层架构相对应,下面,我们就用通俗易懂的语言,并融入一些技术要点,来剖析其中的原理。
1. 声学前端处理:先让麦克风“盯准你”的声音(硬件 + 算法双管齐下)
核心技术架构图
① 波束成形(Beamforming):让所有麦克风都“朝向你”
设备并非仅仅配备单个麦克风,其存在诸多麦克风,譬如 Station Pro即包含四个合成的麦克风阵列,这些麦克风可智能识别声音抵达各个麦克风的先后次序,并携手创建起“定向声波束”,此声波束犹如一道无形聚光灯,专门提升面向你这一侧的声音,而将周围杂乱无章的噪音抑制。
-
打个比方:这就像一群摄影师,镜头全都对准站在C位的你,周围的路人甲乙丙丁自动就被虚化处理了。
-
技术上怎么玩:开发者可以通过 SDK 来设定这个“聚光灯”照向哪、照多宽。比如说,如果用户习惯用右手拿设备,可以将指向性优化为右前方 45°(设备/SDK将自动处理波束与指向性,应用层无需调用特定 API)。
② 噪声抑制(ANS):给你的声音“洗个澡”
设备里内置了一个深度神经网络模型,它会实时分析周围的背景噪音(比如火锅的咕嘟声、敲键盘的噼啪声),然后生成一种“反向噪声波”把这些干扰给抵消掉。
-
数据说话:在高达 75dB 的噪音环境(差不多就是地铁里)中,唤醒词的识别率照样能达到 98%,比一般的方案高出了 15%。
-
设备侧内置降噪与波束成形等声学前端,会根据环境自动适配,无需在 Unity 代码中显式设置降噪等级。
2. 唤醒词检测:一个轻巧模型如何“听懂千变万化的你”?
算法流程图
① 动态适应你的发音习惯
这里用到了一个叫 动态时间规整(DTW) 的技术,它能自动对齐不同语速和口音。简单说,不管你是把“若琪”拖长了音喊成“ruò——qí”,还是很快地念成“ruǒqi”,模型都能认出来是同一个意思。
- 防误触训练:为了防止你无意中说出“罗琦”或“诺奇”这样的词就意外唤醒设备,工程师们用了超过 20 万个干扰词来“折磨”模型,最终让设备每天的误触次数少于 0.3 次(要知道,行业平均可是每天 1 次)。
② 模型要够“轻”
Rokid 用的是一套 CNN-LSTM 混合模型,整个模型大小还不到 5MB。这意味着它根本不需要联网,直接在设备上就能跑起来,反应超快。而且不管你是用 Unity 还是原生 Android 开发,都能很方便地把它集成到你的应用里。
3. 低功耗引擎:让设备“待机一整天也不慌”
两级唤醒架构(先“粗听”再“细听”)
节能的秘密武器
-
硬件级配合:唤醒引擎和芯片(SoC)是深度绑定的,它会巧妙地利用 DSP(数字信号处理器)这个“小助手”来专门处理音频,让主 CPU 的占用率不到 5%,直接把续航时间延长了 20%。
-
智能休眠大法:设备还会通过环境光传感器(比如晚上光线暗了就自动降低采样率)和人体检测(比如你半天没动弹,它就减少检测频率)来偷懒,进一步省电。
三、上手实战:3 步给你的 App 安上“顺风耳”(以 Unity 为例)
1. 搭好开发环境(手把手教你)
步骤 1:下载并安装 Rokid UXR SDK
-
直奔 Rokid 开放平台 SDK 下载页,把 SDK 抱回家。
-
解压下载好的
.unitypackage文件,然后打开你的 Unity 项目(新手建议新建一个空项目,或者用 AR 模板项目)。 -
在 Unity 菜单栏找到 “Assets > Import Package > Custom Package”,选中刚刚解压的文件,点一下就导入成功了。
步骤 2:配置一下项目的基础设置
-
给麦克风开权限:
-
在 Project Settings > Player > Android(或者 iOS)里,找到 “Microphone Usage Description”,填一句好听的申请理由(比如“需要麦克风权限才能听到您的呼唤哦”)。
-
如果你是做 Android 开发,要确保
AndroidManifest.xml文件里有这行代码:
-
-
设置 XR 插件:
在 Project Settings > XR Plug-in Management 里面,记得勾选上 “Rokid UXR” 插件,这样才能保证设备连接和画面渲染不出问题。
2. 核心代码敲起来(注释管够,错误帮你想到)
步骤 1:写一个唤醒引擎的初始化脚本
using UnityEngine;
public class VoiceWakeupController : MonoBehaviour
{
[Header("唤醒配置(示意)")]
[Range(0f, 1f)]
public float wakeupThreshold = 0.7f;
private AudioClip microphoneClip;
private string selectedMicrophoneDevice;
private bool isRecording;
private void Awake()
{
// 申请麦克风权限
if (!Application.HasUserAuthorization(UserAuthorization.Microphone))
{
Application.RequestUserAuthorization(UserAuthorization.Microphone);
}
// 选择设备并采集音频
if (Microphone.devices != null && Microphone.devices.Length > 0)
{
selectedMicrophoneDevice = Microphone.devices[0];
StartMicrophoneCapture();
}
else
{
Debug.LogError("未检测到可用的麦克风设备。");
enabled = false;
return;
}
}
private void StartMicrophoneCapture()
{
int sampleRate = 16000;
int lengthSec = 10;
microphoneClip = Microphone.Start(selectedMicrophoneDevice, true, lengthSec, sampleRate);
isRecording = true;
Debug.Log($"开始采集音频:{selectedMicrophoneDevice}, {sampleRate}Hz");
// 将音频送入设备/系统提供的唤醒或识别服务(占位,具体请使用官方 SDK 实际 API)
// SendAudioToWakeupService(microphoneClip, wakeupThreshold);
}
private void OnDestroy()
{
if (isRecording)
{
Microphone.End(selectedMicrophoneDevice);
isRecording = false;
}
}
}
步骤 2:在 Unity 场景里用上这个脚本
-
新建一个空物体(GameObject),给它取个好记的名字,比如 “VoiceWakeupManager”。
-
把刚才写的
VoiceWakeupController脚本拖到这个物体上。你可以在右边的 Inspector 面板里调整你自己的参数(例如是否启用采样等)。降噪等声学前端由设备侧自动处理,无需在 Unity 中设置。 -
如果你有唤醒后要显示的 UI 界面,把它拖到脚本的
UIInteractionPanel引用上。
四、进阶玩法:搞定真实场景里的各种“唤醒难题”
1. 方言/口音听不懂?自己教它新唤醒词(完整流程)
步骤 1:准备好你的“教材”
-
录音要求:
-
格式:必须是 16kHz 单声道的 WAV 文件,PCM 编码。
-
时长:1 到 2 秒就够了,每个唤醒词至少录 5 遍(强烈建议录 10 遍以上,语速、音调变着来)。
-
命名要规范:
唤醒词_方言_序号.wav(比如ruoqi_guangdong_01.wav)。
-
-
给数据加点“料”(可选):
Rokid 提供了一个叫
AudioAugmentTool的小工具(在若琪学院工具包里),可以给你的录音加上各种噪音,让训练出来的模型更抗折腾。
步骤 2:调用 SDK 的训练接口
using System.Collections.Generic;
public class CustomWakewordTrainer : MonoBehaviour {
[SerializeField] private string customWakeword = "小琪";
[SerializeField] private List<string> samplePaths = new List<string>(); // 把你的录音文件路径放这里
public void StartTraining() {
// 检查一下“教材”够不够
if (samplePaths.Count < 5) {
Debug.LogWarning("样本太少了,至少得准备5个才行!");
return;
}
// 开始训练(这是个异步操作,不会卡住你的程序)
// 使用官方 SDK 的自定义唤醒词训练接口
}
private void OnTrainingComplete(bool success, string message) {
if (success) {
Debug.Log($"太棒了!自定义唤醒词“{customWakeword}”训练成功!");
// 训练好了,就可以让设备用这个新词了
// 通过官方 SDK 设置当前唤醒词(以公开接口为准)
} else {
Debug.LogError($"训练失败了,原因是:{message}");
}
}
}
步骤 3:切换新唤醒词并测试
// 占位示例:唤醒词切换与配置以官方 SDK 实际 API 为准。
2. 功耗再优化:多传感器联动的智能省电策略
策略 1:天黑了,就让它“夜间模式”
策略 2:检测到你“静止”了,它就偷偷懒(代码实现)
using UnityEngine;
public class SimplePowerSaving : MonoBehaviour
{
public float inactiveThresholdSeconds = 30f;
private float inactiveTimer;
private Vector3 lastCameraPosition;
private void Update()
{
bool isActive = Input.anyKey || HasMoved();
if (!isActive)
{
inactiveTimer += Time.deltaTime;
if (inactiveTimer >= inactiveThresholdSeconds)
{
EnableLowPowerMode();
}
}
else
{
inactiveTimer = 0f;
DisableLowPowerMode();
}
}
private bool HasMoved()
{
var cam = Camera.main;
if (cam == null) return false;
var pos = cam.transform.position;
bool moved = (pos - lastCameraPosition).sqrMagnitude > 0.0001f;
lastCameraPosition = pos;
return moved;
}
private void EnableLowPowerMode()
{
Application.targetFrameRate = 30;
Debug.Log("进入低功耗模式(示例)。");
}
private void DisableLowPowerMode()
{
Application.targetFrameRate = -1;
Debug.Log("退出低功耗模式(示例)。");
}
}
3. 噪音太大怎么办?波束成形 + 强力降噪组合拳
操作步骤
-
手动指定波束方向(比如用户习惯右手拿设备,就把波束指向右前方 45°):
// 算一下右前方45°的方向向量 Vector3 direction = new Vector3(Mathf.Cos(Mathf.Deg2Rad * 45), 0, Mathf.Sin(Mathf.Deg2Rad * 45)); // 波束方向与指向性由设备/SDK处理,应用层无需直接设置。 -
开启深度降噪和动态增益:
// 占位示例:降噪等级、动态增益等为设备侧能力,Unity 代码无需/不可直接设置。 // 请使用官方 SDK 提供的接口进行配置(如有) ```
效果好不好,拉出来比比
4. 调试排错:几个必备的工具和流程
工具 1:音频可视化调试面板
private bool showWaveform;
void OnGUI()
{
if (GUI.Button(new Rect(10, 10, 150, 30), showWaveform ? "隐藏音频波形" : "显示音频波形"))
{
showWaveform = !showWaveform;
}
// 根据 showWaveform 状态绘制你自己的波形可视化(示例中省略具体绘制逻辑)
}
工具 2:唤醒日志分析(帮你找到误触或漏唤醒的元凶)
// 使用 Unity 日志记录关键事件
Debug.Log($"WakeupEvent time={System.DateTime.Now:O}, confidence=0.0, noise=0.0dB, event=Sample");
// 若需持久化到文件,请使用 System.IO 自行实现日志写入。
典型问题排查流程图
五、总结一下:Rokid 是怎么让语音唤醒“又聪明又省电”的?
技术优势一览
| 维度 | Rokid 方案亮点 | 开发者价值 |
|---|---|---|
| 唤醒率 | 75dB 噪声环境下达 98%,远超行业平均水平 | 无需额外硬件,直接适配复杂场景 |
| 误触控制 | 0.3 次 / 天误触(行业 1 次 / 天) | 提升用户体验,减少无效交互 |
| 功耗优化 | 唤醒状态 CPU 占用<5%,续航延长 20% | 适合 AR 眼镜等移动设备长时间佩戴 |
| 开放性 | 支持自定义唤醒词、多语言训练 | 满足个性化需求,快速适配全球市场 |
给开发者的资源大礼包
-
入门教程:去若琪学院看视频课程,手把手带你从零开始,跑通第一个语音唤醒 Demo。
-
技术文档:啃开发文档,里面详细解释了每个 API 参数和最佳实践。
-
问题求助:遇到搞不定的难题,就去 Rokid 开发者论坛(FAQ)提问,有专人解答。
总的来说,Rokid 通过把声学处理、轻量化模型和低功耗设计这几块深度整合,不光是给 AR 设备装上了一对“聪明的耳朵”,更重要的是,它通过开放平台,把这种能力交到了每个开发者手里。不管你是刚入门的新手,还是经验丰富的老鸟,都能从它清晰的文档和丰富的实战案例里找到感觉,做出更自然、更智能的人机交互体验。
所以,如果你正打算开发一款 AR 应用,不妨就从语音唤醒开始,借力 Rokid 的技术,让你的设备真正“听懂”用户的每一次呼唤。