diff --git a/plip_voice/main/conversation.c b/plip_voice/main/conversation.c index 144f18c..438841e 100644 --- a/plip_voice/main/conversation.c +++ b/plip_voice/main/conversation.c @@ -257,12 +257,25 @@ static void conv_task(void *arg) go_idle(); break; } - /* Fetch greeting WAV from gateway and enqueue playback */ - if (turn_client_greeting(s_sid, s_number, - "/spiffs/turn.wav")) { - audio_play_async("/spiffs/turn.wav"); - } else { - ESP_LOGW(TAG, "turn_client_greeting failed — proceeding silent"); + /* Prefer the local SD voice pack (no gateway, no model in RAM): + * play /sdcard/voice/greet_.wav when present. Fall back to + * the live gateway greeting only when the pack has no clip for this + * NPC number (see tools/tts/generate_plip_sd_pack.py). */ + { + char sd_greet[64]; + snprintf(sd_greet, sizeof(sd_greet), + "/sdcard/voice/greet_%s.wav", s_number); + FILE *tf = NULL; + if (audio_ensure_sd() && (tf = fopen(sd_greet, "rb")) != NULL) { + fclose(tf); + audio_play_async(sd_greet); + ESP_LOGI(TAG, "GREET: local SD pack %s", sd_greet); + } else if (turn_client_greeting(s_sid, s_number, + "/spiffs/turn.wav")) { + audio_play_async("/spiffs/turn.wav"); + } else { + ESP_LOGW(TAG, "no SD clip + gateway greeting failed — silent"); + } } s_state = STATE_CONNECTED; ESP_LOGI(TAG, "-> CONNECTED");