✨ Added
- **Server TTS endpoint**: Added OpenAI-compatible `/v1/audio/speech` endpoint to the FastAPI server:
- `webscout/server/request_models.py` - Added `SpeechGenerationRequest` model with OpenAI-compatible fields
- `webscout/server/providers.py` - Added TTS provider discovery, caching, and resolution functions
- `webscout/server/routes.py` - Added `_register_tts_routes()` with POST `/v1/audio/speech` endpoint
- `webscout/server/server.py` - Added TTS provider initialization on server startup
- `webscout/server/config.py` - Added `tts_provider_map` and `default_tts_provider` configuration
- Supports multiple audio formats: mp3, opus, aac, flac, wav, pcm
- Supports both file download and streaming responses
- Automatic TTS provider discovery and model resolution
- **Client audio speech interface**: Added `client.audio.speech.create(...)` in `webscout/client.py` for TTS-backed speech generation with provider discovery, caching, failover, and `last_provider` tracking.
- **Client docs refresh**: Rewrote `docs/client.md` into a shorter guide that still covers chat, image, and audio usage plus the updated helper methods.
- **Cohere STT Provider**: Added new Cohere Multilingual ASR provider for speech-to-text transcription:
- `webscout/Provider/STT/cohere.py` - OpenAI Whisper API-compatible interface for Cohere's multilingual ASR
- Supports 14 languages: English, French, German, Spanish, Portuguese, Italian, Dutch, Polish, Greek, Arabic, Japanese, Korean, Chinese, Vietnamese
- Implements Gradio API two-step flow (POST for event_id → GET SSE stream for result)
- Supports both streaming and non-streaming transcription modes
- Handles audio file uploads via multipart/form-data
- No authentication required (public Hugging Face Space)
- Updated `webscout/Provider/STT/__init__.py` to export CohereSTT
- Updated Provider.md documentation
- **Faster Qwen3-TTS Provider**: Added new Faster Qwen3-TTS provider for text-to-speech synthesis:
- `webscout/Provider/TTS/faster_qwen3.py` - OpenAI TTS API-compatible interface for Faster Qwen3-TTS
- Supports 5 model variants: Base (0.6B, 1.7B), CustomVoice (0.6B, 1.7B), VoiceDesign (1.7B)
- Three generation modes: voice cloning, custom voice, voice design
- Streaming (SSE) and non-streaming generation modes
- Preset reference voices and custom reference audio upload
- Audio transcription support via nano-parakeet
- 6 languages: English, Chinese, French, German, Spanish, Auto
- No authentication required (public Hugging Face Space)
- Updated `webscout/Provider/TTS/__init__.py` to export FasterQwen3TTS
- Updated Provider.md documentation
🔧 Fixed
- **Client type checking**: Fixed `Attribute content may be missing` type errors in `webscout/client.py`:
- Added `TypeGuard` import and updated `_is_valid_chat_completion` to use proper type narrowing
- Fixed `ChatCompletionChunk` cast issues for streaming responses
- All type checks now pass with `uvx ty check`
- **ParlerTTS, QwenTTS, SherpaTTS**: Fixed `startswith` bytes vs string bug in SSE stream parsing:
- Added `isinstance(line, bytes)` check before calling `startswith()`
- Properly decode bytes to UTF-8 string before string operations
- Fixed `FailedToGenerateResponseError: startswith first arg must be bytes or a tuple of bytes, not str`
- All three providers now successfully generate audio files
- **FreeTTS**: Fixed audio download to follow HTTP redirects:
- Added `allow_redirects=True` to the audio download request
- The FreeTTS API returns redirect URLs for audio files that were not being followed
- Provider now successfully downloads and saves audio files
- **PocketTTS**: Fixed test configuration to use valid voice name (`alba` instead of invalid voice)
- **FasterQwen3TTS**: Fixed model loading to handle `already_loaded` status from API
- **TTS Provider Tests**: Added comprehensive test suite for all TTS providers:
- `tests/providers/test_all_tts_providers.py` - Instantiation and attribute tests
- `tests/providers/test_tts_audio_generation.py` - Actual audio generation tests
- Results improved from 4/12 to 8/12 working providers (67%)
🗑️ Removed
- **SpeechMaTTS**: Removed non-functional provider (HTTP 403 errors, service no longer accessible)
- Deleted `webscout/Provider/TTS/speechma.py`
- Removed from `webscout/Provider/TTS/__init__.py` exports
- Updated Provider.md documentation