chore: save voice in TTS events and re-request if requested voice doesn't match saved voice

This commit is contained in:
ggurdin 2026-01-20 16:15:32 -05:00
parent 2397a733f1
commit 2701f74759
No known key found for this signature in database
GPG key ID: A01CB41737CBB478
3 changed files with 21 additions and 5 deletions

View file

@ -109,6 +109,7 @@ class ModelKey {
static const String transcription = "transcription";
static const String botTranscription = 'bot_transcription';
static const String voice = "voice";
// bot options
static const String languageLevel = "difficulty";

View file

@ -303,7 +303,11 @@ class PangeaMessageEvent {
return null;
}
Event? getTextToSpeechLocal(String langCode, String text) {
Event? getTextToSpeechLocal(
String langCode,
String text,
String? voice,
) {
for (final audio in allAudio) {
final dataMap = audio.content.tryGetMap(ModelKey.transcription);
if (dataMap == null || !dataMap.containsKey(ModelKey.tokens)) continue;
@ -313,7 +317,9 @@ class PangeaMessageEvent {
dataMap as dynamic,
);
if (audioData.langCode == langCode && audioData.text == text) {
if (audioData.langCode == langCode &&
audioData.text == text &&
audioData.voice == voice) {
return audio;
}
} catch (e, s) {
@ -368,7 +374,7 @@ class PangeaMessageEvent {
String langCode,
String? voice,
) async {
final local = getTextToSpeechLocal(langCode, messageDisplayText);
final local = getTextToSpeechLocal(langCode, messageDisplayText, voice);
if (local != null) {
final file = await local.getPangeaAudioFile();
if (file != null) return file;
@ -424,7 +430,7 @@ class PangeaMessageEvent {
'waveform': response.waveform,
},
ModelKey.transcription: response
.toPangeaAudioEventData(rep?.text ?? body, langCode)
.toPangeaAudioEventData(rep?.text ?? body, langCode, voice)
.toJson(),
},
).then((eventId) async {

View file

@ -41,11 +41,16 @@ class TextToSpeechResponseModel {
"tts_tokens": List<dynamic>.from(ttsTokens.map((x) => x.toJson())),
};
PangeaAudioEventData toPangeaAudioEventData(String text, String langCode) {
PangeaAudioEventData toPangeaAudioEventData(
String text,
String langCode,
String? voice,
) {
return PangeaAudioEventData(
text: text,
langCode: langCode,
tokens: ttsTokens,
voice: voice,
);
}
}
@ -91,11 +96,13 @@ class PangeaAudioEventData {
final String text;
final String langCode;
final List<TTSToken> tokens;
final String? voice;
PangeaAudioEventData({
required this.text,
required this.langCode,
required this.tokens,
this.voice,
});
factory PangeaAudioEventData.fromJson(dynamic json) => PangeaAudioEventData(
@ -106,6 +113,7 @@ class PangeaAudioEventData {
.map((x) => TTSToken.fromJson(x))
.toList(),
),
voice: json[ModelKey.voice] as String?,
);
Map<String, dynamic> toJson() => {
@ -113,5 +121,6 @@ class PangeaAudioEventData {
ModelKey.langCode: langCode,
ModelKey.tokens:
List<Map<String, dynamic>>.from(tokens.map((x) => x.toJson())),
if (voice != null) ModelKey.voice: voice,
};
}