-
Notifications
You must be signed in to change notification settings - Fork 19
docs: add Telnyx integration page #106
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Merged
Merged
Changes from all commits
Commits
Show all changes
8 commits
Select commit
Hold shift + click to select a range
32afa78
docs: add Telnyx integration page
cshape ddad632
docs: use Telnyx logo mark as integration page icon
cshape 548892a
docs: use Telnyx brand green for integration icon
cshape e863c06
docs: make Pipecat sidebar icon visible in dark mode
cshape 3145935
docs: fix Telnyx snippets after live API testing
cshape b24f88d
docs: restore docs.json formatting, keep only nav addition
cshape 0466eec
chore: update OpenAPI schema
cshape 002c4f5
docs: address review — websockets prereq, explicit MP3 output in REST…
cshape File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,101 @@ | ||
| --- | ||
| title: "Telnyx" | ||
| description: "Use Fish Audio voices for real-time and in-call text-to-speech with Telnyx" | ||
| icon: "/images/telnyx-logo.svg" | ||
| --- | ||
|
|
||
| [Telnyx](https://telnyx.com) is a carrier-owned global communications platform providing infrastructure for real-time agents — voice AI, SIP trunking, programmable voice, and messaging. Fish Audio is available on Telnyx as a hosted text-to-speech provider: you synthesize Fish Audio voices directly through the Telnyx API and play them in live phone calls via Call Control and TeXML, with no Fish Audio API key required. | ||
|
Check warning on line 7 in developer-guide/integrations/telnyx.mdx
|
||
|
|
||
| ## Prerequisites | ||
|
|
||
| - A [Telnyx account](https://telnyx.com/sign-up) with an API key | ||
| - Python 3.9 or higher with `websockets` 14+ (`pip install websockets`) for the streaming example | ||
|
|
||
| ## Voices | ||
|
|
||
| Telnyx exposes a curated shortlist of voices from the [Fish Audio Voice Library](https://fish.audio/discovery) rather than accepting arbitrary voice IDs. Voices use the format `FishAudio.<Model>.<VoiceId>`, where the model is `s2.1-pro` (latest, default), `s2-pro`, or `s1`: | ||
|
|
||
| ```text | ||
| FishAudio.s2.1-pro.933563129e564b19a115bedd57b7406a | ||
| ``` | ||
|
|
||
| All curated voices are cross-lingual — any voice can speak any language present in the input text. On S2 models, you can also control delivery with inline emotion tags like `[happy]` or `[whispering]` — see [emotion control](/developer-guide/best-practices/emotion-control) for the full syntax. | ||
|
cshape marked this conversation as resolved.
|
||
|
|
||
| See the [Telnyx Fish Audio provider page](https://developers.telnyx.com/docs/voice/tts/providers/fishaudio) for the current voice roster, supported audio formats, and sample rates. | ||
|
|
||
| ## WebSocket streaming | ||
|
|
||
| Stream text in and receive base64-encoded audio chunks in real time: | ||
|
|
||
| ```python | ||
| import asyncio | ||
| import json | ||
| import base64 | ||
| import websockets | ||
|
|
||
| async def tts_stream(): | ||
| url = "wss://api.telnyx.com/v2/text-to-speech/speech?voice=FishAudio.s2.1-pro.933563129e564b19a115bedd57b7406a" | ||
| headers = {"Authorization": "Bearer YOUR_TELNYX_API_KEY"} | ||
|
|
||
| async with websockets.connect(url, additional_headers=headers) as ws: | ||
| # 1. Handshake | ||
| await ws.send(json.dumps({ | ||
| "text": " ", | ||
| "voice_settings": {"format": "mp3", "sample_rate": 44100} | ||
| })) | ||
|
|
||
| # 2. Send text | ||
| await ws.send(json.dumps({"text": "Hello from Fish Audio on Telnyx."})) | ||
|
|
||
| # 3. Signal end of input | ||
| await ws.send(json.dumps({"text": ""})) | ||
|
|
||
| # 4. Collect audio | ||
| audio_chunks = [] | ||
| async for message in ws: | ||
| data = json.loads(message) | ||
|
|
||
| if data.get("error"): | ||
| print(f"Error: {data['error']}") | ||
| break | ||
|
|
||
| if data.get("audio"): | ||
| audio_chunks.append(base64.b64decode(data["audio"])) | ||
|
|
||
| if data.get("isFinal"): | ||
| break | ||
|
|
||
| with open("output.mp3", "wb") as f: | ||
| for chunk in audio_chunks: | ||
| f.write(chunk) | ||
|
|
||
| asyncio.run(tts_stream()) | ||
| ``` | ||
|
|
||
| The handshake requests MP3 output via `voice_settings`; without it, audio is delivered as raw PCM at 24 kHz. | ||
|
|
||
| ## REST API | ||
|
|
||
| Synthesize a complete utterance with a single HTTP request: | ||
|
|
||
| ```bash | ||
| curl --request POST \ | ||
| --url https://api.telnyx.com/v2/text-to-speech/speech \ | ||
| --header 'Authorization: Bearer YOUR_TELNYX_API_KEY' \ | ||
| --header 'Content-Type: application/json' \ | ||
| --data '{ | ||
| "text": "Hello from Fish Audio on Telnyx.", | ||
| "voice": "FishAudio.s2.1-pro.933563129e564b19a115bedd57b7406a", | ||
| "voice_settings": {"format": "mp3", "sample_rate": 44100} | ||
| }' \ | ||
| --output output.mp3 | ||
| ``` | ||
|
|
||
| The response streams back audio bytes. Set `output_type` to `base64_output` or `audio_id` for JSON responses instead. | ||
|
coderabbitai[bot] marked this conversation as resolved.
|
||
|
|
||
| ## Resources | ||
|
|
||
| - [Telnyx Fish Audio provider reference](https://developers.telnyx.com/docs/voice/tts/providers/fishaudio) | ||
| - [Telnyx WebSocket streaming examples](https://developers.telnyx.com/docs/voice/tts/websocket-streaming/examples) | ||
| - [Telnyx REST API examples](https://developers.telnyx.com/docs/voice/tts/rest-api/examples) | ||
| - [Fish Audio Voice Library](https://fish.audio/discovery) | ||
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Uh oh!
There was an error while loading. Please reload this page.