What it does
Whisper transcription
SQLite FTS5 full-text search
Action item extraction
Decision archaeology
Works with Meet, Zoom, Teams recordings
Stack
PythonWhisperOpenAISQLite FTS5
Deploy on
✓ Local machine✓ Google Colab
Full source code
Install commands are in the top comments. Copy and run.
import whisper, sqlite3, json
from openai import OpenAI
from datetime import datetime
client = OpenAI()
model = whisper.load_model('small')
def init_db():
conn = sqlite3.connect('meetings.db')
conn.execute('CREATE VIRTUAL TABLE IF NOT EXISTS meetings USING fts5(mid,date,transcript,summary,actions)')
conn.commit(); return conn
def process_meeting(audio_path, meta):
transcript = model.transcribe(audio_path, fp16=False)['text']
raw = client.chat.completions.create(model='gpt-4o-mini',messages=[
{'role':'user','content':f'Return JSON: summary, decisions(list), action_items(list of task+owner+deadline). Meeting:\n{transcript[:8000]}'}
]).choices[0].message.content
insights = json.loads(raw)
mid = f"mtg_{datetime.now().strftime('%Y%m%d_%H%M%S')}"
conn = init_db()
conn.execute('INSERT INTO meetings VALUES (?,?,?,?,?)',[mid,meta.get('date',''),transcript,insights['summary'],json.dumps(insights.get('action_items',[]))])
conn.commit()
return {**insights,'id':mid}
def query_meetings(question):
rows = init_db().execute('SELECT date,summary FROM meetings WHERE meetings MATCH ? LIMIT 5',(question.replace('?',''),)).fetchall()
if not rows: return {'answer':'No relevant meetings found'}
ctx = '\n\n'.join(f'[{r[0]}] {r[1]}' for r in rows)
ans = client.chat.completions.create(model='gpt-4o-mini',messages=[
{'role':'system','content':'Answer from meeting records. Be specific about dates.'},
{'role':'user','content':f'Records:\n{ctx}\n\nQ: {question}'}])
return {'answer':ans.choices[0].message.content}