Files

276 lines
5.9 KiB
Markdown

# Qwen3-TTS API - Quick Start Guide
Get the API and Gradio demo running in minutes!
## Prerequisites
- Python 3.9+
- CUDA 11.8+ (optional, for GPU acceleration)
- 8GB+ RAM (16GB+ recommended)
## Installation
### 1. Clone and Install
```bash
# Navigate to the repository
cd Qwen3-TTS-streaming
# Install the package with API dependencies
pip install -e .
# Or just the API extras:
pip install -e ".[api]"
```
### 2. Start the API and Demo
**Option A: Using the startup script (Recommended)**
```bash
python start_api.py
```
**Option B: Start services separately**
Terminal 1 - Start API:
```bash
python -m api.main
# or
uvicorn api.main:app --host 0.0.0.0 --port 8000
```
Terminal 2 - Start Gradio Demo:
```bash
python -m api.gradio_demo
```
### 3. Access the Services
- **Gradio Demo**: http://localhost:7860
- **API Server**: http://localhost:8000
- **API Documentation**: http://localhost:8000/docs
## Voice Cloning Setup (Optional)
To use voice cloning, place reference files in `assets/voice_cloning/`:
```bash
# Create reference files
mkdir -p assets/voice_cloning
# Copy or create your reference audio (must be WAV format)
cp your_voice.wav assets/voice_cloning/ref_audio.wav
# Create reference text file with the transcription
echo "Your reference text transcription here..." > assets/voice_cloning/ref_text.txt
```
The API will automatically load these files on startup.
## First Test
### Using the Gradio Demo (Easy)
1. Open http://localhost:7860 in your browser
2. Enter text to synthesize
3. Select language and options
4. Click "Generate Speech 🎵"
### Using cURL (Command Line)
```bash
curl -X POST "http://localhost:8000/v1/audio/speech" \
-H "Content-Type: application/json" \
-d '{
"text": "Hello, this is a test.",
"language": "English"
}'
```
### Using Python
```python
import requests
import base64
from io import BytesIO
import soundfile as sf
# Make request
response = requests.post(
"http://localhost:8000/v1/audio/speech",
json={
"text": "Hello, world!",
"language": "English"
}
)
# Decode and save audio
data = response.json()
audio_bytes = base64.b64decode(data["audio_base64"])
audio, sr = sf.read(BytesIO(audio_bytes))
sf.write("output.wav", audio, sr)
print(f"✅ Saved audio: {data['duration']:.2f}s at {sr} Hz")
```
## API Endpoints
### Health & Models
```
GET /v1/health # Check API status
GET /v1/models # List available models
```
### Text-to-Speech
```
POST /v1/audio/speech # Generate audio
POST /v1/audio/speech/stream # Stream audio (real-time)
```
## Streaming Audio
The streaming endpoint returns WAV frames with length prefixes for real-time audio:
```python
import requests
response = requests.post(
"http://localhost:8000/v1/audio/speech/stream",
json={
"text": "This is a streaming test.",
"language": "English",
"stream_options": {
"emit_every_frames": 8,
"decode_window_frames": 80,
"overlap_samples": 512
}
},
stream=True
)
# Process streaming chunks
for chunk in response.iter_content(chunk_size=65536):
# Parse: [frame_length: 4 bytes][frame_data: frame_length bytes]
frame_len = int.from_bytes(chunk[:4], byteorder='big')
frame_data = chunk[4:4 + frame_len]
# Play or process frame_data...
```
## Voice Cloning Usage
Once reference files are in `assets/voice_cloning/`:
```python
response = requests.post(
"http://localhost:8000/v1/audio/speech",
json={
"text": "New text in cloned voice",
"language": "English",
"voice_clone_mode": "reference_audio" # Enable voice cloning
}
)
```
## Supported Languages
- English
- Russian
- Chinese (Simplified)
- Japanese
- Korean
- Auto (automatic detection)
## Performance Tips
### GPU Usage
The API automatically uses CUDA if available:
- Monitor GPU: `nvidia-smi`
- Requires: CUDA 11.8+ and cuDNN
### Faster Streaming
Adjust streaming options:
```python
"stream_options": {
"emit_every_frames": 4, # Lower = faster first chunk
"decode_window_frames": 40, # Lower = faster, less quality
"overlap_samples": 512
}
```
### Lower Memory Usage
```bash
# Use CPU only
python start_api.py --device cpu
# Or manually in code (api/main.py):
model_state.device = "cpu"
```
## Troubleshooting
### API won't start
```
ModuleNotFoundError: No module named 'fastapi'
→ pip install fastapi uvicorn
```
### GPU out of memory
```
CUDA out of memory
→ Use CPU: python start_api.py --device cpu
→ Or reduce batch size/model size
```
### Voice cloning not working
```
→ Check files exist: assets/voice_cloning/ref_audio.wav
→ Check files exist: assets/voice_cloning/ref_text.txt
→ Ensure ref_text matches the audio content
→ Check API logs for error details
```
### Slow first response
```
→ First request loads model (~30-60 seconds)
→ Subsequent requests are fast (2-5 seconds)
→ Streaming gives first chunk in ~1-2 seconds
```
## Interactive Documentation
Visit `http://localhost:8000/docs` for:
- **Swagger UI**: Full API documentation with "Try it out"
- **ReDoc**: Alternative documentation view
- **API schema**: OpenAPI 3.0.2 specification
## Next Steps
1. **Integrate with your app**
- Use the Python client code above
- Or use any HTTP client in your language
2. **Deploy to production**
- Use Gunicorn: `gunicorn -w 4 api.main:app`
- Or Docker (guidelines in main API README)
3. **Customize the API**
- Edit `api/models.py` for request/response schemas
- Edit `api/main.py` for endpoint logic
- Add more models to `api/models.py` enum
## More Information
- **API Documentation**: See `api/README.md`
- **Voice Cloning Setup**: See `assets/voice_cloning/README.md`
- **Examples**: Check `examples/` directory
## Support
For issues or questions:
1. Check logs in the terminal
2. Visit `/docs` endpoint for API details
3. Review the comprehensive `api/README.md`
4. Check `assets/voice_cloning/README.md` for voice cloning issues
---
**Happy synthesizing! 🎵**