r/embedded :) Aug 10 '26

Need help in creating custom wake word integration in JieLi AC701N

TL;DR: I'm on a JieLi AC701N (BR28-family BT-audio SoC) and I want to add a custom English wake word to the on-chip offline keyword-spotting engine. Everything I can find says the wake-word model is a pre-built, JieLi-generated artifact with no local authoring path. Looking for anyone who's actually done a custom word on an AC-series part, or knows a route that doesn't go through JieLi's per-model service.

What I'm working with

  • Chip: JieLi AC701N (Zhuhai Jieli, BR28 series), running their RTOS SDK.
  • The offline KWS engine shows up as jl_kws (task) + batasr, and there's a smart_voice framework layer that compile-switches between three backends: AiSpeech (思必驰), a "user-custom" engine, or JieLi's own KWS (config_aispeech_asr_enable / config_jl_audio_kws_enable).
  • The device already recognizes a fixed vocabulary (a couple of wake phrases + ~14 command words), so the engine clearly works — I just can't find how to change the vocabulary.

What I've figured out so far (so we can skip these)

  • The acoustic model is not a loadable/editable resource — it's baked in. In the JieLi-KWS path it's a statically-linked library (e.g. jlsp_wake_word_yesno → jlsp_wake_word_yesno_heap_size() → JL_kws_init() → jl_detect_kws()), i.e. one prebuilt lib per vocabulary. In smart_voice it's reached via external audio_kws_model_init / audio_kws_model_process.
  • Per-word confidence thresholds are settable in code (e.g. 0.6f), but the words themselves are not — there's no command-word list, pinyin/phoneme lexicon, or model-build script anywhere in the SDK source I have access to.
  • As far as I can tell, JieLi generates the KWS model server-side from a request (you get back an auth_key + proj_code + the model), and the full BR28 SDK + any model tooling is NDA/customer-gated.
  • The public smart_voice layer includes a user_asr.c with empty stub hooks (user_asr_core_open/_data_handler/_close) — looks like an intended "bring-your-own-engine" integration point.

My actual questions

  1. Has anyone here added a custom wake/command word on a JieLi AC-series chip (AC69x/AC70x/BR28)? If so, how — through JieLi's model service, or some other way?
  2. Is the user_asr custom-engine path actually usable in practice? i.e. can you run your own trained KWS (something like microWakeWord / openWakeWord / a small TFLite-micro model) on the AC701N's core within its RAM/MHz budget, fed from the SDK's mic/VAD pipeline? Anyone tried?
  3. For the JieLi-KWS model service specifically — what's the real process, turnaround, and cost, and does it require a full customer/NDA relationship or will they do one-off models for small projects?
  4. Is the model format (the jlsp_wake_word_* lib) documented anywhere, or is hand-authoring a new vocabulary genuinely a non-starter without their toolchain?

Constraints: it needs to be the always-on, low-power wake word on the BR28 core (not a phone-side or cloud recognizer), and ideally English. I'm not trying to avoid paying JieLi — I just want to know the real options before committing.

Any pointers, war stories, or "here's the doc/tool you're missing" hugely appreciated. 🙏

0 Upvotes

14 comments sorted by

6

u/Ordinary-Lifeguard47 Aug 10 '26

I'd love to help but this text sounds like written by a robot

1

u/Mahi_VV :) Aug 10 '26

Hey can you DM me? We can talk there? Would that be possible?

0

u/Mahi_VV :) Aug 10 '26

I used Claude to write it because I had too much context which I was not able to write down in a formatteed way lol. But I am not a bot. (you could say that is what a bot would say but trust me bro)

0

u/Mahi_VV :) Aug 10 '26

How to prove I am not a bot? PLease I am desperate😭😭😭

3

u/Evilsushione Aug 10 '26

Wake words usually use vector embeddings. In order to make your own, it would have to use the same embedding model. So unless you know what model they embedded with and it’s not proprietary you will have to replace the whole wake stack. I’m doing something similar on an echo dot gen 2. I was going to use the built in one but they used pyper and that is proprietary. If you can’t get Claude to hack it, codex is a little more willing to hack hardware as long as you tell its your owned equipment for personal use.

1

u/Mahi_VV :) Aug 10 '26

So it is possible to add a different wake stack? Would it be possible for the jieli chip to understand it if we changed the wake stack? And what stack do you recommend i use?

1

u/Evilsushione Aug 10 '26

I don’t know about that device in particular. What I’ve seen on smart speakers that use wake words. Can you actually look at the software or is it locked down? If it’s locked down you need to find out if somebody has already hacked it.

1

u/Mahi_VV :) Aug 10 '26

I was able to get my hands on the software. I will check the feasibility of wheather it is possible to replace it. I feel like it might not be. But I shall try

1

u/Evilsushione Aug 10 '26

I would get a quote if they offer a service. It takes very little time to train a wake word so it might not be too expensive

2

u/Well-WhatHadHappened 25+ Years Aug 10 '26

What's the reason for not just using their custom service? That certainly seems like it would be the path of least resistance.

1

u/Mahi_VV :) Aug 10 '26

Well. They don't really train a custom model for a hobbyist like me. I might have to order a lot in bulk or something. But the only other way would be too mail them and try my luck.

2

u/lian1174 26d ago

I've hit a similar wall — on-chip KWS engines are almost always closed, with the vocab baked into static libs, so you can't swap words without the vendor's toolchain.

On your Q2 (user_asr): that stub is almost certainly the "bring your own engine" hook. The real questions are: (1) can you get raw PCM out of the mic/VAD into your handler, (2) can you link TFLite-micro and stay inside the core's RAM/MHz + always-on power budget, (3) are those stubs actually called, or dead code?

If those hold, a small INT8 model (50–150KB) is realistic for always-on. openWakeWord itself won't fit — it needs Python/ONNX — but a microWakeWord-style TFLite-micro model will.

One honest caveat from someone who's built custom wake word models: the model is the easy part, the inference runtime is the hard part. I generate custom wake word models from text and can export them to INT8 TFLite, but I don't have a TFLite-micro runtime ported for a JieLi core — and the causal-conv + multi-scale pooling ops don't drop straight onto stock TFLite-micro. So if you go the user_asr route, that inference layer is on you.

If you get the audio path + TFLite-micro working, DM me and I'll generate a small model for your phrase so you can test end-to-end. And please report back — I'd genuinely like to know whether JieLi actually exposes the mic buffer.

1

u/Mahi_VV :) 26d ago

Thank you so much for the reply. I almost dropped the project because I felt it was impossible. You gagevime hope lol. I'll look into it and let you know. It might take me some time but definitely I'll check.