← Back to home

Building a Voice Input Method Without Writing Code — One Ad Guy's Complete Product Thinking

Long-Form Video · EP0011 May 17, 2026 19:02
What this episode covers

I'm an advertising guy, I basically can't code, and I'd never touched Windows client development. I still shipped a commercial Windows voice input method.

  • Breaking down the need: why iFlytek / Celia / Doubao / WeChat / typeless all fell short
  • Technology selection is the biggest blind spot for someone who can't program — "I don't know what I don't know"
  • The POC stalled on latency → Claude Code taught me streaming ASR → a hands-on comparison of 5 vendors
  • A Polish layer to fix homophones (Doubao kept hearing "Claude Code" as "cloud")
  • 100 interaction details: device switching, middle mouse button, per-character billing
  • I never wrote a single line of code through the whole thing.

"Not knowing how to code isn't an excuse. What's left is always on the 'think it through' side."

In the last few episodes I demoed operating Claude Code by voice, and a crowd of people in the comments kept asking — “where did you buy that voice input method?

That’s when it hit me. The thing I’m using doesn’t have an equivalent on the market.

So this episode, I’ll walk through how it got built, from the beginning.

I’m an advertising guy. I basically can’t code, and I’d definitely never touched Windows client development. But I still wanted an input method that felt right — fast, accurate, mixed Chinese and English, with hotwords I could manage myself.

Can’t write code? Then let Claude Code be my hands, and I’ll handle thinking the whole product through.

After a stretch of polishing, it went from POC to commercially usable, and friends are already using it.

1. Breaking down the need — why no input method on the market felt right

Before you work out what you want, work out what’s wrong with what already exists.

iFlytek IME — no updates in years, its recognition engine stuck in the second tier. Celia Keyboard — extremely accurate on Huawei HarmonyOS (my guess is it has system-level permissions and gets the context), but HarmonyOS only, no Windows version. Doubao IME — the Windows version is still in development. WeChat’s built-in voice input on PC — actually very good. typeless from overseas — over ten US dollars a month, plus a pile of odd features I’d never use. Shandianshu, domestically — well built, but you can’t manage the hotword library or customization yourself.

After the research, not one of them fully fit me. So either put up with it, or build it.

2. Technology selection — the biggest blind spot for someone who can’t program

“I don’t know what I don’t know” — that’s the biggest blind spot for someone who can’t program.

For the exact same feature, the language and framework underneath can be completely different. Python is easy but the software gets bloated; Rust is tiny and blazing fast but its ecosystem is a steeper climb.

I laid the requirement out for Claude Code explicitly: “This is my use case, these are my requirements. What technology choices are viable — give me a multi-dimensional evaluation and report back.

The research came back with Rust + Tauri: small binary size, low memory footprint, runs as a single lean file, stable recognition, cross-platform. Write the floating window in HTML/CSS and you can deploy to Mac and Android later.

I picked Rust.

But I have to add a caveat: this doesn’t mean everyone should pick Rust. Python is easier for AI-assisted coding, the community has far more experience, and there’s reference code everywhere. Only when the model is strong enough do you have a shot at squeezing the binary down this small. This route demands a lot from the model.

3. Hands-on ASR engine testing — 5 streaming ASR vendors compared

In the POC stage I first got the whole chain working with Gemini 3 Flash: press a key to record → model recognizes → paste at the cursor position.

But every time I finished speaking I had to wait several seconds before the first character appeared. The entire recording got shipped to Google’s overseas servers and back, which felt terrible, and long recordings tended to cut out.

I asked Claude Code “how do I reduce latency,” and it told me — “use streaming ASR.” Recognize each small segment as you speak it, no waiting for the whole clip. And streaming splits further into local and cloud.

That was the “I don’t know what I don’t know” moment. I had a need, Claude Code did the research, and only then did I find out this option existed.

Next: have Claude Code deploy all 5 streaming ASR vendors on my machine for real testing.

I recorded a mixed Chinese-English clip on my phone and ran it through —

  • Local models: characters appear in milliseconds, but technical terms come out so wrong you can’t fix them. Fast but unusable.
  • Gemini 2.5/3 Flash: very good results, but not streaming — you wait several seconds.
  • Doubao streaming cloud input: first character in milliseconds, cloud streaming, and the error rate stays contained across a full clip.

Then I had Claude Code generate a long audio clip for a stability test — no interruptions at all, and fast.

I went with Doubao.

4. The Polish layer — fixing homophone and character-shape errors

Doubao isn’t problem-free. When I say “Claude Code,” for example, it often hears “cloud.” Homophones, imprecise pronunciation, and technical jargon are the systematic blind spot of streaming ASR.

The industry has a solution for this, called the Polish layer — the moment Doubao emits the text, push it straight to a correction model that fixes the wrong words based on context and meaning.

I tested several models for Polish too. It came down to Qwen Flash versus Claude Haiku.

Haiku is slightly better on quality, but costs more, and cross-border transmission adds latency you can’t ignore.

Qwen Flash — fast, cheap, quality good enough, domestic servers with no cross-border latency. I picked Qwen.

Note, up to this point I haven’t written a single line of code. It’s purely research and decisions, research and decisions.

Polish isn’t magic, it’s prompt engineering. I also designed a flow where, after a set number of characters, Claude runs a fine-grained review pass that pulls out the high-frequency terms and the contexts where recognition failed, then turns them into the fix instructions for the next round of Polish. Hotwords that learn themselves.

5. A hundred unremarkable interaction details

Last comes the interaction. A minimal floating window that follows the cursor and doesn’t steal the screen.

A user reported “it stops recognizing when I switch microphones.” I told Claude Code: a user hit this problem in this scenario, my read is that the tracked device disappears after switching microphones, so it should auto-detect audio device changes and prioritize an external mic. Claude Code changed the Rust code and shipped it.

Bind the middle mouse button — because I often operate the computer with a remote and never touch the keyboard.

Auto-send after recognition — the model already corrects typos, so there’s no reason to manually press Enter again.

Switching the pricing model from monthly to per-character — the backend logs showed heavy users blowing past break-even every month; per-character billing is always profitable.

WeChat QR code login — I registered on the WeChat developer platform and sent Claude Code a screenshot of every step so it could walk me through configuring the callback.

I described each of these small things clearly to Claude Code. It makes the change, I test it.

Wrapping up

In the old days this was unthinkable — an advertising guy who has never touched code, shipping a commercial Windows application, and in Rust of all things.

Now it really is just this: if you can articulate the requirement clearly, you can do it.

Not knowing how to code isn’t an excuse. Claude Code has taken over the execution half. What’s left is always on the “think it through” side.

Note — up to this point I haven't written a single line of code. All I've been doing is research and decisions.