A simple tool to make the video, audio, subtitle and video-url (especially youtube) content into a written markdown files with the ability to rewritten the oral expression into written ones, or translating the content into a target language by using LLM.
Project description
Wenbi
Wenbi converts media and text into structured Markdown, then rewrites or translates it.
It supports:
- Video/audio/URL transcription to VTT/Markdown
- Text rewriting (
rewrite,academicstyle) - Translation (
translate) with DeepL first, then LLM fallback - English interview rewriting (
en-en) with speaker-separated output - Chinese interview rewriting (
zh-zh) with speaker-separated output - English/Chinese bilingual audio extraction (
en-zh) — keep English, translate to Chinese - Single-language multi-speaker diarization (
speaker) with rewrite + translate - PPT-style slide + speech combination (
ppt) - Batch directory processing (
wenbi-batch)
Install
Prerequisites:
- Python 3.10+
ffmpegin PATH
Install:
pip install wenbi
Or from a local checkout:
# from the project directory
pip install -e .
Quick Start
Rewrite:
wenbi rewrite input.mp4 --lang Chinese --llm ollama/qwen3.5:cloud
Translate (DeepL first):
wenbi translate input.md --lang Chinese --deepl-key "$DEEPL_API_KEY"
English interview rewrite:
wenbi en-en interview.mp4 --gladia-key "$GLADIA_API_KEY"
Chinese interview rewrite:
wenbi zh-zh interview.mp4 --gladia-key "$GLADIA_API_KEY"
English/Chinese bilingual audio (keep English, translate to Chinese):
wenbi en-zh bilingual.mp4 --gladia-key "$GLADIA_API_KEY"
Single-language multi-speaker (diarize, rewrite, translate):
wenbi speaker panel.mp4 --source-lang en --gladia-key "$GLADIA_API_KEY"
PPT workflow:
wenbi ppt lecture.mp4 --lang English
Commands
rewrite (rw)
Rewrite spoken/transcribed text into written style.
wenbi rewrite <input> [options]
Key options:
--style rewrite|academic--lang--llm--cite-timestamps--start-time,--end-time(media/URL)
translate (tr)
Translate content to a target language.
wenbi translate <input> --lang <target> [options]
Key options:
--deepl-key(orDEEPL_API_KEYenv var)--llm(fallback model)--keep-original-lang--cite-timestamps
Translation behavior
translate uses this order:
- Try DeepL API first (when key is available).
- If DeepL is unavailable or chunk translation fails, fallback to LLM.
If both DeepL and LLM are unavailable, translation cannot complete successfully.
en-en (enen)
Transcribe an English interview, separate speaker turns, and rewrite it as polished written English using ollama/qwen3.5:cloud by default.
wenbi en-en <input> [options]
Key options:
--speaker-count(default:2)--asr-provider auto|gladia|sensevoice|whisper--gladia-key(orGLADIA_API_KEYenv var)--llm(default:ollama/qwen3.5:cloud)--start-time,--end-time(media/URL)
The rewrite preserves speaker labels and adds a ## Questions for Clarification section when speaker roles, names, terms, or ambiguous ASR phrases need human confirmation.
zh-zh (zhzh)
Transcribe a Chinese interview, separate speaker turns, and rewrite it as polished written Chinese using ollama/qwen3.5:cloud by default.
wenbi zh-zh <input> [options]
Key options:
--speaker-count(default:2)--asr-provider auto|gladia|sensevoice|whisper--gladia-key(orGLADIA_API_KEYenv var)--llm(default:ollama/qwen3.5:cloud)--start-time,--end-time(media/URL)
The rewrite preserves speaker labels and adds a ## 需要确认的问题 section when speaker roles, names, terms, or ambiguous ASR phrases need human confirmation.
en-zh (enzh)
Extract English from English/Chinese bilingual audio (e.g. interpreted interviews), drop the interpreter language, and translate the kept English into Chinese using DeepL first with LLM fallback.
wenbi en-zh <input> [options]
Key options:
--asr-provider auto|gladia|sensevoice|whisper(default:gladia)--source-lang(default:en) — language to keep--interpreter-lang(default:zh) — language to drop--gladia-key(orGLADIA_API_KEYenv var)--lang— target translation language (default:Chinese)--no-speaker-labels— disable speaker diarization--save-json— write segment diagnostics and raw provider JSON--start-time,--end-time(media/URL)
Outputs include the kept-language VTT/Markdown, a bilingual Markdown side-by-side, and (optionally) a rewritten English Markdown and diagnostics JSON.
speaker (sp)
Transcribe single-language multi-speaker audio with diarization, then rewrite and translate it. Same engine as en-en/zh-zh but without the interview-style rewrite defaults — use it for panels, podcasts, and any multi-speaker source where you want to keep the source language.
wenbi speaker <input> [options]
Key options:
--asr-provider auto|gladia|sensevoice|whisper(default:gladia)--source-lang(default:en)--speaker-count(default: provider decides)--gladia-key(orGLADIA_API_KEYenv var)--lang— target translation language (default:Chinese)--no-speaker-labels— disable speaker diarization--save-json— write segment diagnostics and raw provider JSON--start-time,--end-time(media/URL)
Outputs a transcript VTT, transcript Markdown, rewritten Markdown, and (when translation is requested) a bilingual Markdown.
ppt (p)
Extract slides from video, align with speech, and export combined markdown.
wenbi ppt <video_or_url> [options]
Key options:
--frame-interval--cropped-slide [auto|x0,y0,x1,y1]--ppt <ppt/pdf/image/odp>--no-ocr--no-clean--ssim-threshold,--hist-threshold,--dedup-method
Supported Inputs
- Media:
.mp4 .avi .mov .mkv .flv .wmv .m4v .webm .mp3 .flac .aac .ogg .m4a .opus - Text/subtitles:
.vtt .srt .ass .ssa .sub .smi .txt .md .markdown .docx - URL inputs are supported for media flows.
Common Global Options
Used by subcommands:
--output-dir--lang--llm--chunk-length--max-tokens--timeout--temperature--transcribe-model--transcribe-lang--multi-language--verbose
Output Files
Typical outputs:
*_rewritten.md*_translated.md*_academic.md*_en.md,*_en.vtt(English interview transcripts)*_zh.md,*_zh.vtt(Chinese interview transcripts)*_bilingual.md(en-zh and speaker translated output)*_diagnostics.json(when--save-jsonis used)*_combine.md/*_combine_clean.md(PPT workflows)*.vtt,*.csv(depending on flow)
Batch Processing
Process a directory of media files:
wenbi-batch <input_dir> --output-dir <dir> --md
Optional config:
wenbi-batch <input_dir> --config config.yaml
YAML Config (CLI)
wenbi supports YAML via --config.
Example:
input: lecture.mp4
output_dir: ./out
llm: ollama/qwen3.5:cloud
lang: Chinese
chunk_length: 20
Multi-input format is also supported using inputs:.
Python API
from wenbi.main import process_input
text, md_file, csv_file, base_name = process_input(
file_path="input.mp4",
subcommand="translate",
lang="Chinese",
use_deepl=True,
deepl_key="<DEEPL_KEY>",
llm="ollama/qwen3.5:cloud",
)
Troubleshooting
- No DeepL translation output:
- Set
DEEPL_API_KEYor--deepl-key - Run with
--verboseto confirm DeepL connectivity
- Set
- Fallback LLM not working:
- Ensure your provider is reachable (for example, Ollama running locally for
ollama/...)
- Ensure your provider is reachable (for example, Ollama running locally for
- PPT OCR issues:
- Ensure
marker_singleand OCR dependencies are installed correctly
- Ensure
License
Apache-2.0
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file wenbi-0.141.2.tar.gz.
File metadata
- Download URL: wenbi-0.141.2.tar.gz
- Upload date:
- Size: 5.0 MB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/5.1.1 CPython/3.13.1
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
0c2b0068a01b7182bfbfba673477320e8c92b280c56892c8eda1bba7248280ba
|
|
| MD5 |
263ab44d16286e2240f36b294088d53c
|
|
| BLAKE2b-256 |
254179d0c418bd412d91c0c08d88298c0c79228d1190d2ebbd413cc36cedf059
|
File details
Details for the file wenbi-0.141.2-py3-none-any.whl.
File metadata
- Download URL: wenbi-0.141.2-py3-none-any.whl
- Upload date:
- Size: 99.9 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/5.1.1 CPython/3.13.1
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
ef3c72f3383287a9e72b804175bde2cda04cf0ece80bd2ff68ff8f7a29286d46
|
|
| MD5 |
ce7766e0cbc1389d9dc0487f940efd7e
|
|
| BLAKE2b-256 |
2bc91f35738d99de2c8b435e0fdd47e108295ce4cba02d048e4b3b8dfb8b5c48
|