Getting Local Speech-to-Text Running for Team Meetings on Ubuntu #
I run team meetings daily, and nothing beats local transcription for privacy. No cloud leaks, no subscriptions—just your hardware doing the work. Here’s my go-to setup using Whisper from OpenAI, optimized for Ubuntu. It handles multiple speakers decently and runs offline.
Install it on Ubuntu 24.04 (works on 22.04 too). You’ll need a microphone setup for the room—USB conference mic recommended. For GPU acceleration, have NVIDIA drivers ready; CPU works but slower.
Step 1: Prep Your System #
Update packages first.
sudo apt update && sudo apt upgrade -yGrab dependencies: audio tools and Python basics.
sudo apt install -y ffmpeg python3 python3-venv python3-pip portaudio19-devThat’s it for basics. If you’re on Wayland, add xdotool and ydotool later for dictation tweaks.
Step 2: Set Up a Virtual Environment #
Virtual envs keep things clean—no messing with system Python.
python3 -m venv ~/whisper-meetings
source ~/whisper-meetings/bin/activateUpgrade pip inside it.
pip install --upgrade pipStep 3: Install Whisper and Speed It Up #
Whisper’s core is gold for accuracy, but base install is slow. Use faster-whisper for real-time-ish team use.
pip install faster-whisperFor full OpenAI Whisper with real-time:
pip install git+https://github.com/openai/whisper.git
pip install torch torchaudio --index-url https://download.pytorch.org/whl/cu118 # CUDA if you have GPUI prefer faster-whisper—it trades tiny accuracy for speed on meetings. Test both.
Step 4: Handle Audio Input for Meetings #
Meetings mean Zoom, Teams, or Jitsi. Pipe audio locally.
Install PulseAudio utils if needed.
sudo apt install pulseaudio-utilsRecord meeting audio to a file during calls:
parec -d alsa_output.usb-Conference_Mic-00.analog-stereo.monitor | ffmpeg -i - -c:a pcm_s16le -ar 16000 meeting.wavThis grabs system audio. Run it in a terminal while your call happens. Privacy win: nothing leaves your machine.
For live transcription, script a listener. More on that next.
Step 5: Basic Transcription Script #
Create transcribe-meeting.py:
import whisper
import sys
model = whisper.load_model("base") # Use "small" or "medium" for better accuracy
result = model.transcribe(sys.argv)
print(result["text"])Run post-meeting:
python transcribe-meeting.py meeting.wavBoom—full text. Handles accents okay, timestamps speakers roughly with diarization hacks.
Step 6: Real-Time for Live Meetings #
For live, use Whisper-live or Gradio interface. Install extras:
pip install gradio sounddevice numpyScript live-transcribe.py:
import whisper
import sounddevice as sd
import numpy as np
import queue
import threading
model = whisper.load_model("tiny")
q = queue.Queue()
def callback(indata, frames, time, status):
q.put(indata.copy())
with sd.InputStream(callback=callback, channels=1, samplerate=16000):
print("Speak now...")
while True:
audio = q.get()
result = model.transcribe(audio)
print(result["text"])Run python live-transcribe.py. Types output to terminal. Pipe to a shared doc for team.
I love this for standups—everyone sees notes instantly, no Google Docs spying.
Step 7: Multi-Speaker Diarization #
Whisper doesn’t split speakers natively. Add pyannote-audio for that.
pip install pyannote.audioNeed a Hugging Face token for models—free, local download.
Updated script snippet:
from pyannote.audio import Pipeline
pipeline = Pipeline.from_pretrained("pyannote/speaker-diarization", use_auth_token="your_token")
diarization = pipeline("meeting.wav")
# Merge with Whisper outputLabels “Speaker 1”, “Speaker 2”. Good enough for teams under 10 people. My meetings: 80% accurate on clear audio.
GPU Acceleration: Make It Fast #
CPU chugs on long meetings. NVIDIA GPU? Install CUDA.
sudo apt install nvidia-cuda-toolkitThen PyTorch with CUDA in your env. Transcribes hour-long meetings in minutes. No GPU? Use “tiny” model—still usable.
Integrating with Meeting Tools #
Zoom/Teams: Share screen with a browser tab running Gradio Whisper UI. Everyone sees live text.
Install Gradio app:
pip install gradioQuick app.py from tutorials—runs web server at localhost:7860. Mic input straight to transcription.
For Jitsi (my fave, self-hosted), embed via iframe or pipe audio.
Check my guide on private podcast transcription on Linux distros for self-hosted meeting servers.
Accuracy Tips from Daily Use #
Clear mics matter most. USB array mics cut noise 50% better than laptop built-ins.
Train on your team’s voices? Fine-tune Whisper—clone repo, prep data. Takes hours, boosts accuracy huge.
Noise? Add RNNoise:
pip install webrtcvadFilters crap audio. My remote teams sound pro now.
Accents: “medium.en” model crushes US/UK. Others, fine-tune.
If solo notes, see how to transcribe voice notes to text offline.
Privacy: Why Local Rules #
Cloud STT? Your IP, competitor strategies, all uploaded. I ditched Otter.ai after a breach scare.
Local: Zero upload. Whisper models download once, run forever. Ubuntu’s sandboxing adds layers.
Compare to cloud in voice notes to text vs cloud services: privacy.
Handling Long Meetings #
Chunk audio: ffmpeg splits wav by time.
ffmpeg -i meeting.wav -f segment -segment_time 1800 -c copy chunk%03d.wavTranscribe each, merge texts. Timestamps preserved.
Export to Markdown or Obsidian for notes. Script it.
Alternatives I Tested #
Picovoice Leopard: Super fast, tiny footprint. Great for embedded, but meeting accuracy lags Whisper.
pip install pyleopardPaid keys after trial. Skip unless low-power.
Julius: Old-school Japanese engine. Config hell, meh English.
SOTY: Touch-focused, not desktop meetings.
Whisper wins. For podcasts, tweak with how to improve private speech to text accuracy for podcasts.
Custom UI for Teams #
Gradio or Streamlit dashboard. Upload recording, get text+speakers+summary.
My dashboard.py:
import gradio as gr
import whisper
def transcribe(audio):
model = whisper.load_model("base")
return model.transcribe(audio)["text"]
iface = gr.Interface(fn=transcribe, inputs="microphone", outputs="text")
iface.launch(share=False) # Local onlyShare IP:8080 on LAN. Team uploads from phones.
Troubleshooting Common Hiccups #
No audio? Check pactl list sources. Set default sink.
Permission errors? Add user to audio group: sudo usermod -aG audio $USER.
Slow? Drop to “tiny”, quantize models.
Wayland issues? ydotool for input simulation.
Virtual env not sticking? Alias in .bashrc: alias activate-whisper='source ~/whisper-meetings/bin/activate'.
Scaling for Bigger Teams #
Dockerize it. Dockerfile:
FROM ubuntu:24.04
RUN apt update && apt install -y python3-pip ffmpeg
RUN pip install faster-whisper gradio
COPY app.py .
CMD ["python", "app.py"]Run container, expose port. Self-host for company.
Daily Workflow in My Team #
- Start meeting recorder.
- Post-call: transcribe, diarize.
- Edit lightly, share Markdown.
- Searchable notes forever.
Saves hours weekly. Clients love “meeting recaps” without cloud.
For lawyer teams, peek at private speech to text services for lawyers explained.
FAQ #
Does this work on Ubuntu 22.04? Yes, same steps. Just ensure Python 3.10+. GPU drivers might need manual CUDA install, but CPU flies with tiny model.
How accurate for non-English meetings? Whisper multilingual shines—80+ languages. Use “large” model. Fine-tune for dialects; my Spanish teams hit 90% with tweaks.
Can I run this on a laptop without NVIDIA? Absolutely. “base” on CPU transcribes 30-min meetings in 5-10 mins. Quantized versions faster. Perfect for road warriors.