"""Configuration, phrase banks and default catalogs for the dataset creator.""" from __future__ import annotations from dataclasses import dataclass, field from typing import List # --------------------------------------------------------------------------- # # Default phrase banks (target phrase: "Hey Android") # --------------------------------------------------------------------------- # DEFAULT_WAKE_PHRASES: List[str] = [ "Hey Android", "Hey, Android", "Hello Android", "Okay Android", "OK Android", "Android", ] DEFAULT_UNKNOWN_PHRASES: List[str] = [ "Hey Andrew", "Hey Adrian", "Hey Andrea", "Hello phone", "Open settings", "Start recording", "Stop recording", "Good morning", "Where is my phone", "Androids are useful", "This is a test", "Turn on the light", "Turn off the light", "Increase volume", "Decrease volume", "Play music", "Pause music", ] # The three primary keyword-spotting classes. WAKE_LABEL = "hey_android" UNKNOWN_LABEL = "unknown" NOISE_LABEL = "background_noise" NOISE_TYPES: List[str] = ["white", "pink", "brown", "hum", "fan", "cafe", "street"] # --------------------------------------------------------------------------- # # Piper voice catalog (free, downloaded from rhasspy/piper-voices on the Hub) # --------------------------------------------------------------------------- # @dataclass(frozen=True) class PiperVoice: """A downloadable Piper voice model on the Hugging Face Hub.""" voice_id: str repo_path: str # path inside rhasspy/piper-voices (without extension) locale: str description: str PIPER_VOICES: List[PiperVoice] = [ PiperVoice( "en_US-lessac-medium", "en/en_US/lessac/medium/en_US-lessac-medium", "en-US", "English US", ), PiperVoice( "en_GB-alba-medium", "en/en_GB/alba/medium/en_GB-alba-medium", "en-GB", "English GB", ), PiperVoice( "en_GB-northern_english_male-medium", "en/en_GB/northern_english_male/medium/en_GB-northern_english_male-medium", "en-GB", "English GB Northern male", ), PiperVoice( "nl_NL-mls-medium", "nl/nl_NL/mls/medium/nl_NL-mls-medium", "nl-NL", "Dutch NL", ), PiperVoice( "de_DE-thorsten-medium", "de/de_DE/thorsten/medium/de_DE-thorsten-medium", "de-DE", "German", ), PiperVoice( "fr_FR-siwis-medium", "fr/fr_FR/siwis/medium/fr_FR-siwis-medium", "fr-FR", "French", ), PiperVoice( "es_ES-sharvard-medium", "es/es_ES/sharvard/medium/es_ES-sharvard-medium", "es-ES", "Spanish", ), ] # --------------------------------------------------------------------------- # # Dataset generation config # --------------------------------------------------------------------------- # @dataclass class DatasetConfig: """All knobs controlling a single dataset build.""" # Output out_dir: str = "output" dataset_name: str = "hey_android" # Audio sample_rate_hz: int = 16000 duration_seconds: float = 2.0 # Classes / phrases wake_label: str = WAKE_LABEL unknown_label: str = UNKNOWN_LABEL noise_label: str = NOISE_LABEL wake_phrases: List[str] = field(default_factory=lambda: list(DEFAULT_WAKE_PHRASES)) unknown_phrases: List[str] = field(default_factory=lambda: list(DEFAULT_UNKNOWN_PHRASES)) # Size controls base_repeats_per_phrase_per_voice: int = 1 augmentations_per_speech_clip: int = 8 background_noise_samples: int = 200 max_piper_voices: int = 7 max_gcp_voices_per_locale: int = 3 # GCP voice selection gcp_language_prefixes: List[str] = field( default_factory=lambda: ["en", "nl", "de", "fr", "es"] ) # Split test_ratio: float = 0.2 # Reproducibility seed: int = 1337 @property def target_samples(self) -> int: return int(self.sample_rate_hz * self.duration_seconds)