Repository navigation
Conversation
Port of the internal Techmo plugin livekit-plugins-techmo-tts 0.3.2 as a `tts` module of this package, so one install provides both STT and TTS: `from livekit.plugins.techmo import STT, TTS` (the internal import path `livekit.plugins.techmo.tts` keeps working). - livekit/plugins/techmo/tts.py: logic unchanged (AST-identical to the source except below); logger is the plugin logger's `tts` child, user-agent is `livekit-plugins-techmo/<version>`, the missing-stubs hint points at the git URL (tts-api is not on PyPI) - tests: 100 TTS unit tests and the integration tests (skipped without TECHMO_TTS_ADDRESS), patch targets moved to the new module path - dependencies: tts-api 3.2.1 by git URL; livekit-agents>=1.2, because 1.0/1.1 lack tokenize.blingfire used for sentence splitting (70 tests fail on 1.1.7, all pass on 1.2.0) - CI: unit tests also run with livekit-agents 1.2.0 - README (ASR and TTS sections), KNOWN_ISSUES.md without internal tracker links, examples/voice_agent.py, CHANGELOG, Makefile Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
The internal plugin generated a UUID when session_id was not set, so every TTS instance sent a session_id header the caller never chose. tts-client-python sends no header without --session-id and lets the service assign the ID; the ASR plugin behaves the same way. TTS now does too: session_id defaults to None, an empty string counts as unset, and _build_metadata omits the header. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…wn voice The TTS API does not require a voice: SynthesisConfig is optional and an empty Voice.name is ignored in voice selection (tts-api docs). The plugin forced "michal" / "pl-PL" when nothing was given, overriding the voice a deployment is configured with. Checked on a live service: with an empty name it uses its default voice (same audio as a request with no synthesis_config), which is not "michal" there. - voice_name / language_code default to None (TECHMO_TTS_VOICE / TECHMO_TTS_LANGUAGE still apply; empty = unset) and are sent as empty strings; update_options(voice_name=None) goes back to the default - the service silently falls back to its default voice for an unknown (or wrongly cased) name, so prewarm() now checks voice_name against list_voices() and warns, suggesting case-insensitive matches; a failing check is only logged at debug level Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
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
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
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.
Summary
Adds Techmo TTS to the package, next to the existing ASR plugin:
The code is a port of the internal Techmo plugin
livekit-plugins-techmo-tts0.3.2, used so far alongside this package. It goes in as thelivekit/plugins/techmo/tts.pymodule of the singlelivekit-plugins-techmodistribution (the same layout as the official plugins, e.g.livekit.plugins.google.STT/.TTS). ASR users need no change, and the internal import pathfrom livekit.plugins.techmo.tts import TTSkeeps working.What TTS provides
TTS.stream(): sentence by sentence, noStreamAdapter) andTTS.synthesize()update_options(),list_voices(); withoutvoice_name/language_codethe service's configured defaults are used (the internal plugin forced"michal"/"pl-PL");prewarm()warns when the voice name is not offered by the service, since the service silently falls back to its default voice<mark/>markers asMarkerEvent(on_markercallback)prewarm(), reconnect on transientUNAVAILABLE; gRPC errors mapped toAPIConnectionError/APITimeoutError, so livekit-agents' retry logic appliessession_idsent assession_idgRPC metadata; not sent when unset (the internal plugin sent a random UUID). This matchestts-client-pythonwithout--session-idand the ASR pluginChanges
livekit/plugins/techmo/tts.pylivekit.plugins.techmo.ttsof the plugin logger), the user-agent (livekit-plugins-techmo/<version>) and the missing-stubs hint (git URL, sincetts-apiis not on PyPI). Long strings re-wrapped for the 120-column limit.livekit/plugins/techmo/__init__.pyTTS,TTSOptions,TechmoSynthesizeStream,MarkerEvent,VoiceInfopyproject.tomltts-api @ git+…@v3.2.1;livekit-agents>=1.2(was>=1.0); description, keywordstests/test_tts.py,tests/test_tts_integration.pyTECHMO_TTS_ADDRESS);patch()targets moved to the new module path.github/workflows/ci.ymlmin-depsjob: unit tests withlivekit-agents==1.2.0README.mdKNOWN_ISSUES.mdexamples/voice_agent.pyAgentSessionAPI)CHANGELOG.md,MakefileUnreleasedentry;make testskips integration tests, newmake test-integrationWhy
livekit-agents>=1.2TTS splits text into sentences with
tokenize.blingfire, which livekit-agents 1.0 and 1.1 don't have: on 1.1.7, 70 tests fail. On 1.2.0 all pass. The new CI job keeps that floor tested; the matrix jobs test the newest version.Dependencies
tts-api3.2.1 ships stubs generated with grpcio 1.70 / protobuf 5.29, the same floorstechmo-asr-apialready requires, sogrpcio>=1.70.0/protobuf>=5.29.0stay as they are. No file is shared betweentts-apiandtechmo-asr-api(checked against both RECORDs) and, unliketechmo-asr-api,tts-apidoes not install anything undergoogle/.Release
This PR also bumps the version to 0.4.0 (
pyproject.toml,version.py, CHANGELOG[0.4.0] - 2026-10-23), as was done for 0.2.0 in #1. After merge: tag0.4.0on the merge commit and create the GitHub release from the CHANGELOG section. If the merge slips by more than a day or two, update the date in CHANGELOG first.Verification
uv build: wheel containstts.py;Requires-Distincludestts-apiexamples/voice_agent.pyimports and constructsSTT/TTSon livekit-agents 1.2.0 and 1.8.8synthesis_config(the service default); an unknown name such asMASZAtriggers theprewarm()warning withMasza, maszaas suggestions. Synthesis also checked from testenv.Open points for review
session_id(underscore), ASR sendssession-id. Confirmed against the reference client:tts-client-pythonuses("session_id", …)and sends it only when--session-idis given (tts_client_python/general.py), so the keys stay as they are.examples/basic_stt.py(existing) still uses the pre-1.xVoicePipelineAgentAPI, which livekit-agents 1.x no longer has. Not changed here.LICENSE, but the repository has noLICENSEfile. Not changed here.🤖 Generated with Claude Code