Adding Voice to a Java AI Assistant — Whisper, TTS, and the Voice Conversation Loop A developer added voice capabilities to the Jarvis AI Platform by integrating Whisper for speech transcription and native OS text-to-speech engines. The voice pipeline wraps the existing chat pipeline, allowing the AI to hear and speak without modifying the core orchestration logic. Two backends for Whisper are supported: Groq's API and local whisper.cpp, switchable via a single configuration flag. How we gave Jarvis the ability to hear and speak — Phase 5 of the Jarvis AI Platform After Phase 4 , Jarvis could answer questions using real tools. You: What is the weather in Kathmandu? Jarvis: calls WeatherTool It is 22°C and sunny. You: What is 2847 × 391? Jarvis: calls CalculatorTool 1,113,177 But every interaction required typing. Phase 5 changed that. BEFORE Phase 5: You type → Jarvis types back AFTER Phase 5: You speak → Whisper transcribes → AI responds → TTS speaks back Simple to describe. Surprisingly nuanced to build correctly. The original plan was to run Whisper locally via Ollama. ollama pull whisper Error: pull model manifest: file does not exist Ollama is excellent for language models. It does not support audio transcription models. This forced a rethink. We designed WhisperTranscriptionService to support two backends. Groq provides Whisper large-v3-turbo through an OpenAI-compatible API. The free tier offers 6,000 requests/day with no credit card required. Set GROQ API KEY in .env ↓ Works immediately For users who want completely local transcription: git clone https://github.com/ggerganov/whisper.cpp cd whisper.cpp make bash ./models/download-ggml-model.sh base.en ./server -m models/ggml-base.en.bin --port 8178 Both implementations expose the same OpenAI-compatible multipart API. Switching between them is a single configuration flag . The most important architectural decision of Phase 5 was this: Voice is only a wrapper around the existing chat pipeline. AiOrchestrator does not change. ❌ WRONG Voice Pipeline ↓ Different AI Pipeline ↓ Different Memory ↓ Different Tools ✅ CORRECT Audio ↓ Whisper ↓ Text ↓ AiOrchestrator.chat ↓ Existing Memory Existing RAG Existing Tools ↓ Text ↓ Text-to-Speech Everything built in Phases 1–4 continues working automatically. @Service public class WhisperTranscriptionService { private final WebClient webClient; private final String apiKey; private final String model; private final boolean isLocalMode; public Mono