livekit-plugins-elevenlabs 0.8.0__tar.gz → 1.0.0.dev4__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (18) hide show
  1. livekit_plugins_elevenlabs-1.0.0.dev4/.gitignore +168 -0
  2. {livekit_plugins_elevenlabs-0.8.0 → livekit_plugins_elevenlabs-1.0.0.dev4}/PKG-INFO +10 -20
  3. {livekit_plugins_elevenlabs-0.8.0 → livekit_plugins_elevenlabs-1.0.0.dev4}/livekit/plugins/elevenlabs/tts.py +19 -24
  4. {livekit_plugins_elevenlabs-0.8.0 → livekit_plugins_elevenlabs-1.0.0.dev4}/livekit/plugins/elevenlabs/version.py +1 -1
  5. livekit_plugins_elevenlabs-1.0.0.dev4/pyproject.toml +39 -0
  6. livekit_plugins_elevenlabs-0.8.0/livekit_plugins_elevenlabs.egg-info/PKG-INFO +0 -46
  7. livekit_plugins_elevenlabs-0.8.0/livekit_plugins_elevenlabs.egg-info/SOURCES.txt +0 -14
  8. livekit_plugins_elevenlabs-0.8.0/livekit_plugins_elevenlabs.egg-info/dependency_links.txt +0 -1
  9. livekit_plugins_elevenlabs-0.8.0/livekit_plugins_elevenlabs.egg-info/requires.txt +0 -1
  10. livekit_plugins_elevenlabs-0.8.0/livekit_plugins_elevenlabs.egg-info/top_level.txt +0 -1
  11. livekit_plugins_elevenlabs-0.8.0/pyproject.toml +0 -3
  12. livekit_plugins_elevenlabs-0.8.0/setup.cfg +0 -4
  13. livekit_plugins_elevenlabs-0.8.0/setup.py +0 -59
  14. {livekit_plugins_elevenlabs-0.8.0 → livekit_plugins_elevenlabs-1.0.0.dev4}/README.md +0 -0
  15. {livekit_plugins_elevenlabs-0.8.0 → livekit_plugins_elevenlabs-1.0.0.dev4}/livekit/plugins/elevenlabs/__init__.py +0 -0
  16. {livekit_plugins_elevenlabs-0.8.0 → livekit_plugins_elevenlabs-1.0.0.dev4}/livekit/plugins/elevenlabs/log.py +0 -0
  17. {livekit_plugins_elevenlabs-0.8.0 → livekit_plugins_elevenlabs-1.0.0.dev4}/livekit/plugins/elevenlabs/models.py +0 -0
  18. {livekit_plugins_elevenlabs-0.8.0 → livekit_plugins_elevenlabs-1.0.0.dev4}/livekit/plugins/elevenlabs/py.typed +0 -0
