Customer Service is a two-level conversational game where talking is the mechanic, not picking from a dialogue tree. You have to convince an AI call-center operator to cancel your service. It was made in Unity 6 with URP, and the whole AI pipeline — speech recognition, dialogue and voice — runs locally on the player’s machine, in English and Spanish.
The premise is a near future where automated systems have replaced human call-center workers. The operators are tired of the job and keep steering the conversation away from the cancellation, so the player has to build enough complicity for them to actually help. The first level is a WhatsApp-style text chat; the second one turns the same conversation into a phone call.
The voice loop is:
Player voice → speech-to-text → local language model → text-to-speech → operator reply.
Each stage runs on-device:
-Speech recognition runs through whisper.unity, transcribing microphone input locally with Whisper.
-Dialogue is generated by a local Llama 3.1 8B model, running through LLMUnity and llama.cpp.
-Voice synthesis uses Piper with ONNX voice models on the Unity Inference Engine, plus eSpeak-NG for phonemization. The reply is spoken aloud and shown as a subtitle in the call interface.
The hardest problem was making a free-form model drive a real win/lose state. My solution was to have the same model classify every player message as Complicity, Neutral or Rejection, and to keep that classification as game logic rather than flavour: complicity moves the conversation toward success, repeated rejection leads to failure. Progression is tracked separately from the text the model produces, so the dialogue can go anywhere while the outcome stays readable.
Both languages share the same pipeline. When the game is played in Spanish, the operator is instructed to speak Argentine Spanish, which affects the prompt and the voice model it is paired with.
Keeping everything local was the main technical goal, because it lets the game work offline, removes per-message API costs, and makes the AI feel like part of the game instead of an external service. The trade-off is real: it needs more processing power (6 GB of VRAM minimum, 8 GB recommended), speech recognition makes mistakes, and language models do not always return well-structured output. I designed the logic around that, keeping category detection tolerant and the game state independent from the conversation.
What I took from this project is hands-on experience running quantized LLMs, speech recognition and neural text-to-speech inside a real-time Unity loop, and the habit of treating model output as an unreliable input to validate rather than a result to trust.