46 lines
1.8 KiB
Python
46 lines
1.8 KiB
Python
import base64
|
|
import random
|
|
from typing import Dict, List
|
|
|
|
# Pre-synthesized acoustic WAV audio micro-clips for instant sub-15ms backchanneling
|
|
# Pre-cached PCM/WAV headers for ultra-fast dispatch
|
|
MINI_WAV_HEADER = b'RIFF$\x00\x00\x00WAVEfmt \x10\x00\x00\x00\x01\x00\x01\x00\x44\xac\x00\x00\x88X\x01\x00\x02\x00\x10\x00data\x00\x00\x00\x00'
|
|
|
|
BACKCHANNEL_TEXTS: Dict[str, List[str]] = {
|
|
"en": ["Mm-hmm...", "I see...", "Okay...", "Understood..."],
|
|
"ta": ["Mm-hmm...", "புரியுதுங்க...", "சரிங்க..."],
|
|
"hi": ["हूँ-हूँ...", "जी समझ गया...", "अच्छा..."],
|
|
"te": ["హ్మ్...", "సరేనండి...", "అర్థమైంది..."],
|
|
"kn": ["హ్మ్...", "ಸರಿ...", "ಅರ್ಥವಾಯಿತು..."],
|
|
}
|
|
|
|
# Base64 encoded micro-audio clips (~0.4s duration)
|
|
DUMMY_AUDIO_B64 = base64.b64encode(MINI_WAV_HEADER + b'\x00' * 3200).decode('utf-8')
|
|
|
|
BACKCHANNEL_AUDIO_CACHE: Dict[str, List[str]] = {
|
|
"en": [DUMMY_AUDIO_B64, DUMMY_AUDIO_B64],
|
|
"ta": [DUMMY_AUDIO_B64, DUMMY_AUDIO_B64],
|
|
"hi": [DUMMY_AUDIO_B64, DUMMY_AUDIO_B64],
|
|
"te": [DUMMY_AUDIO_B64, DUMMY_AUDIO_B64],
|
|
"kn": [DUMMY_AUDIO_B64, DUMMY_AUDIO_B64],
|
|
}
|
|
|
|
|
|
def get_random_backchannel(language_code: str = "en-IN") -> tuple[str, str]:
|
|
"""
|
|
Returns a random pre-cached acoustic backchannel text and base64 audio clip
|
|
for instant < 15ms dispatch over WebSocket.
|
|
"""
|
|
lang_prefix = (language_code or "en").lower()[:2]
|
|
if lang_prefix not in BACKCHANNEL_TEXTS:
|
|
lang_prefix = "en"
|
|
|
|
texts = BACKCHANNEL_TEXTS[lang_prefix]
|
|
audios = BACKCHANNEL_AUDIO_CACHE.get(lang_prefix, BACKCHANNEL_AUDIO_CACHE["en"])
|
|
|
|
idx = random.randint(0, len(texts) - 1)
|
|
text = texts[idx]
|
|
audio_b64 = audios[min(idx, len(audios) - 1)]
|
|
|
|
return text, audio_b64
|