@@ -0,0 +1,168 @@
1
+ **/.vscode
2
+ **/.DS_Store
3
+
4
+ # Byte-compiled / optimized / DLL files
5
+ __pycache__/
6
+ *.py[cod]
7
+ *$py.class
8
+
9
+ # C extensions
10
+ *.so
11
+
12
+ # Distribution / packaging
13
+ .Python
14
+ build/
15
+ develop-eggs/
16
+ dist/
17
+ downloads/
18
+ eggs/
19
+ .eggs/
20
+ lib/
21
+ lib64/
22
+ parts/
23
+ sdist/
24
+ var/
25
+ wheels/
26
+ share/python-wheels/
27
+ *.egg-info/
28
+ .installed.cfg
29
+ *.egg
30
+ MANIFEST
31
+
32
+ # PyInstaller
33
+ # Usually these files are written by a python script from a template
34
+ # before PyInstaller builds the exe, so as to inject date/other infos into it.
35
+ *.manifest
36
+ *.spec
37
+
38
+ # Installer logs
39
+ pip-log.txt
40
+ pip-delete-this-directory.txt
41
+
42
+ # Unit test / coverage reports
43
+ htmlcov/
44
+ .tox/
45
+ .nox/
46
+ .coverage
47
+ .coverage.*
48
+ .cache
49
+ nosetests.xml
50
+ coverage.xml
51
+ *.cover
52
+ *.py,cover
53
+ .hypothesis/
54
+ .pytest_cache/
55
+ cover/
56
+
57
+ # Translations
58
+ *.mo
59
+ *.pot
60
+
61
+ # Django stuff:
62
+ *.log
63
+ local_settings.py
64
+ db.sqlite3
65
+ db.sqlite3-journal
66
+
67
+ # Flask stuff:
68
+ instance/
69
+ .webassets-cache
70
+
71
+ # Scrapy stuff:
72
+ .scrapy
73
+
74
+ # Sphinx documentation
75
+ docs/_build/
76
+
77
+ # PyBuilder
78
+ .pybuilder/
79
+ target/
80
+
81
+ # Jupyter Notebook
82
+ .ipynb_checkpoints
83
+
84
+ # IPython
85
+ profile_default/
86
+ ipython_config.py
87
+
88
+ # pyenv
89
+ # For a library or package, you might want to ignore these files since the code is
90
+ # intended to run in multiple environments; otherwise, check them in:
91
+ # .python-version
92
+
93
+ # pipenv
94
+ # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
95
+ # However, in case of collaboration, if having platform-specific dependencies or dependencies
96
+ # having no cross-platform support, pipenv may install dependencies that don't work, or not
97
+ # install all needed dependencies.
98
+ #Pipfile.lock
99
+
100
+ # poetry
101
+ # Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control.
102
+ # This is especially recommended for binary packages to ensure reproducibility, and is more
103
+ # commonly ignored for libraries.
104
+ # https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control
105
+ #poetry.lock
106
+
107
+ # pdm
108
+ # Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control.
109
+ #pdm.lock
110
+ # pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it
111
+ # in version control.
112
+ # https://pdm.fming.dev/#use-with-ide
113
+ .pdm.toml
114
+
115
+ # PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm
116
+ __pypackages__/
117
+
118
+ # Celery stuff
119
+ celerybeat-schedule
120
+ celerybeat.pid
121
+
122
+ # SageMath parsed files
123
+ *.sage.py
124
+
125
+ # Environments
126
+ .env
127
+ .venv
128
+ env/
129
+ venv/
130
+ ENV/
131
+ env.bak/
132
+ venv.bak/
133
+
134
+ # Spyder project settings
135
+ .spyderproject
136
+ .spyproject
137
+
138
+ # Rope project settings
139
+ .ropeproject
140
+
141
+ # mkdocs documentation
142
+ /site
143
+
144
+ # mypy
145
+ .mypy_cache/
146
+ .dmypy.json
147
+ dmypy.json
148
+
149
+ # Pyre type checker
150
+ .pyre/
151
+
152
+ # pytype static type analyzer
153
+ .pytype/
154
+
155
+ # Cython debug symbols
156
+ cython_debug/
157
+
158
+ # PyCharm
159
+ # JetBrains specific template is maintained in a separate JetBrains.gitignore that can
160
+ # be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore
161
+ # and can be added to the global gitignore or merged into this file. For a more nuclear
162
+ # option (not recommended) you can uncomment the following to ignore the entire idea folder.
163
+ .idea/
164
+
165
+ node_modules
166
+
167
+ credentials.json
168
+ pyrightconfig.json
@@ -1,35 +1,25 @@
1
- Metadata-Version: 2.2
1
+ Metadata-Version: 2.4
2
2
  Name: livekit-plugins-elevenlabs
3
- Version: 0.8.0
3
+ Version: 1.0.0.dev4
4
4
  Summary: Agent Framework plugin for voice synthesis with ElevenLabs' API.
5
- Home-page: https://github.com/livekit/agents
6
- License: Apache-2.0
7
5
  Project-URL: Documentation, https://docs.livekit.io
