docs: Create comprehensive README documentation
- Updated main README with detailed setup, Kokoro model configuration, and troubleshooting - Enhanced backend README with API documentation, Docker setup, and testing instructions - Improved frontend README with component details, deployment guide, and development tips - Added workflow testing steps and common error solutions - Documented all supported languages, voices, and configuration options Implements task 14 from text-to-audiobook spec Requirements: 13.1, 13.2, 13.3, 13.4, 13.5
This commit is contained in:
@@ -1,15 +1,23 @@
|
||||
# Text to Audiobook Backend
|
||||
|
||||
FastAPI backend service for converting text to multi-voice audiobooks using Kokoro TTS.
|
||||
FastAPI backend service for converting text to multi-voice audiobooks using Kokoro TTS (hexgrad/Kokoro-82M).
|
||||
|
||||
## Setup
|
||||
## Overview
|
||||
|
||||
### Prerequisites
|
||||
The backend provides REST API endpoints for:
|
||||
- Role/speaker detection in text
|
||||
- Multi-voice audio synthesis
|
||||
- Audio streaming and download
|
||||
|
||||
## Prerequisites
|
||||
|
||||
- Python 3.10 or higher
|
||||
- espeak-ng (system dependency)
|
||||
- espeak-ng (system dependency for grapheme-to-phoneme conversion)
|
||||
- Docker (optional, for containerized deployment)
|
||||
|
||||
### Install espeak-ng
|
||||
## Local Development Setup
|
||||
|
||||
### 1. Install espeak-ng
|
||||
|
||||
**macOS:**
|
||||
```bash
|
||||
@@ -22,44 +30,453 @@ sudo apt-get update
|
||||
sudo apt-get install espeak-ng
|
||||
```
|
||||
|
||||
### Python Environment Setup
|
||||
|
||||
1. Create a virtual environment:
|
||||
**Linux (Fedora/RHEL):**
|
||||
```bash
|
||||
sudo dnf install espeak-ng
|
||||
```
|
||||
|
||||
**Windows:**
|
||||
Download from [espeak-ng releases](https://github.com/espeak-ng/espeak-ng/releases)
|
||||
|
||||
Verify installation:
|
||||
```bash
|
||||
espeak-ng --version
|
||||
```
|
||||
|
||||
### 2. Python Environment Setup
|
||||
|
||||
```bash
|
||||
# Create virtual environment
|
||||
python -m venv venv
|
||||
```
|
||||
|
||||
2. Activate the virtual environment:
|
||||
```bash
|
||||
# macOS/Linux
|
||||
# Activate virtual environment
|
||||
# macOS/Linux:
|
||||
source venv/bin/activate
|
||||
|
||||
# Windows
|
||||
# Windows:
|
||||
venv\Scripts\activate
|
||||
```
|
||||
|
||||
3. Install dependencies:
|
||||
```bash
|
||||
# Upgrade pip
|
||||
pip install --upgrade pip
|
||||
|
||||
# Install dependencies
|
||||
pip install -r requirements.txt
|
||||
```
|
||||
|
||||
4. Create environment file:
|
||||
### 3. Environment Configuration
|
||||
|
||||
```bash
|
||||
cp .env.example .env
|
||||
```
|
||||
|
||||
## Running the Server
|
||||
Edit `.env` if needed:
|
||||
```bash
|
||||
PORT=8000
|
||||
LOG_LEVEL=info
|
||||
```
|
||||
|
||||
### 4. Run the Server
|
||||
|
||||
```bash
|
||||
uvicorn main:app --reload --host 0.0.0.0 --port 8000
|
||||
```
|
||||
|
||||
The API will be available at `http://localhost:8000`
|
||||
The server will start on http://localhost:8000
|
||||
|
||||
API documentation: `http://localhost:8000/docs`
|
||||
**Available URLs:**
|
||||
- API Base: http://localhost:8000
|
||||
- Interactive API Docs: http://localhost:8000/docs
|
||||
- Alternative API Docs: http://localhost:8000/redoc
|
||||
- Health Check: http://localhost:8000/api/health
|
||||
|
||||
## Docker Deployment
|
||||
|
||||
### Using Docker Compose (Recommended)
|
||||
|
||||
```bash
|
||||
# Build and start
|
||||
docker-compose up -d
|
||||
|
||||
# View logs
|
||||
docker-compose logs -f backend
|
||||
|
||||
# Stop
|
||||
docker-compose down
|
||||
|
||||
# Rebuild after code changes
|
||||
docker-compose up -d --build
|
||||
```
|
||||
|
||||
### Using Docker Directly
|
||||
|
||||
```bash
|
||||
# Build image
|
||||
docker build -t text-to-audiobook-backend .
|
||||
|
||||
# Run container
|
||||
docker run -d \
|
||||
--name text-to-audiobook-backend \
|
||||
-p 8000:8000 \
|
||||
-e PORT=8000 \
|
||||
-e LOG_LEVEL=info \
|
||||
text-to-audiobook-backend
|
||||
|
||||
# View logs
|
||||
docker logs -f text-to-audiobook-backend
|
||||
|
||||
# Stop and remove
|
||||
docker stop text-to-audiobook-backend
|
||||
docker rm text-to-audiobook-backend
|
||||
```
|
||||
|
||||
### Docker Configuration
|
||||
|
||||
The Dockerfile includes:
|
||||
- Python 3.10 slim base image
|
||||
- Automatic espeak-ng installation
|
||||
- Python dependencies from requirements.txt
|
||||
- Health check monitoring
|
||||
- Uvicorn ASGI server
|
||||
|
||||
**Resource Requirements:**
|
||||
- Memory: 2GB minimum (4GB recommended)
|
||||
- Storage: ~500MB for Kokoro models
|
||||
- CPU: Multi-core recommended
|
||||
|
||||
## API Endpoints
|
||||
|
||||
- `GET /api/health` - Health check endpoint
|
||||
- `POST /api/tts/roles` - Detect roles in text
|
||||
- `POST /api/tts` - Generate audiobook
|
||||
### GET /api/health
|
||||
|
||||
Health check endpoint.
|
||||
|
||||
**Response:**
|
||||
```json
|
||||
{
|
||||
"status": "ok"
|
||||
}
|
||||
```
|
||||
|
||||
**Example:**
|
||||
```bash
|
||||
curl http://localhost:8000/api/health
|
||||
```
|
||||
|
||||
### POST /api/tts/roles
|
||||
|
||||
Detect distinct roles/speakers in text.
|
||||
|
||||
**Request Body:**
|
||||
```json
|
||||
{
|
||||
"text": "Alice: Hello there!\nBob: Hi Alice, how are you?\nNarrator: They greeted each other warmly."
|
||||
}
|
||||
```
|
||||
|
||||
**Response:**
|
||||
```json
|
||||
{
|
||||
"roles": [
|
||||
{"id": "Alice", "label": "Alice"},
|
||||
{"id": "Bob", "label": "Bob"},
|
||||
{"id": "Narrator", "label": "Narrator"}
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
**Supported Role Patterns:**
|
||||
- Colon pattern: `RoleName: dialogue text`
|
||||
- Bracket pattern: `[RoleName] dialogue text`
|
||||
|
||||
**Example:**
|
||||
```bash
|
||||
curl -X POST http://localhost:8000/api/tts/roles \
|
||||
-H "Content-Type: application/json" \
|
||||
-d '{"text":"Alice: Hello!\nBob: Hi there!"}'
|
||||
```
|
||||
|
||||
### POST /api/tts
|
||||
|
||||
Generate multi-voice audiobook.
|
||||
|
||||
**Request Body:**
|
||||
```json
|
||||
{
|
||||
"text": "Alice: Hello there!\nBob: Hi Alice!",
|
||||
"lang": "a",
|
||||
"roles": [
|
||||
{"id": "Alice", "voice": "af_bella"},
|
||||
{"id": "Bob", "voice": "am_adam"}
|
||||
],
|
||||
"speed": 1.0
|
||||
}
|
||||
```
|
||||
|
||||
**Parameters:**
|
||||
- `text` (required): Text to synthesize
|
||||
- `lang` (required): Language code (a=American English, b=British English, f=French, j=Japanese)
|
||||
- `roles` (required): Array of role-to-voice mappings
|
||||
- `speed` (optional): Playback speed (0.5-1.5, default: 1.0)
|
||||
|
||||
**Response:**
|
||||
- Content-Type: `audio/wav`
|
||||
- Content-Disposition: `attachment; filename="audiobook.wav"`
|
||||
- Body: Audio file bytes
|
||||
|
||||
**Example:**
|
||||
```bash
|
||||
curl -X POST http://localhost:8000/api/tts \
|
||||
-H "Content-Type: application/json" \
|
||||
-d '{
|
||||
"text": "Alice: Hello!\nBob: Hi!",
|
||||
"lang": "a",
|
||||
"roles": [
|
||||
{"id": "Alice", "voice": "af_bella"},
|
||||
{"id": "Bob", "voice": "am_adam"}
|
||||
],
|
||||
"speed": 1.0
|
||||
}' \
|
||||
--output audiobook.wav
|
||||
```
|
||||
|
||||
## Kokoro TTS Configuration
|
||||
|
||||
### Supported Languages
|
||||
|
||||
| Code | Language |
|
||||
|------|----------|
|
||||
| `a` | American English |
|
||||
| `b` | British English |
|
||||
| `f` | French |
|
||||
| `j` | Japanese |
|
||||
|
||||
### Available Voices
|
||||
|
||||
| Voice ID | Gender | Accent | Description |
|
||||
|----------|--------|--------|-------------|
|
||||
| `af_bella` | Female | American | Bella |
|
||||
| `af_sarah` | Female | American | Sarah |
|
||||
| `am_adam` | Male | American | Adam |
|
||||
| `am_michael` | Male | American | Michael |
|
||||
| `bf_emma` | Female | British | Emma |
|
||||
| `bf_isabella` | Female | British | Isabella |
|
||||
| `bm_george` | Male | British | George |
|
||||
| `bm_lewis` | Male | British | Lewis |
|
||||
|
||||
### Model Storage
|
||||
|
||||
Models are automatically downloaded on first use and cached:
|
||||
- **Linux/macOS**: `~/.cache/kokoro/`
|
||||
- **Windows**: `%USERPROFILE%\.cache\kokoro\`
|
||||
|
||||
First synthesis may take longer due to model download (~500MB).
|
||||
|
||||
## Project Structure
|
||||
|
||||
```
|
||||
backend/
|
||||
├── services/
|
||||
│ ├── __init__.py
|
||||
│ ├── role_detector.py # Role detection logic
|
||||
│ └── tts_service.py # TTS synthesis service
|
||||
├── main.py # FastAPI application & endpoints
|
||||
├── requirements.txt # Python dependencies
|
||||
├── Dockerfile # Docker image configuration
|
||||
├── docker-compose.yml # Docker Compose setup
|
||||
├── .env.example # Environment template
|
||||
├── .dockerignore # Docker ignore patterns
|
||||
├── test_api.py # API endpoint tests
|
||||
├── test_role_detection.py # Role detection tests
|
||||
├── test_tts_service.py # TTS service tests
|
||||
└── README.md # This file
|
||||
```
|
||||
|
||||
## Testing
|
||||
|
||||
### Run All Tests
|
||||
|
||||
```bash
|
||||
# Activate virtual environment
|
||||
source venv/bin/activate # macOS/Linux
|
||||
# or
|
||||
venv\Scripts\activate # Windows
|
||||
|
||||
# Run tests
|
||||
pytest test_*.py -v
|
||||
```
|
||||
|
||||
### Run Specific Tests
|
||||
|
||||
```bash
|
||||
# Test API endpoints
|
||||
pytest test_api.py -v
|
||||
|
||||
# Test role detection
|
||||
pytest test_role_detection.py -v
|
||||
|
||||
# Test TTS service
|
||||
pytest test_tts_service.py -v
|
||||
```
|
||||
|
||||
### Test Coverage
|
||||
|
||||
```bash
|
||||
pytest --cov=. --cov-report=html test_*.py
|
||||
```
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
### espeak-ng not found
|
||||
|
||||
**Error:** `OSError: espeak-ng not found`
|
||||
|
||||
**Solution:**
|
||||
```bash
|
||||
# Install espeak-ng
|
||||
brew install espeak-ng # macOS
|
||||
sudo apt-get install espeak-ng # Linux
|
||||
|
||||
# Verify
|
||||
espeak-ng --version
|
||||
```
|
||||
|
||||
### Module not found
|
||||
|
||||
**Error:** `ModuleNotFoundError: No module named 'kokoro'`
|
||||
|
||||
**Solution:**
|
||||
```bash
|
||||
source venv/bin/activate
|
||||
pip install -r requirements.txt
|
||||
```
|
||||
|
||||
### Port already in use
|
||||
|
||||
**Error:** `Address already in use`
|
||||
|
||||
**Solution:**
|
||||
```bash
|
||||
# Find process using port 8000
|
||||
lsof -i :8000 # macOS/Linux
|
||||
netstat -ano | findstr :8000 # Windows
|
||||
|
||||
# Use different port
|
||||
uvicorn main:app --port 8001
|
||||
```
|
||||
|
||||
### Model download fails
|
||||
|
||||
**Symptoms:** First synthesis times out
|
||||
|
||||
**Solution:**
|
||||
- Check internet connection
|
||||
- Check firewall settings
|
||||
- Manually trigger download:
|
||||
```bash
|
||||
python -c "from kokoro import KPipeline; KPipeline(lang_code='a')"
|
||||
```
|
||||
|
||||
### Out of memory
|
||||
|
||||
**Error:** Memory error during synthesis
|
||||
|
||||
**Solution:**
|
||||
- Reduce text length
|
||||
- Increase system RAM
|
||||
- For Docker: `docker run -m 4g ...`
|
||||
|
||||
## Performance Optimization
|
||||
|
||||
### Tips for Faster Synthesis
|
||||
|
||||
1. **Use cached pipelines**: The service caches KPipeline instances per language
|
||||
2. **Shorter texts**: Break very long texts into chapters
|
||||
3. **Multi-core CPU**: Synthesis benefits from multiple cores
|
||||
4. **SSD storage**: Faster model loading from SSD
|
||||
|
||||
### Monitoring
|
||||
|
||||
```bash
|
||||
# View logs
|
||||
docker-compose logs -f backend
|
||||
|
||||
# Monitor resource usage
|
||||
docker stats text-to-audiobook-backend
|
||||
|
||||
# Check health
|
||||
curl http://localhost:8000/api/health
|
||||
```
|
||||
|
||||
## Development
|
||||
|
||||
### Code Style
|
||||
|
||||
```bash
|
||||
# Format code
|
||||
black .
|
||||
|
||||
# Lint
|
||||
flake8 .
|
||||
|
||||
# Type checking
|
||||
mypy .
|
||||
```
|
||||
|
||||
### Adding New Voices
|
||||
|
||||
To add new Kokoro voices, update the voice validation in `main.py`:
|
||||
|
||||
```python
|
||||
SUPPORTED_VOICES = [
|
||||
"af_bella", "af_sarah", "am_adam", "am_michael",
|
||||
"bf_emma", "bf_isabella", "bm_george", "bm_lewis",
|
||||
# Add new voices here
|
||||
]
|
||||
```
|
||||
|
||||
### Adding New Languages
|
||||
|
||||
To add new languages, update the language validation in `main.py`:
|
||||
|
||||
```python
|
||||
SUPPORTED_LANGUAGES = ["a", "b", "f", "j"] # Add new codes
|
||||
```
|
||||
|
||||
## Security Considerations
|
||||
|
||||
- Input validation on all endpoints
|
||||
- Text length limits to prevent DoS
|
||||
- CORS configured for frontend origin
|
||||
- No sensitive data in logs
|
||||
- Rate limiting recommended for production
|
||||
|
||||
## Production Deployment
|
||||
|
||||
### Recommendations
|
||||
|
||||
1. **Use environment variables** for configuration
|
||||
2. **Enable HTTPS** with reverse proxy (nginx, Caddy)
|
||||
3. **Set up monitoring** (health checks, logs)
|
||||
4. **Configure rate limiting**
|
||||
5. **Use production ASGI server** (Uvicorn with workers)
|
||||
6. **Set resource limits** (memory, CPU)
|
||||
|
||||
### Production Command
|
||||
|
||||
```bash
|
||||
uvicorn main:app \
|
||||
--host 0.0.0.0 \
|
||||
--port 8000 \
|
||||
--workers 4 \
|
||||
--log-level info \
|
||||
--no-access-log
|
||||
```
|
||||
|
||||
## Additional Resources
|
||||
|
||||
- [Kokoro TTS GitHub](https://github.com/hexgrad/kokoro)
|
||||
- [FastAPI Documentation](https://fastapi.tiangolo.com/)
|
||||
- [Main Project README](../README.md)
|
||||
- [Design Document](../.kiro/specs/text-to-audiobook/design.md)
|
||||
|
||||
## License
|
||||
|
||||
MIT
|
||||
|
||||
Reference in New Issue
Block a user