1 """Support for Wyoming speech-to-text services."""
3 from collections.abc
import AsyncIterable
6 from wyoming.asr
import Transcribe, Transcript
7 from wyoming.audio
import AudioChunk, AudioStart, AudioStop
8 from wyoming.client
import AsyncTcpClient
15 from .const
import DOMAIN, SAMPLE_CHANNELS, SAMPLE_RATE, SAMPLE_WIDTH
16 from .data
import WyomingService
17 from .error
import WyomingError
18 from .models
import DomainDataItem
20 _LOGGER = logging.getLogger(__name__)
25 config_entry: ConfigEntry,
26 async_add_entities: AddEntitiesCallback,
28 """Set up Wyoming speech-to-text."""
29 item: DomainDataItem = hass.data[DOMAIN][config_entry.entry_id]
38 """Wyoming speech-to-text provider."""
42 config_entry: ConfigEntry,
43 service: WyomingService,
45 """Set up provider."""
47 asr_service = service.info.asr[0]
49 model_languages: set[str] = set()
50 for asr_model
in asr_service.models:
51 if asr_model.installed:
52 model_languages.update(asr_model.languages)
60 """Return a list of supported languages."""
65 """Return a list of supported formats."""
66 return [stt.AudioFormats.WAV]
70 """Return a list of supported codecs."""
71 return [stt.AudioCodecs.PCM]
75 """Return a list of supported bitrates."""
76 return [stt.AudioBitRates.BITRATE_16]
80 """Return a list of supported samplerates."""
81 return [stt.AudioSampleRates.SAMPLERATE_16000]
85 """Return a list of supported channels."""
86 return [stt.AudioChannels.CHANNEL_MONO]
89 self, metadata: stt.SpeechMetadata, stream: AsyncIterable[bytes]
91 """Process an audio stream to STT service."""
93 async
with AsyncTcpClient(self.
serviceservice.host, self.
serviceservice.port)
as client:
95 await client.write_event(Transcribe(language=metadata.language).event())
98 await client.write_event(
102 channels=SAMPLE_CHANNELS,
106 async
for audio_bytes
in stream:
110 channels=SAMPLE_CHANNELS,
113 await client.write_event(chunk.event())
116 await client.write_event(AudioStop().event())
119 event = await client.read_event()
121 _LOGGER.debug(
"Connection lost")
124 if Transcript.is_type(event.type):
125 transcript = Transcript.from_event(event)
126 text = transcript.text
129 except (OSError, WyomingError):
130 _LOGGER.exception(
"Error processing audio stream")
135 stt.SpeechResultState.SUCCESS,
list[stt.AudioSampleRates] supported_sample_rates(self)
stt.SpeechResult async_process_audio_stream(self, stt.SpeechMetadata metadata, AsyncIterable[bytes] stream)
list[stt.AudioCodecs] supported_codecs(self)
list[stt.AudioChannels] supported_channels(self)
list[stt.AudioBitRates] supported_bit_rates(self)
list[str] supported_languages(self)
None __init__(self, ConfigEntry config_entry, WyomingService service)
list[stt.AudioFormats] supported_formats(self)
None async_setup_entry(HomeAssistant hass, ConfigEntry config_entry, AddEntitiesCallback async_add_entities)