{"id":50773398,"url":"https://github.com/jamditis/audioslop","last_synced_at":"2026-06-11T21:01:48.408Z","repository":{"id":349035559,"uuid":"1200809239","full_name":"jamditis/audioslop","owner":"jamditis","description":"Document-to-audiobook pipeline with voice cloning and synced transcript player","archived":false,"fork":false,"pushed_at":"2026-04-03T23:08:36.000Z","size":104,"stargazers_count":0,"open_issues_count":1,"forks_count":0,"subscribers_count":0,"default_branch":"master","last_synced_at":"2026-04-03T23:19:14.232Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"https://jamditis.github.io/audioslop/","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/jamditis.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-04-03T21:14:44.000Z","updated_at":"2026-04-03T22:08:51.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/jamditis/audioslop","commit_stats":null,"previous_names":["jamditis/audioslop"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/jamditis/audioslop","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jamditis%2Faudioslop","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jamditis%2Faudioslop/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jamditis%2Faudioslop/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jamditis%2Faudioslop/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/jamditis","download_url":"https://codeload.github.com/jamditis/audioslop/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jamditis%2Faudioslop/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34217312,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-11T02:00:06.485Z","response_time":57,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2026-06-11T21:01:47.147Z","updated_at":"2026-06-11T21:01:48.389Z","avatar_url":"https://github.com/jamditis.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# audioslop\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"docs/og-image.png\" alt=\"audioslop -- document to audiobook pipeline\" width=\"800\"\u003e\n\u003c/p\u003e\n\n[![License: MIT](https://img.shields.io/badge/license-MIT-blue.svg)](LICENSE)\n[![Python 3.10+](https://img.shields.io/badge/python-3.10+-3776ab.svg)](https://www.python.org)\n[![F5-TTS](https://img.shields.io/badge/TTS-F5--TTS-ff6b35.svg)](https://github.com/SWivid/F5-TTS)\n[![Whisper](https://img.shields.io/badge/QA-Whisper-74aa9c.svg)](https://github.com/openai/whisper)\n[![GitHub issues](https://img.shields.io/github/issues/jamditis/audioslop)](https://github.com/jamditis/audioslop/issues)\n[![GitHub last commit](https://img.shields.io/github/last-commit/jamditis/audioslop)](https://github.com/jamditis/audioslop/commits/master)\n\nA document-to-audiobook pipeline with a web UI. Upload documents, clean text for TTS, generate audio with voice cloning, and listen with a synced transcript player that highlights words as they're spoken.\n\n## What it does\n\n1. **Extract and clean** text from .docx, .pdf, .srt, .txt, and .md files. Strips abbreviations, footnotes, URLs, and other content that trips up voice models.\n2. **Generate audio** using F5-TTS with zero-shot voice cloning from a short reference recording. Includes per-segment QA verification via Whisper transcription.\n3. **Listen with synced transcript** -- words highlight in real time as the narrator reads, like an immersive reader. Click any word to seek to that position.\n\n## Requirements\n\n- Python 3.10+\n- NVIDIA GPU with CUDA (tested on RTX 4080 Super, 16GB VRAM)\n- ~2GB disk space for models (downloaded automatically on first run)\n\n## Setup\n\n```bash\ngit clone https://github.com/jamditis/audioslop.git\ncd audioslop\n\npip install flask f5-tts whisper python-docx pdfplumber\n\n# Create directories for user data\nmkdir ref uploads jobs content output audio\n\n# Copy your voice reference clip (5-15 seconds of speech, .wav format)\ncp /path/to/your/voice.wav ref/\n\n# Configure\ncp .env.example .env\n# Edit .env with your password and secret\n```\n\n## Usage\n\n### Web UI\n\n```bash\npython app.py\n```\n\nOpen `http://localhost:5000`. Log in with the password from your `.env` file.\n\n1. Upload a document on the home page\n2. Review and edit the cleaned text\n3. Click \"Generate audio\" to start synthesis\n4. Listen in the player with synced word highlighting\n\n### Command line\n\nThe pipeline scripts work standalone without the web UI:\n\n```bash\n# Clean a document for TTS\npython audioslop.py content/mybook/ -o output/mybook/\n\n# Generate audio from cleaned text\npython synthesize.py output/mybook/ --ref-audio ref/voice.wav -o audio/mybook/\n\n# Verify audio quality\npython qa.py audio/mybook/ --source output/mybook/\n```\n\n## Architecture\n\n```\nBrowser (HTML/JS/Tailwind)\n    |\nFlask API (app.py)\n    |\nBackground worker (worker.py)\n    |\nPipeline: audioslop.py -\u003e synthesize.py -\u003e qa.py\n    |\nF5-TTS (voice synthesis) + Whisper (verification + word timestamps)\n```\n\nThe web UI wraps three standalone Python scripts:\n\n- `audioslop.py` -- Multi-format text extraction, TTS-specific cleaning (abbreviation expansion, dash normalization, footnote removal), and size-based chunking\n- `synthesize.py` -- F5-TTS synthesis with per-paragraph generation, structural pauses between segments, and a QA verification loop\n- `qa.py` -- Whisper-based transcription verification with word-level timestamps, accuracy scoring, and flow analysis\n\nThe player uses Whisper's word-level timestamps to sync transcript highlighting to audio playback via binary search on a flat timeline array, updated every animation frame.\n\n## Voice cloning\n\nF5-TTS clones any voice from a short reference recording. For best results:\n\n- Record 5-15 seconds of natural speech in a quiet room\n- Save as .wav format\n- The model mirrors whatever speaking style it hears in the reference\n\n## Configuration\n\n| Variable | Default | Purpose |\n|----------|---------|---------|\n| `AUDIOSLOP_PASSWORD` | (required) | Web UI login password |\n| `AUDIOSLOP_SECRET` | `dev-secret-change-me` | Flask session secret (change in production) |\n\n## Project structure\n\n```\naudioslop/\n├── app.py            # Flask web app and API routes\n├── worker.py         # Background job processing thread\n├── audioslop.py      # Text extraction and TTS cleaning\n├── synthesize.py     # F5-TTS synthesis with QA loop\n├── qa.py             # Transcription verification and timing\n├── db.py             # SQLite database layer\n├── activity.py       # Per-job event logging\n├── static/\n│   ├── app.css       # Styles\n│   └── player.js     # Audio player and transcript sync engine\n├── templates/        # Jinja2 templates (upload, review, player)\n├── tests/            # pytest test suite\n└── docs/             # Design specs and implementation plans\n```\n\n## License\n\nMIT\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjamditis%2Faudioslop","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fjamditis%2Faudioslop","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjamditis%2Faudioslop/lists"}