ChengYanSuo

Blue-collar Recruiting Voice Agent

An end-to-end phone pipeline — realtime voice conversations, call persistence, and an LLM grading loop — running in a real recruiting business.

Lab · In Production2 min read

Blue-collar recruiting runs on a fact that white-collar hiring doesn't: candidates don't write resumes or browse job posts — the most effective touchpoint is a phone call. But human calls are expensive, inconsistent, and impossible to review. This project turns "calling candidates about jobs" into a realtime voice Agent system — from carrier lines dialing in and out, to voice chat inside WeChat, to automatic grading of every call — all running in production. It's the only project in this section marked "In Production" rather than purely open source: the minimal runnable phone pipeline has been extracted into a public demo, while the business system itself stays closed.

What it solves

PainReality
Wrong channelBlue-collar candidates don't submit resumes; text job posts barely reach them — the phone is the main channel
Human calls don't scaleA recruiter makes a few dozen calls a day, script quality varies, and peak season is simply unwinnable
Calls are a black boxOnce a call ends, it's gone — no record, no grading, no way to learn from bad calls

How it works: one pipeline, four endpoints

The skeleton is "one voice pipeline + multiple endpoints":

EndpointForm
PhoneCarrier SIP lines, inbound and outbound — the Agent makes and takes real calls
WebRealtime voice conversation in the browser (WebSocket relay)
WeChat Mini ProgramVoice entry point on the candidate side, verified on real devices
GradingEvery conversation is persisted and scored by an LLM-as-judge across five dimensions

The pipeline itself: SIP/client ingress → realtime voice conversation (orchestrated with LiveKit; ASR/TTS/end-to-end speech models from domestic cloud vendors) → call persistence (audio + transcript + structured outcome) → grading feedback. The grading step closes the loop — bad calls no longer vanish; they become input for iterating scripts and prompts.

Three hard-earned engineering lessons

A realtime voice Agent and a text Agent are different species. What this project learned the hard way:

  1. Pipeline prompts can't be reused for end-to-end speech models — JSON output and tool_call conventions get read out loud on a realtime voice link; you need a separate override layer.
  2. A sentence is not a turn — the ASR emitting a sentence doesn't mean the user finished talking; without debouncing, the Agent constantly interrupts.
  3. Never switch state before audio finishes playing — if the state machine follows the text instead of the playback, users hear half a sentence.

How to use it

The business system is closed, but the minimal runnable phone skeleton is open-sourced as a demo: a Chinese-language phone Agent built on LiveKit + domestic SIP access + a cloud vendor speech stack. Clone it, fill in your line and model credentials per the README, and place your first call.

In one sentence

Not "a bot that can voice-chat" — a production pipeline where everything from the phone line to the grading report grows as one piece.