Paper Voice
Convert academic papers to high-quality audio narration with precise mathematical explanations using a simplified LLM-powered approach.
Features
- 🧮 Natural Math Narration: Professor-style explanations of mathematical expressions
- 📄 Multi-Format Support: PDFs, LaTeX, Markdown, and plain text with math notation
- 🎯 Simple LLM Enhancement: Single comprehensive prompt for natural audio conversion
- 🗣️ Multiple TTS Options: OpenAI TTS (with chunking) or offline pyttsx3
- 💻 Web Interface: Easy-to-use Streamlit web app
- ⚡ Intelligent Chunking: Handles large documents with smart OpenAI API limits
Installation
From PyPI (Recommended)
pip install paper_voice
From Source
git clone https://github.com/gojiplus/paper_voice.git
cd paper_voice
pip install -e .
Usage
Web Interface (Recommended)
streamlit run paper_voice/streamlit/app.py
Upload a PDF, LaTeX file, or enter text directly. Provide an OpenAI API key for LLM-enhanced natural language conversion of mathematical expressions.
Python API
Simple Enhancement (New in v0.3.0)
from paper_voice.simple_llm_enhancer import enhance_document_simple
# Convert any academic content with math to natural language
content = "The equation $E = mc^2$ represents energy-mass equivalence."
enhanced = enhance_document_simple(content, api_key="your-openai-key")
print(enhanced)
# Output: "The equation energy equals mass times the speed of light squared represents energy-mass equivalence."
Complete Workflow
from paper_voice import pdf_utils
from paper_voice.simple_llm_enhancer import enhance_document_simple
from paper_voice import tts
# 1. Extract text from PDF
pages = pdf_utils.extract_raw_text("paper.pdf")
content = '\n\n'.join(pages)
# 2. Enhance with LLM (converts math to natural language)
enhanced_script = enhance_document_simple(content, api_key="your-openai-key")
# 3. Generate audio
tts.synthesize_speech_chunked(
enhanced_script,
"output.mp3",
use_openai=True,
api_key="your-openai-key"
)
LaTeX Processing
from paper_voice.content_processor import process_content_unified
latex_content = r"""
\documentclass{article}
\begin{document}
The algorithm minimizes $J(\theta) = \frac{1}{2m}\sum_{i=1}^{m}(h_\theta(x^{(i)}) - y^{(i)})^2$.
\end{document}
"""
processed = process_content_unified(
content=latex_content,
input_type='latex',
api_key='your-openai-key',
use_llm_enhancement=True
)
print(processed.enhanced_text)
✨ What's New in v0.3.0
Simplified LLM Architecture
- Single comprehensive prompt: Handles all math conversion in one API call
- Professor-style narration: Natural explanations instead of robotic "subscript" language
- Intelligent chunking: Automatically handles large documents within OpenAI limits
- Better error handling: Clear failures instead of silent returns
Natural Mathematical Explanations
Before: $p_C$ → "p subscript C"
After: $p_C$ → "p underscore capital C, the proportion of compliers"
Complex expressions:
$F_{1C}$→ "F underscore one capital C, the outcome distribution for treated compliers"$E = mc^2$→ "energy equals mass times the speed of light squared"
Key API Changes
- Main function:
simple_llm_enhancer.enhance_document_simple() - Smart chunking for documents > 128K tokens
- Single LLM call for most documents
- Professor-style math conversion prompt
Requirements
- Python 3.9+ (excluding 3.9.7)
- OpenAI API key (required for LLM enhancement)
- pydub (for audio chunking)
- PyPDF2 or PyMuPDF (for PDF processing)
Optional Dependencies
# For better PDF processing
pip install PyMuPDF
# For offline TTS
pip install pyttsx3
# For audio format conversion
# Install ffmpeg via your system package manager
Architecture
Paper Voice uses a clean modular pipeline:
PDF → LaTeX/Markdown → LLM Enhancement → TTS
- PDF Extraction: Extract text with
pdf_utils.extract_raw_text() - LLM Enhancement: Convert math to natural language with
simple_llm_enhancer.enhance_document_simple() - Audio Generation: Create audio with
tts.synthesize_speech_chunked()
Examples
Basic Usage
from paper_voice.simple_llm_enhancer import enhance_document_simple
# Simple math conversion
text = "The learning rate α controls convergence of $\\theta^* = \\arg\\min J(\\theta)$."
enhanced = enhance_document_simple(text, "your-api-key")
# Result: Natural professor-style explanation of the math
With Progress Tracking
def progress_callback(message):
print(f"Progress: {message}")
enhanced = enhance_document_simple(
content,
api_key,
progress_callback=progress_callback
)
Large Document Handling
The system automatically handles large documents:
- Documents < 128K tokens: Single LLM call
- Documents > 128K tokens: Intelligent chunking with natural breakpoints
Configuration
Set your OpenAI API key:
export OPENAI_API_KEY="your-key-here"
Or pass it directly to functions:
enhanced = enhance_document_simple(content, api_key="your-key")
License
MIT License - see LICENSE file for details.
Metadata
Release files for paper-voice 0.3.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| paper_voice-0.3.0.tar.gz | 70.2 kB | Without provenance | Details for paper_voice-0.3.0.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| paper_voice-0.3.0-py3-none-any.whl | Python 3 | none | any | Details for paper_voice-0.3.0-py3-none-any.whl |
Total release size: 150.3 kB
Release files / paper_voice-0.3.0.tar.gz
| Download URL | paper_voice-0.3.0.tar.gz |
|---|---|
| Size | 70.2 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
daec92e30a28917a313bc9b8027e1e522ea5c8524ba211b1c12f9373df8a16f2
|
|
BLAKE2b-256 checksum How to use checksums |
9dd1e3227606adedb4bbbaae491090a8eedf2b46b76d98847494628427235dac
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.13.7
|
Release files / paper_voice-0.3.0-py3-none-any.whl
| Download URL | paper_voice-0.3.0-py3-none-any.whl |
|---|---|
| Size | 80.1 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
fe939ca2607d51fb5c9ffac721e8296bb5618650168c9e7eac3010cdc7a041a8
|
|
BLAKE2b-256 checksum How to use checksums |
7ec9ae3c2acc0a420e89ed3afc958d2664f4d2f7b0aab46f91cff7435928ef59
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.13.7
|
Security for paper-voice 0.3.0
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.