MuK AI Voice
Talk to your assistant — live transcription & spoken replies
MuK IT GmbH - www.mukit.at
Speak instead of type
A mic button on the MuK AI chat composer captures your speech and drops the transcript into the textarea. A waveform button starts hands-free voice mode: the browser notices when you stop speaking, sends the utterance on its own, and the reply is spoken back before listening resumes — so the conversation continues where you left off.
Or go fully hands-free: the waveform button starts voice mode — each utterance is sent the moment you pause, and the assistant reply is spoken back before listening resumes. A real conversation with your Odoo data.
No sidecar, no extra ports
The browser captures PCM16 / 24 kHz via an
AudioWorklet and ships the frames over
chunked JSON-RPC POSTs. They are buffered in the database
rather than in the worker, so the requests of one
utterance may be served by different workers and the
transcript comes straight back from
/close. Everything runs inside Odoo —
multi-worker and Odoo.sh compatible out
of the box.
Supported providers
Each voice provider record has its own credentials, independent of the chat provider key. Run chat on Anthropic and voice on OpenAI, or keep voice on a separate OpenAI key for billing isolation — the records do not share state.
| Provider | Speech-to-text | TTS | Voices |
|---|---|---|---|
| OpenAI | gpt-4o-mini-transcribe |
gpt-4o-mini-tts |
alloy, echo, fable, onyx, nova, shimmer |
| Google Gemini | — | gemini-2.5-flash-preview-tts |
Aoede, Kore, Charon, Fenrir, Puck, … |
Both engines transcribe and speak. Pick either as the default speech-to-text provider and either as the default text-to-speech provider — mix and match as you like.
Voice mode, on your terms
Voice mode shows its phase at a glance — listening, thinking, speaking — with a live caption of what it heard, a mute toggle and an end button. Every assistant message also carries a small speaker icon: tap it to play that single reply on demand, tap again to stop.
Each agent can override the global STT and TTS provider from a dedicated tab on the agent form, so a customer service agent and an analyst agent can speak with different voices — or pull from different vendors entirely.
Cost stays visible
Voice is billed by the second. The addon tracks
voice_cost_usd on each chat session and
accumulates both STT (per second of speech) and TTS
(per character spoken) into the same field, so the
operations dashboard shows the true cost per
conversation. No hidden line items, no surprise bills.
Help and Support
Feel free to contact us, if you need any help with your Odoo
integration or additional features.
You will get 30 days of
support in case of any issues (except data recovery, migration or
training).
Our Services
Odoo
Development
Odoo
Integration
Odoo
Infrastructure
Odoo
Training
Odoo
Support
| Availability |
Odoo Online
Odoo.sh
On Premise
|
| Odoo Apps Dependencies |
Discuss (mail)
|
| Community Apps Dependencies | Show |
| Lines of code | 30744 |
| Technical Name |
muk_ai_voice |
| License | See License tab |
| Website | http://www.mukit.at |
MuK AI Voice
Talk to the muk_ai assistant instead of typing. A microphone button on the chat composer captures your speech and drops the transcript into the textarea. A waveform button starts hands-free voice mode: the browser notices when you stop speaking, sends the utterance on its own, and the reply is spoken back before listening resumes. Spoken replies are synthesized by the configured TTS provider and played back through a session-aware audio queue.
Runs entirely inside the Odoo Python process and the bus — no sidecar daemon, no extra ports.
Note
An utterance is buffered in the database and transcribed in one call when it ends, so nothing is held in the worker that served it: the same code runs on a single-process development server and on a multi-worker production deployment. Transcription happens inside the request, so with workers = 1 the instance pauses for about a second at the end of each utterance — workers >= 2 is recommended.
Installation
To install this module, you need to:
Download the module and add it to your Odoo addons folder. Afterward, log on to your Odoo server and go to the Apps menu. Trigger the debug mode and update the list by clicking on the "Update Apps List" link. Now install the module by clicking on the install button.
Upgrade
To upgrade this module, you need to:
Download the module and add it to your Odoo addons folder. Restart the server and log on to your Odoo server. Select the Apps menu and upgrade the module by clicking on the upgrade button.
What ships
Two pre-seeded voice provider records — OpenAI and Google Gemini — sit under MuK AI > Configuration > Voice. Open one, paste the API key, and you are ready to speak.
Voice provider records carry their own credentials. They are intentionally independent of muk_ai.provider (the chat provider), so you can use Anthropic for chat and OpenAI for voice, or keep voice on a separate OpenAI key for billing isolation.
Provider matrix
| Provider | Speech-to-text | TTS | Voices |
|---|---|---|---|
| OpenAI | gpt-4o-mini-transcribe | gpt-4o-mini-tts | alloy, echo, fable, onyx, nova, shimmer |
| Google Gemini | gemini-2.5-flash | gemini-2.5-flash-preview-tts | Aoede, Kore, Charon, Fenrir, Puck, … |
Both engines transcribe speech and synthesize it; mix and match the speech-to-text and text-to-speech providers as you like.
Configuration
Settings — Settings > General Settings > MuK AI Voice:
- Default Speech-to-Text Provider — provider used for live transcription.
- Default Text-to-Speech Provider — provider used when the assistant speaks back.
- Manage Voice Providers — opens the per-record provider list.
Per-agent overrides — MuK AI > Agents > (Agent) > Voice tab:
- Voice TTS Provider — overrides the global default for this agent's spoken replies.
- Voice STT Provider — overrides the global default for this agent's transcription.
Voice providers — MuK AI > Configuration > Voice:
Per-record fields are API Key, TTS Model, TTS Voice and Transcription Model. Empty fields fall back to the engine's built-in defaults. The Test Connection button on the form verifies credentials against the provider's reachability endpoint.
Voice mode — chat composer:
- Waveform button — starts a hands-free conversation: speech is transcribed live, each utterance is sent automatically when you pause, and the assistant reply is spoken back before listening resumes. The bar shows the current phase with a live caption plus mute and end controls.
Per-message playback — message footer:
- Speaker icon — synthesizes and plays the assistant's reply on demand. A spinner shows while OpenAI is generating; clicking again stops playback.
How it works
The browser captures PCM16/24 kHz via an AudioWorklet and uploads the 400 ms frames as they arrive, through chunked JSON-RPC POSTs. Each frame is stored as a row of muk_ai_voice.realtime.buffer rather than in the worker, so the /open, /append and /close requests of one utterance may be served by three different workers — which is what makes voice work on a prefork deployment. On /close the frames are concatenated, sent to the provider in a single call and deleted; the transcript is returned in that response and merged into the composer value so subsequent utterances append without overwriting prior text.
Voice mode decides when an utterance ends in the browser: each capture frame is measured against a running estimate of the room's noise floor, and a pause long enough below it closes the utterance. Nothing depends on a provider-side voice-activity detector, so hands-free behaves identically on every deployment.
In voice mode the finished utterance is sent as a regular chat message; once the turn completes, the assistant text is synthesized through the streaming HTTP route /muk_ai_voice/tts_stream and played via a native <audio> element before capture resumes. The per-message speaker icon uses the same streaming route.
Cost tracking
Each voice exchange accrues voice_cost_usd on the related muk_ai.session record. Both STT (per-minute of captured audio) and TTS (per-character) are added to the same field. Voice cost is independent of, and additive to, the chat token cost the underlying muk_ai module already tracks.
Browser support
Any modern browser with MediaDevices.getUserMedia, AudioContext and AudioWorklet. Tested on Chrome, Edge, Firefox and Safari. This module does not use the Web Speech API — transcription always goes through the configured provider.
Credits
Contributors
- Mathias Markl <mathias.markl@mukit.at>
Author & Maintainer
This module is maintained by the MuK IT GmbH.
MuK IT is an Austrian company specialized in customizing and extending Odoo. We develop custom solutions for your individual needs to help you focus on your strength and expertise to grow your business.
If you want to get in touch please contact us via mail (sale@mukit.at) or visit our website (https://mukit.at).
MuK Proprietary License v1.0 This software and associated files (the "Software") may only be used (executed, modified, executed after modifications) if you have purchased a valid license from MuK IT GmbH. The above permissions are granted for a single database per purchased license. Furthermore, with a valid license it is permitted to use the software on other databases as long as the usage is limited to a testing or development environment. You may develop modules based on the Software or that use the Software as a library (typically by depending on it, importing it and using its resources), but without copying any source code or material from the Software. You may distribute those modules under the license of your choice, provided that this license is compatible with the terms of the MuK Proprietary License (For example: LGPL, MIT, or proprietary licenses similar to this one). It is forbidden to publish, distribute, sublicense, or sell copies of the Software or modified copies of the Software. The above copyright notice and this permission notice must be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
Please log in to comment on this module