English | 中文
AI-powered semantic search for podcast archives with multilingual retrieval, timestamped results, and playable audio snippets.
PodSearch is an AI retrieval system for podcast libraries. It downloads podcast episodes, transcribes them into timestamped text, builds multilingual embeddings, and returns the most relevant audio segments for natural-language queries.
PodSearch turns long-form podcast audio into a searchable semantic knowledge base. Instead of scanning episodes manually, users can describe a topic in natural language and retrieve the most relevant moments across a podcast collection.
The project is designed for:
- podcast archive search
- topic research and knowledge discovery
- cross-show semantic retrieval
- creator and team workflows that need searchable audio libraries
- Audio-first content is hard to navigate once a library grows across dozens of episodes and shows.
- Traditional keyword matching performs poorly on paraphrased concepts or multilingual phrasing.
- PodSearch combines ASR, embedding-based retrieval, and reranking to make spoken content searchable at the segment level.
- Overview
- Features
- Architecture
- Search Pipeline
- Tech Stack
- Repository Structure
- Quick Start
- Evaluation
- Current Coverage
- Roadmap
- Multilingual semantic retrieval across Chinese and English podcast content
- Two-stage search pipeline with vector recall and reranking
- Timestamp-level results for fast navigation inside long episodes
- Playable audio snippets generated directly from matched segments
- Streamlit demo interface with podcast-level filtering
- Offline ingestion pipeline for download, transcription, chunking, embedding, and indexing
- Built-in evaluation scripts for ranking quality analysis
The current demo interface supports:
- natural-language query input
- reranked transcript results
- timestamped segment preview
- podcast-level filtering
- inline playback for matched audio clips
flowchart LR
A["Podcast RSS / Audio Sources"] --> B["Audio Ingestion"]
B --> C["Faster-Whisper Transcription"]
C --> D["Chunking & Metadata"]
D --> E["BGE-M3 Embeddings"]
E --> F["ChromaDB Index"]
Q["User Query"] --> G["Vector Recall Top-K"]
F --> G
G --> H["BGE Reranker"]
H --> I["Ranked Results with Timestamps"]
I --> J["Streamlit UI / CLI"]
I --> K["Audio Clip Extraction"]
PodSearch has two major stages:
- Offline indexing: ingest podcast audio, transcribe episodes with
Faster-Whisper, split transcripts into retrieval-friendly chunks, and store vectors inChromaDB. - Online retrieval: embed the user query, recall candidates from the vector index, rerank them with
BGE-Reranker-v2-M3, and return the most relevant timestamped segments.
User query
-> embed with BGE-M3
-> retrieve Top-30 candidates from ChromaDB
-> rerank with BGE-Reranker-v2-M3
-> return Top-10 results
-> generate playable audio clips from timestamps
| Layer | Stack | Purpose |
|---|---|---|
| Speech Recognition | Faster-Whisper (tiny) |
Podcast ASR with timestamps |
| Embeddings | BAAI/bge-m3 |
Multilingual dense embeddings |
| Reranking | BAAI/bge-reranker-v2-m3 |
Precision-oriented reranking |
| Vector Database | ChromaDB | Persistent local vector storage |
| Processing | feedparser, requests, pydub, PyYAML, tqdm |
Ingestion and audio pipeline |
| Interface | Streamlit | Local search interface |
| Runtime | Python 3 | Pipeline orchestration |
podsearch/
├── app/
│ └── streamlit_app.py
├── data/
│ ├── raw_audio/
│ ├── transcripts/
│ ├── clips/
│ └── chroma_db/
├── docs/
│ └── assets/
├── eval/
│ ├── evaluate.py
│ └── queries.json
├── scripts/
│ ├── add_new_podcast.py
│ └── build_index.py
├── src/
│ ├── audio_clip.py
│ ├── config.py
│ ├── embedding.py
│ ├── indexing.py
│ ├── ingest.py
│ ├── pipeline.py
│ ├── search.py
│ └── transcribe.py
├── build_vector.py
├── download_all.py
├── transcribe_all.py
├── retrieve.py
├── podcasts.yaml
├── README.md
├── README_zh.md
└── requirements.txt
python3 -m venv .venv
source .venv/bin/activate
pip install -r requirements.txtEdit podcasts.yaml to define podcast names, language, and the number of episodes to fetch.
python3 download_all.pypython3 transcribe_all.pypython3 build_vector.pystreamlit run app/streamlit_app.pypython3 retrieve.pyThe repository includes eval/queries.json and eval/evaluate.py for baseline ranking evaluation.
| Metric | Score |
|---|---|
| MRR | 0.825 |
| Recall@10 | 1.000 |
| Precision@10 | 0.630 |
These results indicate strong first-hit quality on covered topics and solid top-10 usefulness for exploratory podcast search.
The current podcasts.yaml includes a mixed Chinese-English podcast set, such as:
- Lex Fridman Podcast
- Acquired
- The Indicator
- ESL Podcast
- All Ears English
- 硅谷101
- 纵横四海
- 知行小酒馆
- 忽左忽右
- 罗永浩的十字路口
- Add a production API layer for remote search requests
- Introduce richer metadata filters such as language, date, and show tags
- Support incremental indexing for newly published episodes
- Improve chunking strategies and retrieval diagnostics
- Expand evaluation with judged search outputs
- Package the project for creator or team deployment workflows
This repository does not currently declare an explicit open-source license.