Source code for platypush.plugins.tts
import urllib.parse
from typing import Optional, Union
from platypush.context import get_plugin
from platypush.plugins import Plugin, action
[docs]
class TtsPlugin(Plugin):
"""
Default Text-to-Speech plugin. It leverages Google Translate's unofficial
frontend API.
"""
[docs]
def __init__(
self,
language='en-US',
output_device: Optional[Union[int, str]] = None,
output_volume: Optional[float] = None,
**player_args,
):
"""
:param language: Language code (default: ``en-US``).
:param output_device: Audio output device to use for playback.
Supported formats: PortAudio/sounddevice device index,
PortAudio/sounddevice device name, or PulseAudio/PipeWire sink name
(e.g. ``alsa_output.pci-...``; requires ``pactl``). If specified,
it is passed as the ``device`` argument to
:meth:`platypush.plugins.sound.SoundPlugin.play`.
:param output_volume: Playback volume, as a percentage. ``100`` means
unchanged, values below ``100`` attenuate, and values above ``100``
amplify with clipping in the playback path. It is passed as the
``volume`` argument to :meth:`platypush.plugins.sound.SoundPlugin.play`.
:param player_args: Additional arguments to be passed to
:meth:`platypush.plugins.sound.SoundPlugin.play` (like volume,
duration, channels etc.).
"""
super().__init__()
if output_volume is not None and output_volume < 0:
raise ValueError('output_volume must be greater than or equal to 0')
self.language = language
self.output_device = output_device
self.output_volume = output_volume
self.player_args = player_args or {}
if output_device is not None:
self.player_args.setdefault('device', output_device)
if output_volume is not None:
self.player_args.setdefault('volume', output_volume)
def _playback(
self,
resource: str,
output_device: Optional[Union[int, str]] = None,
output_volume: Optional[float] = None,
**kwargs,
):
audio = get_plugin('sound')
if not (audio):
raise AssertionError
if output_volume is not None and output_volume < 0:
raise ValueError('output_volume must be greater than or equal to 0')
if output_device is not None:
kwargs['device'] = output_device
if output_volume is not None:
kwargs['volume'] = output_volume
audio.play(resource, **{**self.player_args, **kwargs})
[docs]
@action
def say(
self,
text: str,
language: Optional[str] = None,
**player_args,
):
"""
Say some text.
:param text: Text to say.
:param language: Language code override.
:param player_args: Extends the additional arguments to be passed to
:meth:`platypush.plugins.sound.SoundPlugin.play` (like volume,
duration, channels, output_device, output_volume etc.).
``output_device`` accepts a PortAudio/sounddevice device index,
PortAudio/sounddevice device name, or PulseAudio/PipeWire sink name
(requires ``pactl``). ``output_volume`` is an alias for the
underlying playback ``volume`` percentage.
"""
language = language or self.language
url = 'https://translate.google.com/translate_tts?' + urllib.parse.urlencode(
{
'ie': 'UTF-8',
'client': 'tw-ob',
'tl': language,
'q': text,
}
)
self._playback(url, **player_args)
[docs]
@action
def stop(self):
"""
Stop the playback.
"""
try:
audio = get_plugin('sound')
except Exception:
return
if audio:
audio.stop_playback()
# vim:sw=4:ts=4:et: