-[](https://github.com/speechmatics/speechmatics-python-sdk/blob/master/LICENSE)
-[](https://www.python.org/)
+
+
+
+
+
-A collection of Python clients for Speechmatics APIs packaged as separate installable packages. These packages replace the old [speechmatics-python](https://pypi.org/project/speechmatics-python) package, which will be deprecated soon.
+
-Each client targets a specific Speechmatics API (e.g. real-time, batch transcription), making it easier to install only what you need and keep dependencies minimal.
+**Speechmatics Python SDK provides convenient access to enterprise-grade speech-to-text APIs from Python applications.**
-## Packages
+[](https://pypi.org/project/speechmatics-batch/)
+[](https://pypi.org/project/speechmatics-rt/)
+[](https://pypi.org/project/speechmatics-voice/)
+[](https://pypi.org/project/speechmatics-batch/)
+[](https://github.com/speechmatics/speechmatics-python-sdk/blob/main/LICENSE)
+[](https://github.com/speechmatics/speechmatics-python-sdk/actions/workflows/test.yaml)
-This repository contains the following packages:
-### Real-Time Client (`speechmatics-rt`)
+**Fully typed** with type definitions for all request params and response fields. **Modern Python** with async/await patterns, type hints, and context managers for production-ready code.
-A Python client for Speechmatics Real-Time API.
+**55+ Languages • Realtime & Batch • Custom vocabularies • Speaker diarization • Speaker ID**
+
+[Get API Key](https://portal.speechmatics.com/) • [Documentation](https://docs.speechmatics.com) • [Academy Examples](https://github.com/speechmatics/speechmatics-academy)
+
+
+
+
+### Installation
```bash
+# Choose the package for your use case:
+
+# Batch transcription
+pip install speechmatics-batch
+
+# Realtime streaming
pip install speechmatics-rt
+
+# Voice agents
+pip install speechmatics-voice
+
+# Text-to-speech
+pip install speechmatics-tts
```
-### Batch Client (`speechmatics-batch`)
+
+📦 Package Details • Click to see what's included in each package
+
+
+
+**[speechmatics-batch](./sdk/batch/README.md)** - Async batch transcription API
+- Upload audio files for processing
+- Get transcripts with timestamps, speakers, entities
+- Supports all audio intelligence features
+
+**[speechmatics-rt](./sdk/rt/README.md)** - Realtime WebSocket streaming
+- Stream audio for live transcription
+- Ultra-low latency (150ms p95)
+- Partial and final transcripts
-An async Python client for Speechmatics Batch API.
+**[speechmatics-voice](./sdk/voice/README.md)** - Voice agent SDK
+- Build conversational AI applications
+- Speaker diarization and turn detection
+- Optional ML-based smart turn: `pip install speechmatics-voice[smart]`
+
+**[speechmatics-tts](./sdk/tts/README.md)** - Text-to-speech
+- Convert text to natural-sounding speech
+- Multiple voices and languages
+- Streaming and batch modes
+
+
+
+### Setting Up Development Environment
```bash
-pip install speechmatics-batch
+git clone https://github.com/speechmatics/speechmatics-python-sdk.git
+cd speechmatics-python-sdk
+
+python -m venv .venv
+.venv\Scripts\activate
+# On Mac/Linux: source .venv/bin/activate
+
+# Install development dependencies for all SDKs
+make install-dev
+
+# Install pre-commit hooks
+pre-commit install
```
-### Voice Agent Client (`speechmatics-voice`)
+**Simple and Pythonic!** Get your API key at [portal.speechmatics.com](https://portal.speechmatics.com/)
+
+### Your First Transcription
+
+> [!NOTE]
+> All examples use `load_dotenv()` to load your API key from a `.env` file. Create a `.env` file with `SPEECHMATICS_API_KEY=your_key_here`.
+
+There are several different methods of generating your first transcription:
+
+- **Batch Transcription** - transcribe audio files
+- **Realtime Streaming** - live microphone transcription
+- **Text-to-Speech** - convert text to audio
+- **Voice Agent** - real-time transcription with speaker diarization and turn detection
+
+#### Batch Transcription
-A Voice Agent Python client for Speechmatics Real-Time API.
+Transcribe audio files:
+```python
+import asyncio
+import os
+from dotenv import load_dotenv
+from speechmatics.batch import AsyncClient
+
+load_dotenv()
+
+async def main():
+ client = AsyncClient(api_key=os.getenv("SPEECHMATICS_API_KEY"))
+ result = await client.transcribe("audio.wav")
+ print(result.transcript_text)
+ await client.close()
+
+asyncio.run(main())
+```
+
+**Installation:**
```bash
-# Standard installation
-pip install speechmatics-voice
+pip install speechmatics-batch python-dotenv
+```
+
+#### Realtime Streaming
+
+Live microphone transcription:
+
+```python
+import asyncio
+import os
+from dotenv import load_dotenv
+from speechmatics.rt import (
+ AsyncClient,
+ ServerMessageType,
+ TranscriptionConfig,
+ TranscriptResult,
+ AudioFormat,
+ AudioEncoding,
+ Microphone,
+)
+
+load_dotenv()
+
+CHUNK_SIZE = 4096
+
+async def main():
+ client = AsyncClient(api_key=os.getenv("SPEECHMATICS_API_KEY"))
+ mic = Microphone(sample_rate=16000, chunk_size=CHUNK_SIZE)
+
+ @client.on(ServerMessageType.ADD_TRANSCRIPT)
+ def on_final(message):
+ result = TranscriptResult.from_message(message)
+ if result.metadata.transcript:
+ print(f"[final]: {result.metadata.transcript}")
+
+ @client.on(ServerMessageType.ADD_PARTIAL_TRANSCRIPT)
+ def on_partial(message):
+ result = TranscriptResult.from_message(message)
+ if result.metadata.transcript:
+ print(f"[partial]: {result.metadata.transcript}")
+
+ mic.start()
+
+ try:
+ await client.start_session(
+ transcription_config=TranscriptionConfig(language="en", enable_partials=True),
+ audio_format=AudioFormat(encoding=AudioEncoding.PCM_S16LE, sample_rate=16000),
+ )
+ print("Speak now...")
+
+ while True:
+ await client.send_audio(await mic.read(CHUNK_SIZE))
+ finally:
+ mic.stop()
+ await client.close()
+
+
+asyncio.run(main())
+```
-# With SMART_TURN (ML-based turn detection)
-pip install speechmatics-voice[smart]
+**Installation:**
+```bash
+pip install speechmatics-rt python-dotenv pyaudio
```
-### TTS Client (`speechmatics-tts`)
+#### Text-to-Speech
+
+Convert text to audio:
+
+```python
+import asyncio
+import os
+from dotenv import load_dotenv
+from speechmatics.tts import AsyncClient, Voice, OutputFormat
+
+load_dotenv()
-An async Python client for Speechmatics TTS API.
+async def main():
+ client = AsyncClient(api_key=os.getenv("SPEECHMATICS_API_KEY"))
+ response = await client.generate(
+ text="Hello! Welcome to Speechmatics Text-to-Speech",
+ voice=Voice.SARAH,
+ output_format=OutputFormat.WAV_16000
+ )
+
+ audio_data = await response.read()
+ with open("output.wav", "wb") as f:
+ f.write(audio_data)
+ print("Audio saved to output.wav")
+
+ await client.close()
+
+asyncio.run(main())
+```
+
+**Installation:**
```bash
-pip install speechmatics-tts
+pip install speechmatics-tts python-dotenv
+```
+
+#### Voice Agent
+
+Real-time transcription with speaker diarization and turn detection:
+
+```python
+import asyncio
+import os
+from dotenv import load_dotenv
+from speechmatics.rt import Microphone
+from speechmatics.voice import VoiceAgentClient, VoiceAgentConfigPreset, AgentServerMessageType
+
+load_dotenv()
+
+async def main():
+ client = VoiceAgentClient(
+ api_key=os.getenv("SPEECHMATICS_API_KEY"),
+ config=VoiceAgentConfigPreset.load("adaptive")
+ )
+
+ @client.on(AgentServerMessageType.ADD_SEGMENT)
+ def on_segment(message):
+ for segment in message.get("segments", []):
+ print(f"[{segment.get('speaker_id', 'S1')}]: {segment.get('text', '')}")
+
+ @client.on(AgentServerMessageType.END_OF_TURN)
+ def on_turn_end(message):
+ print("[END OF TURN]")
+
+ mic = Microphone(sample_rate=16000, chunk_size=320)
+ mic.start()
+
+ try:
+ await client.connect()
+ print("Voice agent ready. Speak now...")
+
+ while True:
+ await client.send_audio(await mic.read(320))
+ finally:
+ mic.stop()
+ await client.disconnect()
+
+asyncio.run(main())
```
-## Development
-
-### Repository Structure
-
-```
-speechmatics-python-sdk/
-├── sdk/
-│ ├── batch/
-│ │ ├── pyproject.toml
-│ │ └── README.md
-│ │
-│ ├── rt/
-│ │ ├── pyproject.toml
-│ │ └── README.md
-│ │
-│ ├── voice/
-│ │ ├── pyproject.toml
-│ │ └── README.md
-│ │
-│ ├── tts/
-│ │ ├── pyproject.toml
-│ │ └── README.md
-│
-├── tests/
-│ ├── batch/
-│ ├── rt/
-│ ├── voice/
-│ └── tts/
-│
-├── examples/
-├── Makefile
-├── pyproject.toml
-└── LICENSE
+**Installation:**
+```bash
+pip install speechmatics-voice speechmatics-rt python-dotenv pyaudio
```
-### Setting Up Development Environment
+> [!TIP]
+> **Ready for more?** Explore 20+ working examples at **[Speechmatics Academy](https://github.com/speechmatics/speechmatics-academy)** — voice agents, integrations, use cases, and migration guides.
+
+---
+
+## 🏆 Why Speechmatics?
+
+### Built for Production
+
+- **99.9% Uptime SLA** - Enterprise-grade reliability
+- **SOC 2 Type II Certified** - Your data is secure
+- **Flexible Deployment** - SaaS, on-premises, or air-gapped
+
+### Accuracy That Matters
+
+When 1% WER improvement translates to millions in revenue, you need the best.
+| Metric | Speechmatics | Deepgram |
+|--------|--------------|----------|
+| **Word Error Rate (WER)** | **6.8%** | 16.5% |
+| **Languages Supported** | **55+** | 30+ |
+| **Custom dictionary** | **1,000 words** | 100 words |
+| **Speaker diarization** | **Included** | Extra charge |
+| **Realtime translation** | **30+ languages** | ❌ |
+| **Sentiment analysis** | ✅ | ❌ |
+| **On-premises** | ✅ | Limited |
+| **On-device** | ✅ | ❌ |
+| **Air-gapped deployment** | ✅ | ❌ |
+
+
+
+---
+
+## 🚀 Key Features
+
+### Realtime Transcription
+Stream audio and get instant transcriptions with ultra-low latency. Perfect for voice agents, live captioning, and conversational AI.
+
+
+Code example - Click to expand
+
+```python
+import asyncio
+import os
+from dotenv import load_dotenv
+from speechmatics.rt import Microphone
+from speechmatics.voice import VoiceAgentClient, VoiceAgentConfigPreset, AgentServerMessageType
+
+load_dotenv()
+
+async def main():
+ # Voice SDK with adaptive turn detection - optimised for conversational AI
+ client = VoiceAgentClient(
+ api_key=os.getenv("SPEECHMATICS_API_KEY"),
+ config=VoiceAgentConfigPreset.load("adaptive")
+ )
+
+ # Handle transcription segments with speaker labels
+ @client.on(AgentServerMessageType.ADD_SEGMENT)
+ def on_segment(message):
+ for segment in message.get("segments", []):
+ print(f"[{segment.get('speaker_id', 'S1')}]: {segment.get('text', '')}")
+
+ # Detect when speaker finishes their turn
+ @client.on(AgentServerMessageType.END_OF_TURN)
+ def on_turn_end(message):
+ print("[END OF TURN]")
+
+ mic = Microphone(sample_rate=16000, chunk_size=320)
+ mic.start()
+
+ try:
+ await client.connect()
+ print("Voice agent ready. Speak now...")
+
+ while True:
+ await client.send_audio(await mic.read(320))
+ finally:
+ mic.stop()
+ await client.disconnect()
+
+asyncio.run(main())
+```
+
+**Installation:**
```bash
-git clone https://github.com/speechmatics/speechmatics-python-sdk.git
-cd speechmatics-python-sdk
+pip install speechmatics-voice speechmatics-rt python-dotenv pyaudio
+```
-python -m venv .venv
-source .venv/bin/activate
+
-# Install development dependencies for SDKs
-make install-dev
+### Batch Transcription
+Upload audio files and get accurate transcripts with speaker labels, timestamps, and more.
+
+
+Code example - Click to expand
+
+```python
+import asyncio
+import os
+from dotenv import load_dotenv
+from speechmatics.batch import AsyncClient, TranscriptionConfig, FormatType
+
+load_dotenv()
+
+async def main():
+ client = AsyncClient(api_key=os.getenv("SPEECHMATICS_API_KEY"))
+
+ # Submit job with advanced features
+ job = await client.submit_job(
+ "example.wav",
+ transcription_config=TranscriptionConfig(
+ language="en",
+ diarization="speaker",
+ enable_entities=True,
+ punctuation_overrides={
+ "permitted_marks": [".", "?", "!"]
+ }
+ )
+ )
+
+ # Wait for completion
+ result = await client.wait_for_completion(job.id, format_type=FormatType.JSON)
+
+ # Access results
+ print(f"Transcript: {result.transcript_text}")
+
+ await client.close()
+
+asyncio.run(main())
+```
+
+**Installation:**
+```bash
+pip install speechmatics-batch python-dotenv
```
-On Windows:
+
+
+### Speaker Diarization
+Automatically detect and label different speakers in your audio.
+
+
+Code example - Click to expand
+
+```python
+import asyncio
+import os
+from dotenv import load_dotenv
+from speechmatics.batch import AsyncClient, TranscriptionConfig
+
+load_dotenv()
+
+async def main():
+ client = AsyncClient(api_key=os.getenv("SPEECHMATICS_API_KEY"))
+
+ job = await client.submit_job(
+ "example.wav",
+ transcription_config=TranscriptionConfig(
+ language="en",
+ diarization="speaker",
+ speaker_diarization_config={
+ "prefer_current_speaker": True
+ }
+ )
+ )
+ result = await client.wait_for_completion(job.id)
+
+ # Access full transcript with speaker labels
+ print(f"Full transcript:\n{result.transcript_text}\n")
+
+ # Access individual results with speaker information
+ for result_item in result.results:
+ if result_item.alternatives:
+ alt = result_item.alternatives[0]
+ speaker = alt.speaker or "Unknown"
+ content = alt.content
+ print(f"Speaker {speaker}: {content}")
+
+ await client.close()
+
+asyncio.run(main())
+```
+**Installation:**
```bash
-.venv\Scripts\activate
+pip install speechmatics-batch python-dotenv
```
-### Install pre-commit hooks
+
+
+### Custom Dictionary
+Add domain-specific terms, names, and acronyms for perfect accuracy.
+
+
+Code example - Click to expand
+
+```python
+import asyncio
+import os
+from dotenv import load_dotenv
+from speechmatics.rt import (
+ AsyncClient,
+ ServerMessageType,
+ TranscriptionConfig,
+ TranscriptResult,
+ AudioFormat,
+ AudioEncoding,
+ Microphone,
+ ConversationConfig,
+)
+
+load_dotenv()
+
+
+async def main():
+ api_key = os.getenv("SPEECHMATICS_API_KEY")
+ if not api_key:
+ print("Error: SPEECHMATICS_API_KEY not set")
+ return
+
+ transcript_parts = []
+
+ audio_format = AudioFormat(
+ encoding=AudioEncoding.PCM_S16LE,
+ chunk_size=4096,
+ sample_rate=16000,
+ )
+
+ transcription_config = TranscriptionConfig(
+ language="en",
+ enable_partials=True,
+ additional_vocab=[
+ {"content": "Speechmatics", "sounds_like": ["speech mat ics"]},
+ {"content": "API", "sounds_like": ["A P I", "A. P. I."]},
+ {"content": "kubernetes", "sounds_like": ["koo ber net ees"]},
+ {"content": "Anthropic", "sounds_like": ["an throp ik", "an throw pick"]},
+ {"content": "OAuth", "sounds_like": ["oh auth", "O auth", "O. Auth"]},
+ {"content": "PostgreSQL", "sounds_like": ["post gres Q L", "post gres sequel"]},
+ {"content": "Nginx", "sounds_like": ["engine X", "N jinx"]},
+ {"content": "GraphQL", "sounds_like": ["graph Q L", "graph quel"]},
+ ],
+ conversation_config=ConversationConfig(
+ end_of_utterance_silence_trigger=0.5, # seconds of silence to trigger end of utterance
+ ),
+ )
+
+ mic = Microphone(sample_rate=16000, chunk_size=4096)
+ if not mic.start():
+ print("PyAudio not installed")
+ return
+
+ client = AsyncClient(api_key=api_key)
+
+ @client.on(ServerMessageType.ADD_TRANSCRIPT)
+ def on_final(message):
+ result = TranscriptResult.from_message(message)
+ if result.metadata.transcript:
+ print(f"[final]: {result.metadata.transcript}")
+ transcript_parts.append(result.metadata.transcript)
+
+ @client.on(ServerMessageType.ADD_PARTIAL_TRANSCRIPT)
+ def on_partial(message):
+ result = TranscriptResult.from_message(message)
+ if result.metadata.transcript:
+ print(f"[partial]: {result.metadata.transcript}")
+ @client.on(ServerMessageType.END_OF_UTTERANCE)
+ def on_utterance_end(message):
+ print("[END OF UTTERANCE]\n")
+
+ try:
+ await client.start_session(
+ transcription_config=transcription_config,
+ audio_format=audio_format,
+ )
+ print("Speak now...")
+
+ while True:
+ await client.send_audio(await mic.read(4096))
+ except KeyboardInterrupt:
+ pass
+ finally:
+ mic.stop()
+ await client.close()
+ print(f"\nFull transcript: {' '.join(transcript_parts)}")
+
+
+asyncio.run(main())
+```
+
+**Installation:**
```bash
-pre-commit install
+pip install speechmatics-rt python-dotenv pyaudio
```
-## Installation
+
+
+### 55+ Languages
+Native models for major languages, not just multilingual Whisper.
-Each package can be installed separately:
+
+Code example - Click to expand
+
+```python
+import asyncio
+import os
+from dotenv import load_dotenv
+from speechmatics.batch import AsyncClient, TranscriptionConfig
+
+load_dotenv()
+
+async def main():
+ client = AsyncClient(api_key=os.getenv("SPEECHMATICS_API_KEY"))
+
+ # Automatic language detection
+ job = await client.submit_job(
+ "audio.wav",
+ transcription_config=TranscriptionConfig(language="auto")
+ )
+ result = await client.wait_for_completion(job.id)
+ print(f"Detected language transcript: {result.transcript_text}")
+
+ await client.close()
+
+asyncio.run(main())
+```
+**Installation:**
```bash
-pip install speechmatics-rt
-pip install speechmatics-batch
-pip install speechmatics-voice[smart]
-pip install speechmatics-tts
+pip install speechmatics-batch python-dotenv
+```
+
+
+
+### Audio Intelligence
+Get sentiment, topics, summaries, and chapters from your audio.
+
+
+Code example - Click to expand
+
+```python
+import asyncio
+import os
+from dotenv import load_dotenv
+from speechmatics.batch import (
+ AsyncClient,
+ JobConfig,
+ JobType,
+ TranscriptionConfig,
+ SentimentAnalysisConfig,
+ TopicDetectionConfig,
+ SummarizationConfig,
+ AutoChaptersConfig
+)
+
+load_dotenv()
+
+async def main():
+ client = AsyncClient(api_key=os.getenv("SPEECHMATICS_API_KEY"))
+
+ # Configure job with all audio intelligence features
+ config = JobConfig(
+ type=JobType.TRANSCRIPTION,
+ transcription_config=TranscriptionConfig(language="en"),
+ sentiment_analysis_config=SentimentAnalysisConfig(),
+ topic_detection_config=TopicDetectionConfig(),
+ summarization_config=SummarizationConfig(),
+ auto_chapters_config=AutoChaptersConfig()
+ )
+
+ job = await client.submit_job("example.wav", config=config)
+ result = await client.wait_for_completion(job.id)
+
+ # Access all results
+ print(f"Transcript: {result.transcript_text}")
+ if result.sentiment_analysis:
+ print(f"Sentiment: {result.sentiment_analysis}")
+ if result.topics:
+ print(f"Topics: {result.topics}")
+ if result.summary:
+ print(f"Summary: {result.summary}")
+ if result.chapters:
+ print(f"Chapters: {result.chapters}")
+
+ await client.close()
+
+asyncio.run(main())
+```
+
+**Installation:**
+```bash
+pip install speechmatics-batch python-dotenv
+```
+
+
+
+### Translation
+Transcribe and translate simultaneously to multiple languages.
+
+
+Code example - Click to expand
+
+```python
+import asyncio
+import os
+from dotenv import load_dotenv
+from speechmatics.batch import (
+ AsyncClient,
+ JobConfig,
+ JobType,
+ TranscriptionConfig,
+ TranslationConfig
+)
+
+load_dotenv()
+
+async def main():
+ client = AsyncClient(api_key=os.getenv("SPEECHMATICS_API_KEY"))
+
+ config = JobConfig(
+ type=JobType.TRANSCRIPTION,
+ transcription_config=TranscriptionConfig(language="en"),
+ translation_config=TranslationConfig(target_languages=["es", "fr", "de"])
+ )
+
+ job = await client.submit_job("sample.mp4", config=config)
+ result = await client.wait_for_completion(job.id)
+
+ # Access original transcript
+ print(f"Original (English): {result.transcript_text}\n")
+
+ # Access translations
+ if result.translations:
+ for lang_code, segments in result.translations.items():
+ translated_text = " ".join(seg.get("content", "") for seg in segments)
+ print(f"Translated ({lang_code}): {translated_text}")
+
+ await client.close()
+
+asyncio.run(main())
+```
+
+**Installation:**
+```bash
+pip install speechmatics-batch python-dotenv
+```
+
+
+
+---
+
+## 🔌 Framework Integrations
+
+For more integration examples including Django, Next.js, and production patterns, visit the [Speechmatics Academy](https://github.com/speechmatics/speechmatics-academy).
+
+### LiveKit Agents (Voice Assistants)
+
+Build real-time voice assistants with [LiveKit Agents](https://github.com/livekit/agents) - a framework for building voice AI applications with WebRTC.
+
+```python
+from dotenv import load_dotenv
+from livekit import agents
+from livekit.agents import AgentSession, Agent, RoomInputOptions
+from livekit.plugins import openai, silero, speechmatics, elevenlabs
+
+load_dotenv()
+
+
+class VoiceAssistant(Agent):
+ """Voice assistant agent with Speechmatics STT."""
+
+ def __init__(self) -> None:
+ super().__init__(instructions="You are a helpful voice assistant. Be concise and friendly.")
+
+
+async def entrypoint(ctx: agents.JobContext):
+ """
+ Main entrypoint for the voice assistant.
+
+ Pipeline: LiveKit Room - Speechmatics STT - OpenAI LLM - ElevenLabs TTS - LiveKit Room
+ """
+ await ctx.connect()
+
+ # Speech to text: Speechmatics with speaker diarization
+ stt = speechmatics.STT(
+ enable_diarization=True,
+ speaker_active_format="<{speaker_id}>{text}{speaker_id}>",
+ focus_speakers=["S1"],
+ )
+
+ # Language Model: OpenAI
+ llm = openai.LLM(model="gpt-4o-mini")
+
+ # Text-to-Speech: ElevenLabs
+ tts = elevenlabs.TTS(voice_id="21m00Tcm4TlvDq8ikWAM")
+
+ # Voice Activity Detection: Silero
+ vad = silero.VAD.load()
+
+ # Create and start Agent Session
+ session = AgentSession(stt=stt, llm=llm, tts=tts, vad=vad)
+ await session.start(
+ room=ctx.room,
+ agent=VoiceAssistant(),
+ room_input_options=RoomInputOptions(),
+ )
+
+ # Send initial greeting
+ await session.generate_reply(instructions="Say a short hello and ask how you can help.")
+
+
+if __name__ == "__main__":
+ agents.cli.run_app(agents.WorkerOptions(entrypoint_fnc=entrypoint))
+```
+
+**Installation:**
+```bash
+pip install livekit-agents livekit-plugins-speechmatics livekit-plugins-openai livekit-plugins-elevenlabs livekit-plugins-silero
+```
+
+**Key Features:**
+- Realtime WebRTC audio streaming
+- Speechmatics STT with speaker diarization
+- Configurable LLM and TTS providers
+- Voice Activity Detection (VAD)
+
+### Pipecat AI (Voice Agents)
+
+Build Realtime voice bots with [Pipecat](https://github.com/pipecat-ai/pipecat) - a framework for voice and multimodal conversational AI.
+
+```python
+import asyncio
+import os
+from dotenv import load_dotenv
+from pipecat.pipeline.pipeline import Pipeline
+from pipecat.pipeline.runner import PipelineRunner
+from pipecat.pipeline.task import PipelineTask
+from pipecat.services.openai.llm import OpenAILLMService, OpenAILLMContext
+from pipecat.services.speechmatics.stt import SpeechmaticsSTTService, Language
+from pipecat.services.speechmatics.tts import SpeechmaticsTTSService
+from pipecat.transports.local.audio import LocalAudioTransport
+
+load_dotenv()
+
+async def main():
+ # Configure Speechmatics STT with speaker diarization
+ stt = SpeechmaticsSTTService(
+ api_key=os.getenv("SPEECHMATICS_API_KEY"),
+ params=SpeechmaticsSTTService.InputParams(
+ language=Language.EN,
+ enable_partials=True,
+ enable_diarization=True,
+ speaker_active_format="@{speaker_id}: {text}"
+ )
+ )
+
+ # Configure Speechmatics TTS
+ tts = SpeechmaticsTTSService(
+ api_key=os.getenv("SPEECHMATICS_API_KEY"),
+ voice_id="sarah"
+ )
+
+ # Configure LLM (OpenAI, Anthropic, etc.)
+ llm = OpenAILLMService(
+ api_key=os.getenv("OPENAI_API_KEY"),
+ model="gpt-4o"
+ )
+
+ # Set up conversation context
+ context = OpenAILLMContext([
+ {"role": "system", "content": "You are a helpful AI assistant."}
+ ])
+ context_aggregator = llm.create_context_aggregator(context)
+
+ # Build pipeline: Audio Input -> STT -> LLM -> TTS -> Audio Output
+ transport = LocalAudioTransport()
+ pipeline = Pipeline([
+ transport.input(),
+ stt,
+ context_aggregator.user(),
+ llm,
+ tts,
+ transport.output(),
+ context_aggregator.assistant(),
+ ])
+
+ # Run the voice bot
+ runner = PipelineRunner()
+ task = PipelineTask(pipeline)
+
+ print("Voice bot ready! Speak into your microphone...")
+ await runner.run(task)
+
+asyncio.run(main())
+```
+
+**Installation:**
+```bash
+pip install pipecat-ai[speechmatics, openai] pyaudio
+```
+
+**Key Features:**
+- Real-time STT with speaker diarization
+- Natural-sounding TTS with multiple voices
+- Interruption handling (users can interrupt bot responses)
+- Works with any LLM provider (OpenAI, Anthropic, etc.)
+
+---
+
+## 📚 Documentation
+
+### Package Documentation
+
+Each SDK package includes detailed documentation:
+
+| Package | Documentation | Description |
+|---------|---------------|-------------|
+| **speechmatics-batch** | [README](./sdk/batch/README.md) • [Migration Guide](./sdk/batch/MIGRATION.md) | Async batch transcription |
+| **speechmatics-rt** | [README](./sdk/rt/README.md) • [Migration Guide](./sdk/rt/MIGRATION.md) | Realtime Streaming |
+| **speechmatics-voice** | [README](./sdk/voice/README.md) | Voice agent SDK |
+| **speechmatics-tts** | [README](./sdk/tts/README.md) | Text-to-speech |
+
+### Speechmatics Academy
+
+Comprehensive collection of working examples, integrations, and templates: [github.com/speechmatics/speechmatics-academy](https://github.com/speechmatics/speechmatics-academy)
+
+#### Fundamentals
+| Example | Description | Package |
+|---------|-------------|---------|
+| [Hello World](https://github.com/speechmatics/speechmatics-academy/tree/main/basics/01-hello-world) | Simplest transcription example | Batch |
+| [Batch vs Realtime](https://github.com/speechmatics/speechmatics-academy/tree/main/basics/02-batch-vs-realtime) | Learn the difference between API modes | Batch, RT |
+| [Configuration Guide](https://github.com/speechmatics/speechmatics-academy/tree/main/basics/03-configuration-guide) | Common configuration options | Batch |
+| [Audio Intelligence](https://github.com/speechmatics/speechmatics-academy/tree/main/basics/04-audio-intelligence) | Sentiment, topics, and summaries | Batch |
+| [Multilingual & Translation](https://github.com/speechmatics/speechmatics-academy/tree/main/basics/05-multilingual-translation) | 50+ languages and real-time translation | RT |
+| [Text-to-Speech](https://github.com/speechmatics/speechmatics-academy/tree/main/basics/06-text-to-speech) | Convert text to natural-sounding speech | TTS |
+| [Turn Detection](https://github.com/speechmatics/speechmatics-academy/tree/main/basics/07-turn-detection) | Silence-based turn detection | RT |
+| [Voice Agent Turn Detection](https://github.com/speechmatics/speechmatics-academy/tree/main/basics/08-voice-agent-turn-detection) | Smart turn detection with presets | Voice |
+| [Speaker ID & Focus](https://github.com/speechmatics/speechmatics-academy/tree/main/basics/09-voice-agent-speaker-id) | Speaker identification and focus control | Voice |
+| [Channel Diarization](https://github.com/speechmatics/speechmatics-academy/tree/main/basics/10-channel-diarization) | Multi-channel transcription | Voice, RT |
+
+#### Integrations
+| Integration | Example | Features |
+|-------------|---------|----------|
+| **LiveKit** | [Simple Voice Assistant](https://github.com/speechmatics/speechmatics-academy/tree/main/integrations/livekit/01-simple-voice-assistant) | WebRTC, VAD, diarization, LLM, TTS |
+| **LiveKit** | [Telephony with Twilio](https://github.com/speechmatics/speechmatics-academy/tree/main/integrations/livekit/02-telephony-twilio) | Phone calls via SIP, Krisp noise cancellation |
+| **Pipecat** | [Simple Voice Bot](https://github.com/speechmatics/speechmatics-academy/tree/main/integrations/pipecat/01-simple-voice-bot) | Local audio, VAD, LLM, TTS |
+| **Pipecat** | [Voice Bot (Web)](https://github.com/speechmatics/speechmatics-academy/tree/main/integrations/pipecat/02-simple-voice-bot-web) | Browser-based WebRTC |
+| **Twilio** | [Outbound Dialer](https://github.com/speechmatics/speechmatics-academy/tree/main/integrations/twilio/01-outbound-dialer) | Media Streams, ElevenLabs TTS |
+| **VAPI** | [Voice Assistant](https://github.com/speechmatics/speechmatics-academy/tree/main/integrations/vapi/01-voice-assistant) | Voice AI platform integration |
+
+#### Use Cases
+| Industry | Example | Features |
+|----------|---------|----------|
+| **Healthcare** | [Medical Transcription](https://github.com/speechmatics/speechmatics-academy/tree/main/use-cases/01-medical-transcription-realtime) | Realtime, custom medical vocabulary |
+| **Media** | [Video Captioning](https://github.com/speechmatics/speechmatics-academy/tree/main/use-cases/02-video-captioning) | SRT generation, batch processing |
+| **Contact Center** | [Call Analytics](https://github.com/speechmatics/speechmatics-academy/tree/main/use-cases/03-call-center-analytics) | Channel diarization, sentiment, topics |
+| **Business** | [AI Receptionist](https://github.com/speechmatics/speechmatics-academy/tree/main/use-cases/04-voice-agent-calendar) | LiveKit, Twilio SIP, Google Calendar |
+| **Seasonal** | [Santa Voice Agent](https://github.com/speechmatics/speechmatics-academy/tree/main/use-cases/05-santa-voice-agent) | LiveKit, Twilio SIP, ElevenLabs TTS, custom voice |
+
+#### Migration Guides
+| From | Guide | Status |
+|------|-------|--------|
+| **Deepgram** | [Migration Guide](https://github.com/speechmatics/speechmatics-academy/tree/main/guides/migration-guides/deepgram) | Available |
+
+### Official Documentation
+- [API Reference](https://docs.speechmatics.com/api-ref/) - Complete API documentation
+- [SDK Repository](https://github.com/speechmatics/speechmatics-python-sdk) - Python SDK source code
+- [Developer Portal](https://portal.speechmatics.com) - Get your API key
+
+---
+
+## 🔄 Migrating from speechmatics-python?
+
+The legacy `speechmatics-python` package has been deprecated. This new SDK offers:
+
+- **Cleaner API** - More Pythonic, better type hints
+- **More features** - Sentiment, translation, summarization
+- **Better docs** - Comprehensive examples and guides
+
+### Migration Guide
+
+**speechmatics-python:**
+```python
+from speechmatics.models import BatchTranscriptionConfig
+from speechmatics.batch_client import BatchClient
+
+with BatchClient("API_KEY") as client:
+ job_id = client.submit_job("audio.wav", BatchTranscriptionConfig("en"))
+ transcript = client.wait_for_completion(job_id, transcription_format='txt')
+ print(transcript)
+```
+
+**speechmatics-python-sdk:**
+```python
+import asyncio
+from speechmatics.batch import AsyncClient, TranscriptionConfig, FormatType
+
+async def main():
+ client = AsyncClient(api_key="API_KEY")
+
+ job = await client.submit_job(
+ "audio.wav",
+ transcription_config=TranscriptionConfig(language="en")
+ )
+ result = await client.wait_for_completion(job.id, format_type=FormatType.TXT)
+ print(result)
+
+ await client.close()
+
+asyncio.run(main())
+```
+
+**Full Migration Guides:** [Batch Migration Guide](https://github.com/speechmatics/speechmatics-python-sdk/blob/main/sdk/batch/MIGRATION.md) • [Realtime Migration Guide](https://github.com/speechmatics/speechmatics-python-sdk/blob/main/sdk/rt/MIGRATION.md)
+
+---
+
+## 💡 Use Cases
+
+
+### Healthcare & Medical
+HIPAA-compliant transcription for clinical notes, patient interviews, and telemedicine.
+
+```python
+import asyncio
+import os
+from dotenv import load_dotenv
+from speechmatics.batch import AsyncClient, TranscriptionConfig
+
+load_dotenv()
+
+async def main():
+ api_key = os.getenv("SPEECHMATICS_API_KEY")
+ client = AsyncClient(api_key=api_key)
+
+ # Use medical domain for better accuracy with clinical terminology
+ job = await client.submit_job(
+ "patient_interview.wav",
+ transcription_config=TranscriptionConfig(
+ language="en",
+ domain="medical",
+ additional_vocab=[
+ {"content": "hypertension"},
+ {"content": "metformin"},
+ {"content": "echocardiogram"},
+ {"content": "MRI", "sounds_like": ["M R I"]},
+ {"content": "CT scan", "sounds_like": ["C T scan"]}
+ ]
+ )
+ )
+
+ result = await client.wait_for_completion(job.id)
+ print(f"Transcript:\n{result.transcript_text}")
+
+ await client.close()
+
+asyncio.run(main())
+```
+
+**Installation:**
+```bash
+pip install speechmatics-batch python-dotenv
+```
+
+### Voice Agents & Conversational AI
+Build Alexa-like experiences with real-time transcription and speaker detection.
+
+```python
+import asyncio
+import os
+from dotenv import load_dotenv
+from speechmatics.rt import Microphone
+from speechmatics.voice import (
+ VoiceAgentClient,
+ VoiceAgentConfigPreset,
+ AgentServerMessageType,
+)
+
+load_dotenv()
+
+async def main():
+ api_key = os.getenv("SPEECHMATICS_API_KEY")
+
+ # Load a preset configuration (options: adaptive, scribe, captions, external, fast)
+ config = VoiceAgentConfigPreset.load("adaptive")
+
+ # Initialize microphone
+ mic = Microphone(sample_rate=16000, chunk_size=320)
+ if not mic.start():
+ print("PyAudio not available - install with: pip install pyaudio")
+ return
+
+ # Create voice agent client
+ client = VoiceAgentClient(api_key=api_key, config=config)
+
+ @client.on(AgentServerMessageType.ADD_SEGMENT)
+ def on_segment(message):
+ for segment in message.get("segments", []):
+ speaker_id = segment.get("speaker_id", "S1")
+ text = segment.get("text", "")
+ print(f"[{speaker_id}]: {text}")
+
+ @client.on(AgentServerMessageType.END_OF_TURN)
+ def on_turn_end(message):
+ print("[END OF TURN]")
+
+ try:
+ await client.connect()
+ print("Voice agent started. Speak into your microphone (Ctrl+C to stop)...")
+
+ while True:
+ audio_chunk = await mic.read(320)
+ await client.send_audio(audio_chunk)
+
+ except KeyboardInterrupt:
+ print("\nStopping...")
+ finally:
+ mic.stop()
+ await client.disconnect()
+
+asyncio.run(main())
+```
+
+**Installation:**
+```bash
+pip install speechmatics-voice speechmatics-rt python-dotenv pyaudio
+```
+
+
+📂 More Use Cases • Click to explore Call Center, Healthcare, Media & Entertainment, Education, and Meetings examples
+
+
+
+### Call Center Analytics
+Transcribe calls with speaker diarization, sentiment analysis, and topic detection.
+
+```python
+import asyncio
+import os
+from dotenv import load_dotenv
+from speechmatics.batch import (
+ AsyncClient,
+ JobConfig,
+ JobType,
+ TranscriptionConfig,
+ SummarizationConfig,
+ SentimentAnalysisConfig,
+ TopicDetectionConfig
+)
+
+load_dotenv()
+
+async def main():
+ api_key = os.getenv("SPEECHMATICS_API_KEY")
+ client = AsyncClient(api_key=api_key)
+
+ config = JobConfig(
+ type=JobType.TRANSCRIPTION,
+ transcription_config=TranscriptionConfig(
+ language="en",
+ diarization="speaker"
+ ),
+ sentiment_analysis_config=SentimentAnalysisConfig(),
+ topic_detection_config=TopicDetectionConfig(),
+ summarization_config=SummarizationConfig(
+ content_type="conversational",
+ summary_length="brief"
+ )
+ )
+
+ job = await client.submit_job("call_recording.wav", config=config)
+ result = await client.wait_for_completion(job.id)
+
+ print(f"Transcript:\n{result.transcript_text}\n")
+
+ if result.sentiment_analysis:
+ segments = result.sentiment_analysis.get("segments", [])
+ counts = {"positive": 0, "negative": 0, "neutral": 0}
+ for seg in segments:
+ sentiment = seg.get("sentiment", "").lower()
+ if sentiment in counts:
+ counts[sentiment] += 1
+ overall = max(counts, key=counts.get)
+ print(f"Sentiment: {overall.capitalize()}")
+ print(f"Breakdown: {counts['positive']} positive, {counts['neutral']} neutral, {counts['negative']} negative")
+
+ if result.topics and 'summary' in result.topics:
+ overall = result.topics['summary']['overall']
+ topics = [topic for topic, count in overall.items() if count > 0]
+ print(f"Topics: {', '.join(topics)}")
+
+ if result.summary:
+ print(f"Summary: {result.summary.get('content')}")
+
+ await client.close()
+
+asyncio.run(main())
```
-## Docs
+**Installation:**
+```bash
+pip install speechmatics-batch python-dotenv
+```
+
+### Media & Entertainment
+Add captions, create searchable archives, generate clips from keywords.
+
+```python
+import asyncio
+import os
+from dotenv import load_dotenv
+from speechmatics.batch import AsyncClient, TranscriptionConfig, FormatType
+
+load_dotenv()
+
+async def main():
+ api_key = os.getenv("SPEECHMATICS_API_KEY")
+ client = AsyncClient(api_key=api_key)
+
+ job = await client.submit_job(
+ "movie.mp4",
+ transcription_config=TranscriptionConfig(language="en")
+ )
+
+ # Get SRT captions
+ captions = await client.wait_for_completion(job.id, format_type=FormatType.SRT)
+
+ # Save captions
+ with open("movie.srt", "w", encoding="utf-8") as f:
+ f.write(captions)
+
+ print("Captions saved to movie.srt")
+
+ await client.close()
+
+asyncio.run(main())
+```
+
+**Installation:**
+```bash
+pip install speechmatics-batch python-dotenv
+```
+
+### Education & E-Learning
+Auto-generate lecture transcripts, searchable course content, and accessibility captions.
+
+```python
+import asyncio
+import os
+from dotenv import load_dotenv
+from speechmatics.batch import AsyncClient, TranscriptionConfig, FormatType
+
+load_dotenv()
+
+async def main():
+ api_key = os.getenv("SPEECHMATICS_API_KEY")
+ client = AsyncClient(api_key=api_key)
+
+ job = await client.submit_job(
+ "lecture_recording.wav",
+ transcription_config=TranscriptionConfig(
+ language="en",
+ diarization="speaker",
+ enable_entities=True
+ )
+ )
+
+ result = await client.wait_for_completion(job.id)
+
+ # Save transcript
+ with open("lecture_transcript.txt", "w", encoding="utf-8") as f:
+ f.write(result.transcript_text)
+
+ # Save SRT captions for accessibility
+ captions = await client.wait_for_completion(job.id, format_type=FormatType.SRT)
+ with open("lecture_captions.srt", "w", encoding="utf-8") as f:
+ f.write(captions)
+
+ print("Transcript and captions saved")
+
+ await client.close()
+
+asyncio.run(main())
+```
+
+**Installation:**
+```bash
+pip install speechmatics-batch python-dotenv
+```
+
+### Meetings
+Turn meetings into searchable, actionable summaries with action items and key decisions.
+
+```python
+import asyncio
+import os
+from dotenv import load_dotenv
+from speechmatics.batch import (
+ AsyncClient,
+ JobConfig,
+ JobType,
+ TranscriptionConfig,
+ SummarizationConfig,
+ AutoChaptersConfig
+)
+
+load_dotenv()
+
+async def main():
+ api_key = os.getenv("SPEECHMATICS_API_KEY")
+ client = AsyncClient(api_key=api_key)
+
+ config = JobConfig(
+ type=JobType.TRANSCRIPTION,
+ transcription_config=TranscriptionConfig(
+ language="en",
+ diarization="speaker"
+ ),
+ summarization_config=SummarizationConfig(),
+ auto_chapters_config=AutoChaptersConfig()
+ )
+
+ job = await client.submit_job("board_meeting.mp4", config=config)
+ result = await client.wait_for_completion(job.id)
+
+ print(f"Transcript:\n{result.transcript_text}\n")
+
+ if result.summary:
+ summary = result.summary.get('content', 'N/A')
+ print(f"Summary:\n{summary}\n")
+
+ if result.chapters:
+ print("Chapters:")
+ for i, chapter in enumerate(result.chapters, 1):
+ print(f"{i}. {chapter}")
+
+ await client.close()
+
+asyncio.run(main())
+```
+
+**Installation:**
+```bash
+pip install speechmatics-batch python-dotenv
+```
+
+
+
+---
+
+## Architecture
+
+### Realtime Flow
+
+```mermaid
+sequenceDiagram
+ participant App as Your App
+ participant SM as Speechmatics RT
+
+ App->>SM: Connect WebSocket (WSS)
+ App->>SM: StartRecognition (config, audio format)
+ SM->>App: RecognitionStarted
+
+ loop Stream Audio
+ App->>SM: Audio Chunks (binary)
+ SM->>App: AudioAdded (ack)
+ SM->>App: AddPartialTranscript (JSON)
+ SM->>App: AddTranscript (JSON, final)
+ end
+
+ App->>SM: EndOfStream
+ SM->>App: EndOfTranscript
+```
+
+### Batch Flow
+
+```mermaid
+sequenceDiagram
+ participant App as Your App
+ participant API as Batch API
+ participant Queue as Job Queue
+ participant Engine as Transcription Engine
+
+ App->>API: POST /jobs (upload audio)
+ API->>Queue: Enqueue job
+ API->>App: Return job_id
+
+ Queue->>Engine: Process audio
+ Engine->>Queue: Store results
+
+ loop Poll Status
+ App->>API: GET /jobs/{id}
+ API->>App: Status: running/done
+ end
+
+ App->>API: GET /jobs/{id}/transcript
+ API->>App: Return transcript (JSON/TXT/SRT)
+```
+
+---
+
+## Authentication
+
+> [!CAUTION]
+> **Security Best Practice**: Never hardcode API keys in your source code. Always use environment variables or secure secret management systems.
+
+### Environment Variable (Recommended)
+
+```bash
+export SPEECHMATICS_API_KEY="your_api_key_here"
+```
+
+```python
+import asyncio
+import os
+from dotenv import load_dotenv
+from speechmatics.batch import AsyncClient
+
+load_dotenv()
+
+async def main():
+ client = AsyncClient(api_key=os.getenv("SPEECHMATICS_API_KEY"))
+ # Use client here
+ # ...
+ await client.close()
+
+asyncio.run(main())
+```
+
+### JWT Token (Temporary Keys)
+
+> [!WARNING]
+> **Browser Security**: For browser-based transcription, always use temporary JWT tokens to avoid exposing your long-lived API key. Pass the token as a query parameter: `wss://eu2.rt.speechmatics.com/v2?jwt=`
+
+```python
+import asyncio
+from speechmatics.batch import AsyncClient, JWTAuth
+
+async def main():
+ # Generate temporary token (expires after ttl seconds)
+ auth = JWTAuth(api_key="your_api_key", ttl=3600)
+ client = AsyncClient(auth=auth)
+ # Use client here
+ # ...
+ await client.close()
+
+asyncio.run(main())
+```
+
+---
+
+## Advanced Configuration
+
+### Connection Settings
+
+```python
+import asyncio
+from speechmatics.rt import AsyncClient, ConnectionConfig
+
+async def main():
+ # Configure WebSocket connection parameters
+ conn_config = ConnectionConfig(
+ ping_timeout=60.0, # Timeout waiting for pong response (seconds)
+ ping_interval=20.0, # Interval for WebSocket ping frames (seconds)
+ open_timeout=30.0, # Timeout for establishing connection (seconds)
+ close_timeout=10.0 # Timeout for closing connection (seconds)
+ )
+
+ client = AsyncClient(
+ api_key="KEY",
+ url="wss://eu2.rt.speechmatics.com/v2",
+ conn_config=conn_config
+ )
+ # Use client here
+ # ...
+ await client.close()
+
+asyncio.run(main())
+```
+
+### Retry & Error Handling
+
+```python
+import asyncio
+from speechmatics.batch import AsyncClient, TranscriptionConfig
+from speechmatics.batch import BatchError, JobError, AuthenticationError
+from tenacity import retry, stop_after_attempt, wait_exponential
+
+@retry(
+ stop=stop_after_attempt(3),
+ wait=wait_exponential(multiplier=1, min=2, max=10)
+)
+async def transcribe_with_retry(audio_file):
+ client = AsyncClient(api_key="YOUR_API_KEY")
+ try:
+ job = await client.submit_job(
+ audio_file,
+ transcription_config=TranscriptionConfig(language="en")
+ )
+ return await client.wait_for_completion(job.id)
+ except AuthenticationError:
+ print("Authentication failed")
+ raise
+ except (BatchError, JobError) as e:
+ print(f"Transcription failed: {e}")
+ raise
+ finally:
+ await client.close()
+
+asyncio.run(transcribe_with_retry("audio.wav"))
+```
+
+### Custom HTTP Client (Batch)
+
+```python
+import asyncio
+from speechmatics.batch import AsyncClient, ConnectionConfig
+
+async def main():
+ # Configure HTTP connection settings for batch API
+ conn_config = ConnectionConfig(
+ connect_timeout=30.0, # Timeout for connection establishment
+ operation_timeout=300.0 # Default timeout for API operations
+ )
+
+ client = AsyncClient(
+ api_key="KEY",
+ conn_config=conn_config
+ )
+ # Use client here
+ # ...
+ await client.close()
+
+asyncio.run(main())
+```
+
+---
+
+## Deployment Options
+
+### Cloud (SaaS)
+Zero infrastructure - just sign up and start transcribing.
+
+```python
+import asyncio
+from speechmatics.batch import AsyncClient
+
+async def main():
+ client = AsyncClient(api_key="YOUR_API_KEY")
+ # Uses global SaaS endpoints automatically
+ await client.close()
+
+asyncio.run(main())
+```
+
+### Docker Container
+Run Speechmatics on your own hardware.
+
+```bash
+docker pull speechmatics/transcription-engine:latest
+docker run -p 9000:9000 speechmatics/transcription-engine
+```
+
+```python
+import asyncio
+from speechmatics.batch import AsyncClient
+
+async def main():
+ client = AsyncClient(
+ api_key="YOUR_LICENSE_KEY",
+ url="http://localhost:9000/v2"
+ )
+ # Use on-premises instance
+ await client.close()
+
+asyncio.run(main())
+```
+
+### Kubernetes
+Scale transcription with k8s orchestration.
+
+```bash
+# Install the sm-realtime chart
+helm upgrade --install speechmatics-realtime \
+ oci://speechmaticspublic.azurecr.io/sm-charts/sm-realtime \
+ --version 0.7.0 \
+ --set proxy.ingress.url="speechmatics.example.com"
+```
+
+[Full Deployment Guide →](https://docs.speechmatics.com/deployments/kubernetes/)
+
+---
+
+## 🧪 Testing Your Integration
+
+**The 5-Minute Test**: Can you install, authenticate, and run a successful transcription in under 5 minutes?
+
+```bash
+# 1. Install (30 seconds)
+pip install speechmatics-batch python-dotenv
+
+# 2. Set API key (30 seconds)
+export SPEECHMATICS_API_KEY="your_key_here"
+
+# 3. Run test (4 minutes)
+python3 << 'EOF'
+import asyncio
+import os
+from speechmatics.batch import AsyncClient, TranscriptionConfig, AuthenticationError
+from dotenv import load_dotenv
+
+load_dotenv()
+
+async def test():
+ api_key = os.getenv("SPEECHMATICS_API_KEY")
+
+ # Replace with your audio file path
+ audio_file = "your_audio_file.wav"
+
+ client = AsyncClient(api_key=api_key)
+ try:
+ print("Submitting transcription job...")
+ job = await client.submit_job(audio_file, transcription_config=TranscriptionConfig(language="en"))
+ print(f"Job submitted: {job.id}")
+
+ print("Waiting for completion...")
+ result = await client.wait_for_completion(job.id)
+
+ print(f"\nTranscript: {result.transcript_text}")
+ print("\nTest completed successfully!")
+
+ except AuthenticationError as e:
+ print(f"\nAuthentication Error: {e}")
+ finally:
+ await client.close()
+
+asyncio.run(test())
+EOF
+```
+
+If this fails, [open an issue](https://github.com/speechmatics/speechmatics-python-sdk/issues/new) - we prioritize developer experience.
+
+---
+
+## Community & Support
+
+### Get Help
+
+- **GitHub Discussions**: [Ask questions, share projects](https://github.com/speechmatics/speechmatics-python-sdk/discussions)
+- **Stack Overflow**: Tag with `speechmatics`
+- **Email Support**: devrel@speechmatics.com
+- **Status Page**: [status.speechmatics.com](https://status.speechmatics.com/)
+
+
+### Show Your Support
+
+Share what you built:
+- Tweet with [@Speechmatics](https://twitter.com/speechmatics)
+- Post in [Show & Tell](https://github.com/speechmatics/speechmatics-python-sdk/discussions/categories/show-and-tell)
+
+---
+
+## 📄 License
+
+This project is licensed under the MIT License - see the [LICENSE](https://github.com/speechmatics/speechmatics-python-sdk/blob/main/LICENSE) file for details.
+
+---
+
+## 🔗 Links
+
+- **Website**: [speechmatics.com](https://www.speechmatics.com)
+- **Documentation**: [docs.speechmatics.com](https://docs.speechmatics.com)
+- **Portal**: [portal.speechmatics.com](https://portal.speechmatics.com)
+- **Status Page**: [status.speechmatics.com](https://status.speechmatics.com/)
+- **Blog**: [speechmatics.com/blog](https://www.speechmatics.com/blog)
+- **GitHub**: [@speechmatics](https://github.com/speechmatics)
+
+---
+
+## 🎯 What's Next?
+
+1. **[Get your free API key →](https://portal.speechmatics.com/)**
+2. **[Try the quickstart ↑](#quick-start)**
+3. **[Explore examples →](https://github.com/speechmatics/speechmatics-academy)**
+4. **[Read the docs →](https://docs.speechmatics.com)**
+
+
+---
+
+
-The Speechmatics API and product documentation can be found at https://docs.speechmatics.com
+**Built with ❤️ by the Speechmatics Team**
-## License
+[Twitter](https://twitter.com/speechmatics) • [LinkedIn](https://linkedin.com/company/speechmatics) • [YouTube](https://youtube.com/@speechmatics)
-[MIT](LICENSE)
+
diff --git a/logo/speechmatics-dark-theme-logo.png b/logo/speechmatics-dark-theme-logo.png
new file mode 100644
index 0000000..402ed20
Binary files /dev/null and b/logo/speechmatics-dark-theme-logo.png differ
diff --git a/logo/speechmatics-light-theme-logo.png b/logo/speechmatics-light-theme-logo.png
new file mode 100644
index 0000000..13417a5
Binary files /dev/null and b/logo/speechmatics-light-theme-logo.png differ