8
6
  Project-URL: Website, https://livekit.io/
9
7
  Project-URL: Source, https://github.com/livekit/agents
10
- Keywords: webrtc,realtime,audio,video,livekit,elevenlabs
8
+ Author-email: LiveKit <support@livekit.io>
9
+ License-Expression: Apache-2.0
10
+ Keywords: audio,elevenlabs,livekit,realtime,video,webrtc
11
11
  Classifier: Intended Audience :: Developers
12
12
  Classifier: License :: OSI Approved :: Apache Software License
13
- Classifier: Topic :: Multimedia :: Sound/Audio
14
- Classifier: Topic :: Multimedia :: Video
15
- Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
16
13
  Classifier: Programming Language :: Python :: 3
14
+ Classifier: Programming Language :: Python :: 3 :: Only
17
15
  Classifier: Programming Language :: Python :: 3.9
18
16
  Classifier: Programming Language :: Python :: 3.10
19
- Classifier: Programming Language :: Python :: 3 :: Only
17
+ Classifier: Topic :: Multimedia :: Sound/Audio
18
+ Classifier: Topic :: Multimedia :: Video
19
+ Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
20
20
  Requires-Python: >=3.9.0
21
+ Requires-Dist: livekit-agents>=1.0.0.dev4
21
22
  Description-Content-Type: text/markdown
22
- Requires-Dist: livekit-agents[codecs]<1.0.0,>=0.12.16
23
- Dynamic: classifier
24
- Dynamic: description
25
- Dynamic: description-content-type
26
- Dynamic: home-page
27
- Dynamic: keywords
28
- Dynamic: license
29
- Dynamic: project-url
30
- Dynamic: requires-dist
31
- Dynamic: requires-python
32
- Dynamic: summary
33
23
 
34
24
  # LiveKit Plugins Elevenlabs
35
25
 
@@ -21,9 +21,10 @@ import json
21
21
  import os
22
22
  import weakref
23
23
  from dataclasses import dataclass
24
- from typing import Any, List, Optional
24
+ from typing import Any
25
25
 
26
26
  import aiohttp
