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:
635
README.md
635
README.md
@@ -17,91 +17,638 @@ A full-stack application that converts long-form text into multi-voice audiobook
|
||||
- **Backend**: Python + FastAPI + Kokoro TTS
|
||||
- **Deployment**: Docker containerization
|
||||
|
||||
## Table of Contents
|
||||
|
||||
- [Quick Start](#quick-start)
|
||||
- [Kokoro Model Setup](#kokoro-model-setup)
|
||||
- [Backend Setup](#backend-setup)
|
||||
- [Local Development](#local-development)
|
||||
- [Docker Deployment](#docker-deployment)
|
||||
- [Frontend Setup](#frontend-setup)
|
||||
- [Usage Workflow](#usage-workflow)
|
||||
- [Testing the Application](#testing-the-application)
|
||||
- [Troubleshooting](#troubleshooting)
|
||||
- [Project Structure](#project-structure)
|
||||
- [API Documentation](#api-documentation)
|
||||
|
||||
## Quick Start
|
||||
|
||||
The fastest way to get started is using Docker:
|
||||
|
||||
```bash
|
||||
# 1. Start the backend
|
||||
cd backend
|
||||
docker-compose up -d
|
||||
|
||||
# 2. Start the frontend (in a new terminal)
|
||||
cd frontend
|
||||
npm install
|
||||
npm run dev
|
||||
|
||||
# 3. Open http://localhost:5173 in your browser
|
||||
```
|
||||
|
||||
## Kokoro Model Setup
|
||||
|
||||
The Kokoro TTS model (hexgrad/Kokoro-82M) is automatically downloaded when you first run the backend. The model files are cached by the `kokoro` Python library.
|
||||
|
||||
### Model Configuration
|
||||
|
||||
**Supported Languages:**
|
||||
- `a` - American English
|
||||
- `b` - British English
|
||||
- `f` - French
|
||||
- `j` - Japanese
|
||||
|
||||
**Available Voices:**
|
||||
- `af_bella` - Bella (Female, American)
|
||||
- `af_sarah` - Sarah (Female, American)
|
||||
- `am_adam` - Adam (Male, American)
|
||||
- `am_michael` - Michael (Male, American)
|
||||
- `bf_emma` - Emma (Female, British)
|
||||
- `bf_isabella` - Isabella (Female, British)
|
||||
- `bm_george` - George (Male, British)
|
||||
- `bm_lewis` - Lewis (Male, British)
|
||||
|
||||
### Model Storage
|
||||
|
||||
The Kokoro library automatically downloads and caches model files in:
|
||||
- **Linux/macOS**: `~/.cache/kokoro/`
|
||||
- **Windows**: `%USERPROFILE%\.cache\kokoro\`
|
||||
|
||||
The first synthesis request will trigger model download (~500MB). Subsequent requests will use the cached model.
|
||||
|
||||
## Backend Setup
|
||||
|
||||
### Prerequisites
|
||||
|
||||
- Python 3.10+
|
||||
- Node.js 20.19+ or 22.12+
|
||||
- espeak-ng (system dependency)
|
||||
- Python 3.10 or higher
|
||||
- espeak-ng (system dependency for grapheme-to-phoneme conversion)
|
||||
- Docker (optional, for containerized deployment)
|
||||
|
||||
### Backend Setup
|
||||
### Local Development
|
||||
|
||||
1. Install espeak-ng:
|
||||
#### 1. Install espeak-ng
|
||||
|
||||
**macOS:**
|
||||
```bash
|
||||
# macOS
|
||||
brew install espeak-ng
|
||||
```
|
||||
|
||||
# Linux (Ubuntu/Debian)
|
||||
**Linux (Ubuntu/Debian):**
|
||||
```bash
|
||||
sudo apt-get update
|
||||
sudo apt-get install espeak-ng
|
||||
```
|
||||
|
||||
2. Set up Python environment:
|
||||
**Linux (Fedora/RHEL):**
|
||||
```bash
|
||||
sudo dnf install espeak-ng
|
||||
```
|
||||
|
||||
**Windows:**
|
||||
Download and install from [espeak-ng releases](https://github.com/espeak-ng/espeak-ng/releases)
|
||||
|
||||
#### 2. Set up Python environment
|
||||
|
||||
```bash
|
||||
cd backend
|
||||
|
||||
# Create virtual environment
|
||||
python -m venv venv
|
||||
source venv/bin/activate # On Windows: venv\Scripts\activate
|
||||
|
||||
# Activate virtual environment
|
||||
# macOS/Linux:
|
||||
source venv/bin/activate
|
||||
# Windows:
|
||||
venv\Scripts\activate
|
||||
|
||||
# Install dependencies
|
||||
pip install -r requirements.txt
|
||||
```
|
||||
|
||||
3. Run the backend:
|
||||
```bash
|
||||
uvicorn main:app --reload --host 0.0.0.0 --port 8000
|
||||
```
|
||||
#### 3. Configure environment variables
|
||||
|
||||
### Frontend Setup
|
||||
|
||||
1. Install dependencies:
|
||||
```bash
|
||||
cd frontend
|
||||
npm install
|
||||
```
|
||||
|
||||
2. Configure environment:
|
||||
```bash
|
||||
cp .env.example .env
|
||||
```
|
||||
|
||||
3. Run the frontend:
|
||||
Edit `.env` if needed:
|
||||
```bash
|
||||
PORT=8000
|
||||
LOG_LEVEL=info
|
||||
```
|
||||
|
||||
#### 4. Run the backend server
|
||||
|
||||
```bash
|
||||
uvicorn main:app --reload --host 0.0.0.0 --port 8000
|
||||
```
|
||||
|
||||
The API will be available at:
|
||||
- **API Base**: http://localhost:8000
|
||||
- **API Docs**: http://localhost:8000/docs
|
||||
- **Health Check**: http://localhost:8000/api/health
|
||||
|
||||
### Docker Deployment
|
||||
|
||||
#### Option 1: Using Docker Compose (Recommended)
|
||||
|
||||
```bash
|
||||
cd backend
|
||||
|
||||
# Build and start the container
|
||||
docker-compose up -d
|
||||
|
||||
# View logs
|
||||
docker-compose logs -f
|
||||
|
||||
# Stop the container
|
||||
docker-compose down
|
||||
```
|
||||
|
||||
#### Option 2: Using Docker directly
|
||||
|
||||
```bash
|
||||
cd backend
|
||||
|
||||
# Build the image
|
||||
docker build -t text-to-audiobook-backend .
|
||||
|
||||
# Run the 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 the container
|
||||
docker stop text-to-audiobook-backend
|
||||
docker rm text-to-audiobook-backend
|
||||
```
|
||||
|
||||
#### Docker Configuration
|
||||
|
||||
The Docker setup includes:
|
||||
- Python 3.10 slim base image
|
||||
- Automatic installation of espeak-ng
|
||||
- Health check endpoint monitoring
|
||||
- Automatic restart on failure
|
||||
- Volume mounting for development (optional)
|
||||
|
||||
**Resource Requirements:**
|
||||
- **Memory**: Minimum 2GB RAM (4GB recommended)
|
||||
- **Storage**: ~500MB for Kokoro models
|
||||
- **CPU**: Multi-core recommended for faster synthesis
|
||||
|
||||
## Frontend Setup
|
||||
|
||||
### Prerequisites
|
||||
|
||||
- Node.js 20.19+ or 22.12+
|
||||
- npm or yarn
|
||||
|
||||
### Installation
|
||||
|
||||
```bash
|
||||
cd frontend
|
||||
|
||||
# Install dependencies
|
||||
npm install
|
||||
|
||||
# Create environment file
|
||||
cp .env.example .env
|
||||
```
|
||||
|
||||
### Configuration
|
||||
|
||||
Edit `frontend/.env`:
|
||||
```bash
|
||||
VITE_API_BASE_URL=http://localhost:8000
|
||||
```
|
||||
|
||||
For production, update this to your backend URL.
|
||||
|
||||
### Development
|
||||
|
||||
```bash
|
||||
npm run dev
|
||||
```
|
||||
|
||||
4. Open http://localhost:5173 in your browser
|
||||
The application will be available at http://localhost:5173
|
||||
|
||||
## Usage
|
||||
### Production Build
|
||||
|
||||
1. **Enter Text**: Paste your text with role markers (e.g., "Alice:", "[Narrator]")
|
||||
2. **Assign Voices**: Select a Kokoro voice for each detected role
|
||||
3. **Configure**: Choose language and playback speed
|
||||
4. **Generate**: Create your multi-voice audiobook
|
||||
5. **Listen & Download**: Play or save the generated audio
|
||||
```bash
|
||||
# Build for production
|
||||
npm run build
|
||||
|
||||
# Preview production build
|
||||
npm run preview
|
||||
```
|
||||
|
||||
The built files will be in `frontend/dist/` and can be served by any static file server.
|
||||
|
||||
## Usage Workflow
|
||||
|
||||
### 1. Enter Text
|
||||
|
||||
Paste your text into the text area. Use role markers to identify different speakers:
|
||||
|
||||
**Colon Pattern:**
|
||||
```
|
||||
Narrator: Once upon a time, in a land far away...
|
||||
Alice: Hello! How are you today?
|
||||
Bob: I'm doing great, thanks for asking!
|
||||
```
|
||||
|
||||
**Bracket Pattern:**
|
||||
```
|
||||
[Narrator] The story begins on a cold winter morning.
|
||||
[Alice] I can't believe it's snowing again!
|
||||
[Bob] I know, it's beautiful though.
|
||||
```
|
||||
|
||||
**Mixed Patterns:**
|
||||
```
|
||||
Narrator: The two friends met at the park.
|
||||
Alice: [excitedly] Did you hear the news?
|
||||
Bob: No, what happened?
|
||||
```
|
||||
|
||||
### 2. Assign Voices
|
||||
|
||||
- The system automatically detects roles from your text
|
||||
- Select a voice for each detected role from the dropdown
|
||||
- Choose the language (American English, British English, French, or Japanese)
|
||||
- Adjust playback speed (0.5x to 1.5x)
|
||||
|
||||
### 3. Generate Audiobook
|
||||
|
||||
- Click "Generate Audiobook" (enabled when all roles have voices)
|
||||
- Wait for synthesis to complete (may take several minutes for long texts)
|
||||
- Progress indicator shows generation status
|
||||
|
||||
### 4. Listen & Download
|
||||
|
||||
- Use the audio player to listen to your audiobook
|
||||
- Click "Download audiobook" to save the file
|
||||
- File is saved as `audiobook.wav`
|
||||
|
||||
## Testing the Application
|
||||
|
||||
### 1. Health Check
|
||||
|
||||
Verify the backend is running:
|
||||
```bash
|
||||
curl http://localhost:8000/api/health
|
||||
# Expected: {"status":"ok"}
|
||||
```
|
||||
|
||||
### 2. Role Detection Test
|
||||
|
||||
Test role detection with sample text:
|
||||
```bash
|
||||
curl -X POST http://localhost:8000/api/tts/roles \
|
||||
-H "Content-Type: application/json" \
|
||||
-d '{"text":"Alice: Hello there!\nBob: Hi Alice!"}'
|
||||
```
|
||||
|
||||
Expected response:
|
||||
```json
|
||||
{
|
||||
"roles": [
|
||||
{"id": "Alice", "label": "Alice"},
|
||||
{"id": "Bob", "label": "Bob"}
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
### 3. End-to-End Workflow Test
|
||||
|
||||
1. Open http://localhost:5173
|
||||
2. Enter sample text:
|
||||
```
|
||||
Narrator: This is a test of the audiobook system.
|
||||
Alice: Hello, this is Alice speaking.
|
||||
Bob: And this is Bob.
|
||||
```
|
||||
3. Click "Next: Assign voices"
|
||||
4. Assign different voices to each role
|
||||
5. Click "Generate Audiobook"
|
||||
6. Verify audio plays correctly
|
||||
7. Test download functionality
|
||||
|
||||
### 4. Test Different Languages
|
||||
|
||||
Try generating audiobooks in different languages:
|
||||
- **American English**: Default, works with all `af_*` and `am_*` voices
|
||||
- **British English**: Use with `bf_*` and `bm_*` voices
|
||||
- **French**: Test with French text
|
||||
- **Japanese**: Test with Japanese text
|
||||
|
||||
### 5. Test Edge Cases
|
||||
|
||||
- **Empty text**: Should show validation error
|
||||
- **No role markers**: Should detect single "Narrator" role
|
||||
- **Very long text**: Should show warning message
|
||||
- **Special characters**: Should handle gracefully
|
||||
|
||||
### Running Automated Tests
|
||||
|
||||
**Backend Tests:**
|
||||
```bash
|
||||
cd backend
|
||||
source venv/bin/activate # Activate virtual environment
|
||||
pytest test_*.py -v
|
||||
```
|
||||
|
||||
**Frontend Tests:**
|
||||
```bash
|
||||
cd frontend
|
||||
npm test
|
||||
```
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
### Backend Issues
|
||||
|
||||
#### Issue: "espeak-ng not found"
|
||||
|
||||
**Solution:**
|
||||
```bash
|
||||
# macOS
|
||||
brew install espeak-ng
|
||||
|
||||
# Linux
|
||||
sudo apt-get install espeak-ng
|
||||
|
||||
# Verify installation
|
||||
espeak-ng --version
|
||||
```
|
||||
|
||||
#### Issue: "Module 'kokoro' not found"
|
||||
|
||||
**Solution:**
|
||||
```bash
|
||||
cd backend
|
||||
source venv/bin/activate
|
||||
pip install -r requirements.txt
|
||||
```
|
||||
|
||||
#### Issue: "Model download fails"
|
||||
|
||||
**Symptoms:** First synthesis request times out or fails
|
||||
|
||||
**Solution:**
|
||||
- Ensure stable internet connection
|
||||
- Check firewall settings
|
||||
- Manually download models:
|
||||
```bash
|
||||
python -c "from kokoro import KPipeline; KPipeline(lang_code='a')"
|
||||
```
|
||||
- Check disk space (~500MB required)
|
||||
|
||||
#### Issue: "Out of memory during synthesis"
|
||||
|
||||
**Solution:**
|
||||
- Reduce text length (split into smaller chunks)
|
||||
- Increase Docker memory limit:
|
||||
```bash
|
||||
docker run -m 4g ... # Allocate 4GB RAM
|
||||
```
|
||||
- Close other applications
|
||||
|
||||
#### Issue: "Port 8000 already in use"
|
||||
|
||||
**Solution:**
|
||||
```bash
|
||||
# Find process using port 8000
|
||||
lsof -i :8000 # macOS/Linux
|
||||
netstat -ano | findstr :8000 # Windows
|
||||
|
||||
# Kill the process or use different port
|
||||
uvicorn main:app --port 8001
|
||||
```
|
||||
|
||||
### Frontend Issues
|
||||
|
||||
#### Issue: "Cannot connect to backend"
|
||||
|
||||
**Solution:**
|
||||
1. Verify backend is running: `curl http://localhost:8000/api/health`
|
||||
2. Check `VITE_API_BASE_URL` in `frontend/.env`
|
||||
3. Check CORS settings in backend
|
||||
4. Verify no firewall blocking
|
||||
|
||||
#### Issue: "Audio won't play"
|
||||
|
||||
**Solution:**
|
||||
- Check browser console for errors
|
||||
- Verify audio format is supported (WAV should work in all browsers)
|
||||
- Try different browser
|
||||
- Check browser audio permissions
|
||||
|
||||
#### Issue: "Download doesn't work"
|
||||
|
||||
**Solution:**
|
||||
- Check browser download settings
|
||||
- Verify popup blocker isn't blocking download
|
||||
- Check browser console for errors
|
||||
- Try right-click → "Save As" on audio player
|
||||
|
||||
### Docker Issues
|
||||
|
||||
#### Issue: "Docker build fails"
|
||||
|
||||
**Solution:**
|
||||
```bash
|
||||
# Clear Docker cache
|
||||
docker system prune -a
|
||||
|
||||
# Rebuild without cache
|
||||
docker-compose build --no-cache
|
||||
```
|
||||
|
||||
#### Issue: "Container exits immediately"
|
||||
|
||||
**Solution:**
|
||||
```bash
|
||||
# Check logs
|
||||
docker-compose logs backend
|
||||
|
||||
# Common causes:
|
||||
# - Missing dependencies
|
||||
# - Port conflict
|
||||
# - Syntax errors in code
|
||||
```
|
||||
|
||||
#### Issue: "Health check failing"
|
||||
|
||||
**Solution:**
|
||||
```bash
|
||||
# Check if service is actually running
|
||||
docker exec -it text-to-audiobook-backend curl http://localhost:8000/api/health
|
||||
|
||||
# Check logs for startup errors
|
||||
docker-compose logs backend
|
||||
```
|
||||
|
||||
### Performance Issues
|
||||
|
||||
#### Issue: "Generation is very slow"
|
||||
|
||||
**Causes & Solutions:**
|
||||
- **Long text**: Split into smaller sections
|
||||
- **First run**: Model download takes time (one-time)
|
||||
- **Limited CPU**: Use faster machine or reduce text length
|
||||
- **Docker on macOS**: Docker Desktop has performance overhead
|
||||
|
||||
#### Issue: "High memory usage"
|
||||
|
||||
**Solution:**
|
||||
- Restart backend service to clear cache
|
||||
- Process shorter texts
|
||||
- Increase system RAM
|
||||
- Monitor with: `docker stats` (Docker) or `top`/`htop` (local)
|
||||
|
||||
### Common Error Messages
|
||||
|
||||
| Error | Cause | Solution |
|
||||
|-------|-------|----------|
|
||||
| `ValidationError: Missing required field` | Invalid API request | Check request format matches API spec |
|
||||
| `Language code 'x' not supported` | Invalid language code | Use: a, b, f, or j |
|
||||
| `Voice ID 'x' not found` | Invalid voice ID | Check available voices list |
|
||||
| `Text is required` | Empty text submitted | Enter text before proceeding |
|
||||
| `CORS error` | Frontend can't reach backend | Check CORS settings and URLs |
|
||||
|
||||
### Getting Help
|
||||
|
||||
If you encounter issues not covered here:
|
||||
|
||||
1. Check the logs:
|
||||
- Backend: `docker-compose logs backend` or console output
|
||||
- Frontend: Browser developer console (F12)
|
||||
|
||||
2. Verify versions:
|
||||
```bash
|
||||
python --version # Should be 3.10+
|
||||
node --version # Should be 20.19+ or 22.12+
|
||||
espeak-ng --version
|
||||
```
|
||||
|
||||
3. Check the [GitHub Issues](https://github.com/yourusername/text-to-audiobook/issues)
|
||||
|
||||
4. Review the design document: `.kiro/specs/text-to-audiobook/design.md`
|
||||
|
||||
## Project Structure
|
||||
|
||||
```
|
||||
.
|
||||
├── backend/ # FastAPI backend
|
||||
│ ├── main.py # API endpoints
|
||||
│ ├── services/ # Business logic
|
||||
│ ├── requirements.txt # Python dependencies
|
||||
│ └── README.md
|
||||
├── frontend/ # React frontend
|
||||
├── backend/ # FastAPI backend
|
||||
│ ├── services/
|
||||
│ │ ├── role_detector.py # Role detection logic
|
||||
│ │ └── tts_service.py # TTS synthesis logic
|
||||
│ ├── main.py # API endpoints
|
||||
│ ├── requirements.txt # Python dependencies
|
||||
│ ├── Dockerfile # Docker configuration
|
||||
│ ├── docker-compose.yml # Docker Compose setup
|
||||
│ ├── .env.example # Environment template
|
||||
│ ├── test_*.py # Test files
|
||||
│ └── README.md # Backend documentation
|
||||
├── frontend/ # React frontend
|
||||
│ ├── src/
|
||||
│ │ ├── api/ # API client
|
||||
│ │ ├── components/ # React components
|
||||
│ │ └── App.tsx # Main app
|
||||
│ ├── package.json
|
||||
│ └── README.md
|
||||
└── README.md # This file
|
||||
│ │ ├── api/
|
||||
│ │ │ └── tts.ts # API client
|
||||
│ │ ├── components/
|
||||
│ │ │ ├── TextInputSection.tsx
|
||||
│ │ │ ├── VoiceAssignmentSection.tsx
|
||||
│ │ │ └── AudioPlayerSection.tsx
|
||||
│ │ ├── App.tsx # Main application
|
||||
│ │ ├── main.tsx # Entry point
|
||||
│ │ └── index.css # Global styles
|
||||
│ ├── package.json # Node dependencies
|
||||
│ ├── vite.config.ts # Vite configuration
|
||||
│ ├── .env.example # Environment template
|
||||
│ └── README.md # Frontend documentation
|
||||
├── .kiro/specs/ # Specification documents
|
||||
│ └── text-to-audiobook/
|
||||
│ ├── requirements.md # Requirements
|
||||
│ ├── design.md # Design document
|
||||
│ └── tasks.md # Implementation tasks
|
||||
└── README.md # This file
|
||||
```
|
||||
|
||||
## Documentation
|
||||
## API Documentation
|
||||
|
||||
### Endpoints
|
||||
|
||||
#### GET /api/health
|
||||
Health check endpoint.
|
||||
|
||||
**Response:**
|
||||
```json
|
||||
{
|
||||
"status": "ok"
|
||||
}
|
||||
```
|
||||
|
||||
#### POST /api/tts/roles
|
||||
Detect roles in text.
|
||||
|
||||
**Request:**
|
||||
```json
|
||||
{
|
||||
"text": "Alice: Hello!\nBob: Hi there!"
|
||||
}
|
||||
```
|
||||
|
||||
**Response:**
|
||||
```json
|
||||
{
|
||||
"roles": [
|
||||
{"id": "Alice", "label": "Alice"},
|
||||
{"id": "Bob", "label": "Bob"}
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
#### POST /api/tts
|
||||
Generate audiobook.
|
||||
|
||||
**Request:**
|
||||
```json
|
||||
{
|
||||
"text": "Alice: Hello!\nBob: Hi there!",
|
||||
"lang": "a",
|
||||
"roles": [
|
||||
{"id": "Alice", "voice": "af_bella"},
|
||||
{"id": "Bob", "voice": "am_adam"}
|
||||
],
|
||||
"speed": 1.0
|
||||
}
|
||||
```
|
||||
|
||||
**Response:**
|
||||
- Content-Type: `audio/wav`
|
||||
- Content-Disposition: `attachment; filename="audiobook.wav"`
|
||||
- Body: Audio file bytes
|
||||
|
||||
### Interactive API Documentation
|
||||
|
||||
Visit http://localhost:8000/docs for interactive Swagger UI documentation.
|
||||
|
||||
## Additional Resources
|
||||
|
||||
- [Backend Documentation](./backend/README.md)
|
||||
- [Frontend Documentation](./frontend/README.md)
|
||||
- [Requirements](./.kiro/specs/text-to-audiobook/requirements.md)
|
||||
- [Requirements Document](./.kiro/specs/text-to-audiobook/requirements.md)
|
||||
- [Design Document](./.kiro/specs/text-to-audiobook/design.md)
|
||||
- [Kokoro TTS Library](https://github.com/hexgrad/kokoro)
|
||||
|
||||
## License
|
||||
|
||||
|
||||
Reference in New Issue
Block a user