Source code for rhasspyhermes.tts

"""Messages for text to speech."""
import typing
from dataclasses import dataclass

from dataclasses_json import LetterCase, dataclass_json

from .base import Message


[docs]@dataclass class TtsSay(Message): """Send text to be spoken by the text to speech component. Note ---- This is a low-level message. You should use the dialogue manager's :class:`rhasspyhermes.dialogue.DialogueStartSession` or :class:`rhasspyhermes.dialogue.DialogueContinueSession` messages. .. admonition:: MQTT message Topic ``hermes/tts/say`` Payload (JSON) .. list-table:: :widths: 10 10 80 :header-rows: 1 * - Key - Type - Description * - text - String - The text to be spoken. * - siteId - String - The id of the site where the text should be spoken. Defaults to ``"default"``. * - lang - String (optional) - The language code to use when saying the text. * - id - String (optional) - A request identifier. If provided, it will be passed back in the response message :class:`TtsSayFinished`. * - sessionId - String (optional) - The id of the session, if there is an active session. Publish this message type with ``mosquitto_pub``: .. code-block:: shell mosquitto_pub -h <HOSTNAME> -t 'hermes/tts/say' -m '{"text": "Ciao!", "lang": "it_IT"}' Example ------- >>> from rhasspyhermes.tts import TtsSay >>> say = TtsSay(text="Ciao!", lang="it_IT") >>> say.topic() 'hermes/tts/say' >>> say.payload() '{"text": "Ciao!", "siteId": "default", "lang": "it_IT", "id": null, "sessionId": null}' """ text: str """The text to be spoken.""" site_id: str = "default" """The id of the site where the text should be spoken.""" lang: typing.Optional[str] = None """The language code to use when saying the text.""" id: typing.Optional[str] = None """A request identifier. If provided, it will be passed back in the response message :class:`TtsSayFinished`.""" session_id: typing.Optional[str] = None """The id of the session, if there is an active session.""" volume: typing.Optional[float] = None """Volume scale to apply to generated audio (0-1)"""
[docs] @classmethod def topic(cls, **kwargs) -> str: """Get MQTT topic for this message type. Returns ------- str ``"hermes/tts/say"`` """ return "hermes/tts/say"
[docs]@dataclass class TtsSayFinished(Message): """Response published when the text to speech component has finished speaking. .. admonition:: MQTT message Topic ``hermes/tts/sayFinished`` Payload (JSON) .. list-table:: :widths: 10 10 80 :header-rows: 1 * - Key - Type - Description * - siteId - String - The id of the site where the text was spoken. Defaults to ``"default"``. * - id - String (optional) - Identifier from the request (:class:`TtsSay`). * - sessionId - String (optional) - The id of the session, if there is an active session. Subscribe to this message type with ``mosquitto_sub``: .. code-block:: shell mosquitto_sub -h <HOSTNAME> -v -t 'hermes/tts/sayFinished' """ site_id: str = "default" """The id of the site where the text was spoken. Defaults to ``"default"``.""" id: typing.Optional[str] = None """Identifier from the request (:class:`TtsSay`).""" session_id: typing.Optional[str] = None """The id of the session, if there is an active session."""
[docs] @classmethod def topic(cls, **kwargs) -> str: """Get MQTT topic for this message type. Returns ------- str ``"hermes/tts/sayFinished"`` """ return "hermes/tts/sayFinished"
# ----------------------------------------------------------------------------- # Rhasspy Only # -----------------------------------------------------------------------------
[docs]@dataclass class GetVoices(Message): """Get the available voices for the text to speech system. Note ---- This is a Rhasspy-only message. .. admonition:: MQTT message Topic ``hermes/tts/getVoices`` Payload (JSON) .. list-table:: :widths: 10 10 80 :header-rows: 1 * - Key - Type - Description * - id - String (optional) - Unique identifier passed to the response (:class:`Voices`). * - siteId - String - The id of the site to request voices from. Defaults to ``"default"``. Publish this message type with ``mosquitto_pub``: .. code-block:: shell mosquitto_pub -h <HOSTNAME> -t 'hermes/tts/getVoices' -m '{"id": "abcd", "siteId": "default"}' Example ------- >>> from rhasspyhermes.tts import GetVoices >>> g = GetVoices("abcd") >>> g.topic() 'rhasspy/tts/getVoices' >>> g.payload() '{"id": "abcd", "siteId": "default"}' """ id: typing.Optional[str] = None """Unique identifier passed to response (:class:`Voices`).""" site_id: str = "default" """Id of site to request voices from."""
[docs] @classmethod def topic(cls, **kwargs) -> str: """Get MQTT topic for this message type. Returns ------- str ``"hermes/tts/getVoices"`` """ return "rhasspy/tts/getVoices"
[docs]@dataclass_json(letter_case=LetterCase.CAMEL) @dataclass class Voice: """Information about a single TTS voice.""" voice_id: str """Unique identifier for voice.""" description: typing.Optional[str] = None """Human-readable description of voice."""
[docs]@dataclass class Voices(Message): """Response with the available voices for the text to speech system. This message is published in response to a :class:`GetVoices` request. Note ---- This is a Rhasspy-only message. .. admonition:: MQTT message Topic ``hermes/tts/Voices`` Payload (JSON) .. list-table:: :widths: 10 10 80 :header-rows: 1 * - Key - Type - Description * - voices - List of JSON objects - List of available voices. * - id - String (optional) - Unique identifier from the request (:class:`GetVoices`). * - siteId - String - The id of the site where voices were requested. Defaults to ``"default"``. Subscribe to this message type with ``mosquitto_sub``: .. code-block:: shell mosquitto_sub -h <HOSTNAME> -v -t 'hermes/tts/voices' """ voices: typing.List[Voice] """List of available voices.""" id: typing.Optional[str] = None """Unique identifier from request (:class:`GetVoices`).""" site_id: str = "default" """Id of site where voices were requested."""
[docs] @classmethod def topic(cls, **kwargs) -> str: """Get MQTT topic for this message type. Returns ------- str ``"hermes/tts/voices"`` """ return "rhasspy/tts/voices"
[docs]@dataclass class TtsError(Message): """This message is published by the text to speech system if an error has occurred. Note ---- This is a Rhasspy-only message. .. admonition:: MQTT message Topic ``hermes/error/tts`` Payload (JSON) .. list-table:: :widths: 10 10 80 :header-rows: 1 * - Key - Type - Description * - error - String - A description of the error that occurred. * - siteId - String - Site where the error occurred. Defaults to ``"default"``. * - context - String (optional) - Additional information on the context in which the error occurred. * - sessionId - String (optional) - The id of the session, if there is an active session. Subscribe to this message type with ``mosquitto_sub``: .. code-block:: shell mosquitto_sub -h <HOSTNAME> -v -t 'hermes/error/tts' Example ------- >>> from rhasspyhermes.tts import TtsError >>> tts_error = TtsError(error="Unexpected error") >>> tts_error.topic() 'hermes/error/tts' >>> tts_error.payload() '{"error": "Unexpected error", "siteId": "default", "context": null, "sessionId": null}' """ error: str """A description of the error that occurred.""" site_id: str = "default" """The id of the site where the error occurred.""" context: typing.Optional[str] = None """Additional information on the context in which the error occurred.""" session_id: typing.Optional[str] = None """The id of the session, if there is an active session."""
[docs] @classmethod def topic(cls, **kwargs) -> str: """Get MQTT topic for this message type. Returns ------- str ``"hermes/error/tts"`` """ return "hermes/error/tts"