27
+
27
28
  from livekit.agents import (
28
29
  APIConnectionError,
29
30
  APIConnectOptions,
@@ -106,9 +107,9 @@ class TTS(tts.TTS):
106
107
  base_url: str | None = None,
107
108
  streaming_latency: int = 0,
108
109
  inactivity_timeout: int = WS_INACTIVITY_TIMEOUT,
109
- word_tokenizer: Optional[tokenize.WordTokenizer] = None,
110
+ word_tokenizer: tokenize.WordTokenizer | None = None,
110
111
  enable_ssml_parsing: bool = False,
111
- chunk_length_schedule: list[int] = [80, 120, 200, 260], # range is [50, 500]
112
+ chunk_length_schedule: list[int] = None, # range is [50, 500]
112
113
  http_session: aiohttp.ClientSession | None = None,
113
114
  # deprecated
114
115
  model_id: TTSModels | str | None = None,
@@ -131,6 +132,8 @@ class TTS(tts.TTS):
131
132
  language (str | None): Language code for the TTS model, as of 10/24/24 only valid for "eleven_turbo_v2_5". Optional.
132
133
  """
133
134
 
135
+ if chunk_length_schedule is None:
136
+ chunk_length_schedule = [80, 120, 200, 260]
134
137
  super().__init__(
135
138
  capabilities=tts.TTSCapabilities(
136
139
  streaming=True,
@@ -201,7 +204,7 @@ class TTS(tts.TTS):
201
204
  def prewarm(self) -> None:
202
205
  self._pool.prewarm()
203
206
 
204
- async def list_voices(self) -> List[Voice]:
207
+ async def list_voices(self) -> list[Voice]:
205
208
  async with self._ensure_session().get(
206
209
  f"{self._opts.base_url}/voices",
207
210
  headers={AUTHORIZATION_HEADER: self._opts.api_key},
@@ -229,8 +232,8 @@ class TTS(tts.TTS):
229
232
  self,
230
233
  text: str,
231
234
  *,
232
- conn_options: Optional[APIConnectOptions] = None,
233
- ) -> "ChunkedStream":
235
+ conn_options: APIConnectOptions | None = None,
236
+ ) -> ChunkedStream:
234
237
  return ChunkedStream(
235
238
  tts=self,
236
239
  input_text=text,
@@ -239,9 +242,7 @@ class TTS(tts.TTS):
239
242
  session=self._ensure_session(),
240
243
  )
241
244
 
242
- def stream(
243
- self, *, conn_options: Optional[APIConnectOptions] = None
244
- ) -> "SynthesizeStream":
245
+ def stream(self, *, conn_options: APIConnectOptions | None = None) -> SynthesizeStream:
245
246
  stream = SynthesizeStream(tts=self, pool=self._pool, opts=self._opts)
246
247
  self._streams.add(stream)
247
248
  return stream
@@ -263,7 +264,7 @@ class ChunkedStream(tts.ChunkedStream):
263
264
  tts: TTS,
264
265
  input_text: str,
265
266
  opts: _TTSOptions,
266
- conn_options: Optional[APIConnectOptions] = None,
267
+ conn_options: APIConnectOptions | None = None,
267
268
  session: aiohttp.ClientSession,
268
269
  ) -> None:
269
270
  super().__init__(tts=tts, input_text=input_text, conn_options=conn_options)
@@ -407,17 +408,13 @@ class SynthesizeStream(tts.SynthesizeStream):
407
408
  )
408
409
 
409
410
  # 11labs protocol expects the first message to be an "init msg"
410
- init_pkt = dict(
411
- text=" ",
412
- voice_settings=_strip_nones(
413
- dataclasses.asdict(self._opts.voice.settings)
414
- )
411
+ init_pkt = {
412
+ "text": " ",
413
+ "voice_settings": _strip_nones(dataclasses.asdict(self._opts.voice.settings))
415
414
  if self._opts.voice.settings
416
415
  else None,
417
- generation_config=dict(
418
- chunk_length_schedule=self._opts.chunk_length_schedule
419
- ),
420
- )
416
+ "generation_config": {"chunk_length_schedule": self._opts.chunk_length_schedule},
417
+ }
421
418
  await ws_conn.send_str(json.dumps(init_pkt))
422
419
 
423
420
  @utils.log_exceptions(logger=logger)
@@ -440,7 +437,7 @@ class SynthesizeStream(tts.SynthesizeStream):
440
437
  else:
441
438
  continue
442
439
 
443
- data_pkt = dict(text=f"{text} ") # must always end with a space
440
+ data_pkt = {"text": f"{text} "} # must always end with a space
444
441
  self._mark_started()
445
442
  await ws_conn.send_str(json.dumps(data_pkt))
446
443
  if xml_content:
@@ -487,9 +484,7 @@ class SynthesizeStream(tts.SynthesizeStream):
487
484
  decoder.push(b64data)
488
485
 
489
486
  if alignment := data.get("normalizedAlignment"):
490
- received_text += "".join(
491
- alignment.get("chars", [])
492
- ).replace(" ", "")
487
+ received_text += "".join(alignment.get("chars", [])).replace(" ", "")
493
488
  if received_text == expected_text:
494
489
  decoder.end_input()
495
490
  break
@@ -534,7 +529,7 @@ class SynthesizeStream(tts.SynthesizeStream):
534
529
 
535
530
 
536
531
  def _dict_to_voices_list(data: dict[str, Any]):
537
- voices: List[Voice] = []
532
+ voices: list[Voice] = []
538
533
  for voice in data["voices"]:
539
534
  voices.append(
540
535
  Voice(
@@ -12,4 +12,4 @@
12
12
  # See the License for the specific language governing permissions and
13
13
  # limitations under the License.
14
14
 
15
- __version__ = "0.8.0"
15
+ __version__ = "1.0.0.dev4"
@@ -0,0 +1,39 @@
1
+ [build-system]
2
+ requires = ["hatchling"]
3
+ build-backend = "hatchling.build"
4
+
5
+ [project]
6
+ name = "livekit-plugins-elevenlabs"
7
+ dynamic = ["version"]
8
+ description = "Agent Framework plugin for voice synthesis with ElevenLabs' API."
9
+ readme = "README.md"
10
+ license = "Apache-2.0"
11
+ requires-python = ">=3.9.0"
12
+ authors = [{ name = "LiveKit", email = "support@livekit.io" }]
13
+ keywords = ["webrtc", "realtime", "audio", "video", "livekit", "elevenlabs"]
14
+ classifiers = [
15
+ "Intended Audience :: Developers",
16
+ "License :: OSI Approved :: Apache Software License",
17
+ "Topic :: Multimedia :: Sound/Audio",
18
+ "Topic :: Multimedia :: Video",
19
+ "Topic :: Scientific/Engineering :: Artificial Intelligence",
20
+ "Programming Language :: Python :: 3",
21
+ "Programming Language :: Python :: 3.9",
22
+ "Programming Language :: Python :: 3.10",
23
+ "Programming Language :: Python :: 3 :: Only",
24
+ ]
25
+ dependencies = ["livekit-agents>=1.0.0.dev4"]
26
+
27
+ [project.urls]
28
+ Documentation = "https://docs.livekit.io"
29
+ Website = "https://livekit.io/"
30
+ Source = "https://github.com/livekit/agents"
31
+
32
+ [tool.hatch.version]
33
+ path = "livekit/plugins/elevenlabs/version.py"
34
+
35
+ [tool.hatch.build.targets.wheel]
36
+ packages = ["livekit"]
37
+
38
+ [tool.hatch.build.targets.sdist]
39
+ include = ["/livekit"]
@@ -1,46 +0,0 @@
1
- Metadata-Version: 2.2
2
- Name: livekit-plugins-elevenlabs
3
- Version: 0.8.0
4
- Summary: Agent Framework plugin for voice synthesis with ElevenLabs' API.
5
- Home-page: https://github.com/livekit/agents
6
- License: Apache-2.0
7
- Project-URL: Documentation, https://docs.livekit.io
8
- Project-URL: Website, https://livekit.io/
9
- Project-URL: Source, https://github.com/livekit/agents
10
- Keywords: webrtc,realtime,audio,video,livekit,elevenlabs
11
- Classifier: Intended Audience :: Developers
12
- Classifier: License :: OSI Approved :: Apache Software License
13
- Classifier: Topic :: Multimedia :: Sound/Audio
14
- Classifier: Topic :: Multimedia :: Video
15
- Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
16
- Classifier: Programming Language :: Python :: 3
17
- Classifier: Programming Language :: Python :: 3.9
18
- Classifier: Programming Language :: Python :: 3.10
19
- Classifier: Programming Language :: Python :: 3 :: Only
20
- Requires-Python: >=3.9.0
21
- Description-Content-Type: text/markdown
22
- Requires-Dist: livekit-agents[codecs]<1.0.0,>=0.12.16
23
- Dynamic: classifier
24
- Dynamic: description
25
- Dynamic: description-content-type
26
- Dynamic: home-page
27
- Dynamic: keywords
28
- Dynamic: license
29
- Dynamic: project-url
30
- Dynamic: requires-dist
31
- Dynamic: requires-python
32
- Dynamic: summary
33
-
34
- # LiveKit Plugins Elevenlabs
35
-
36
- Agent Framework plugin for voice synthesis with [ElevenLabs](https://elevenlabs.io/) API.
37
-
38
- ## Installation
39
-
40
- ```bash
41
- pip install livekit-plugins-elevenlabs
42
- ```
43
-
44
- ## Pre-requisites
45
-
46
- You'll need an API key from ElevenLabs. It can be set as an environment variable: `ELEVEN_API_KEY`
@@ -1,14 +0,0 @@
1
- README.md
2
- pyproject.toml
3
- setup.py
4
- livekit/plugins/elevenlabs/__init__.py
5
- livekit/plugins/elevenlabs/log.py
6
- livekit/plugins/elevenlabs/models.py
7
- livekit/plugins/elevenlabs/py.typed
8
- livekit/plugins/elevenlabs/tts.py
9
- livekit/plugins/elevenlabs/version.py
10
- livekit_plugins_elevenlabs.egg-info/PKG-INFO
11
- livekit_plugins_elevenlabs.egg-info/SOURCES.txt
12
- livekit_plugins_elevenlabs.egg-info/dependency_links.txt
13
- livekit_plugins_elevenlabs.egg-info/requires.txt
14
- livekit_plugins_elevenlabs.egg-info/top_level.txt
@@ -1 +0,0 @@
1
- livekit-agents[codecs]<1.0.0,>=0.12.16
@@ -1,3 +0,0 @@
1
- [build-system]
2
- requires = ["setuptools>=61.0"]
3
- build-backend = "setuptools.build_meta"
@@ -1,4 +0,0 @@
1
- [egg_info]
2
- tag_build =
3
- tag_date = 0
4
-
@@ -1,59 +0,0 @@
1
- # Copyright 2023 LiveKit, Inc.
2
- #
3
- # Licensed under the Apache License, Version 2.0 (the "License");
4
- # you may not use this file except in compliance with the License.
5
- # You may obtain a copy of the License at
6
- #
7
- # http://www.apache.org/licenses/LICENSE-2.0
8
- #
9
- # Unless required by applicable law or agreed to in writing, software
10
- # distributed under the License is distributed on an "AS IS" BASIS,
11
- # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
- # See the License for the specific language governing permissions and
13
- # limitations under the License.
14
-
15
- import os
16
- import pathlib
17
-
18
- import setuptools
19
- import setuptools.command.build_py
20
-
21
- here = pathlib.Path(__file__).parent.resolve()
22
- about = {}
23
- with open(
24
- os.path.join(here, "livekit", "plugins", "elevenlabs", "version.py"), "r"
25
- ) as f:
26
- exec(f.read(), about)
27
-
28
-
29
- setuptools.setup(
30
- name="livekit-plugins-elevenlabs",
31
- version=about["__version__"],
32
- description="Agent Framework plugin for voice synthesis with ElevenLabs' API.",
33
- long_description=(here / "README.md").read_text(encoding="utf-8"),
34
- long_description_content_type="text/markdown",
35
- url="https://github.com/livekit/agents",
36
- cmdclass={},
37
- classifiers=[
38
- "Intended Audience :: Developers",
39
- "License :: OSI Approved :: Apache Software License",
40
- "Topic :: Multimedia :: Sound/Audio",
41
- "Topic :: Multimedia :: Video",
42
- "Topic :: Scientific/Engineering :: Artificial Intelligence",
43
- "Programming Language :: Python :: 3",
44
- "Programming Language :: Python :: 3.9",
45
- "Programming Language :: Python :: 3.10",
46
- "Programming Language :: Python :: 3 :: Only",
47
- ],
48
- keywords=["webrtc", "realtime", "audio", "video", "livekit", "elevenlabs"],
49
- license="Apache-2.0",
50
- packages=setuptools.find_namespace_packages(include=["livekit.*"]),
51
- python_requires=">=3.9.0",
52
- install_requires=["livekit-agents[codecs]>=0.12.16,<1.0.0"],
53
- package_data={"livekit.plugins.elevenlabs": ["py.typed"]},
54
- project_urls={
55
- "Documentation": "https://docs.livekit.io",
56
- "Website": "https://livekit.io/",
57
- "Source": "https://github.com/livekit/agents",
58
- },
59
- )