Add Medical→Standard fallback and better error logging for AWS Transcribe

When Medical Transcribe fails (wrong IAM permissions, region not
supported), automatically falls back to Standard Transcribe instead
of returning an error. Logs the specific failure reason.
This commit is contained in:
Daniel Onyejesi 2026-03-25 18:10:21 -04:00
parent 168f67adee
commit dbda2ad913

View file

@ -101,28 +101,52 @@ async function transcribeWithAWS(audioBuffer, mimeType) {
var specialty = process.env.AWS_TRANSCRIBE_SPECIALTY || 'PRIMARYCARE'; var specialty = process.env.AWS_TRANSCRIBE_SPECIALTY || 'PRIMARYCARE';
var transcript = ''; var transcript = '';
if (useMedical) { // Helper to collect transcript from a result stream
var StartMedicalStreamTranscriptionCommand = TranscribeModule.StartMedicalStreamTranscriptionCommand; async function collectTranscript(resultStream) {
var medCmd = new StartMedicalStreamTranscriptionCommand({ var text = '';
LanguageCode: 'en-US', for await (var event of resultStream) {
MediaSampleRateHertz: sampleRate,
MediaEncoding: mediaEncoding,
Specialty: specialty,
Type: 'DICTATION',
AudioStream: makeAudioStream(audioToSend)
});
var medResp = await client.send(medCmd);
for await (var event of medResp.TranscriptResultStream) {
if (event.TranscriptEvent && event.TranscriptEvent.Transcript) { if (event.TranscriptEvent && event.TranscriptEvent.Transcript) {
var results = event.TranscriptEvent.Transcript.Results || []; var results = event.TranscriptEvent.Transcript.Results || [];
for (var i = 0; i < results.length; i++) { for (var i = 0; i < results.length; i++) {
var r = results[i]; var r = results[i];
if (!r.IsPartial && r.Alternatives && r.Alternatives[0]) { if (!r.IsPartial && r.Alternatives && r.Alternatives[0]) {
transcript += r.Alternatives[0].Transcript + ' '; text += r.Alternatives[0].Transcript + ' ';
} }
} }
} }
} }
return text;
}
if (useMedical) {
try {
var StartMedicalStreamTranscriptionCommand = TranscribeModule.StartMedicalStreamTranscriptionCommand;
var medCmd = new StartMedicalStreamTranscriptionCommand({
LanguageCode: 'en-US',
MediaSampleRateHertz: sampleRate,
MediaEncoding: mediaEncoding,
Specialty: specialty,
Type: 'DICTATION',
AudioStream: makeAudioStream(audioToSend)
});
var medResp = await client.send(medCmd);
transcript = await collectTranscript(medResp.TranscriptResultStream);
console.log('[Transcribe] Medical transcription OK (' + transcript.length + ' chars)');
} catch (medErr) {
console.warn('[Transcribe] Medical failed, falling back to standard:', medErr.message);
// Fallback to standard Transcribe
var client2 = new TranscribeStreamingClient({ region: region, credentials: credentials });
var StartStreamTranscriptionCommand = TranscribeModule.StartStreamTranscriptionCommand;
var cmd = new StartStreamTranscriptionCommand({
LanguageCode: 'en-US',
MediaSampleRateHertz: sampleRate,
MediaEncoding: mediaEncoding,
AudioStream: makeAudioStream(audioToSend)
});
var resp = await client2.send(cmd);
transcript = await collectTranscript(resp.TranscriptResultStream);
console.log('[Transcribe] Standard fallback OK (' + transcript.length + ' chars)');
}
} else { } else {
var StartStreamTranscriptionCommand = TranscribeModule.StartStreamTranscriptionCommand; var StartStreamTranscriptionCommand = TranscribeModule.StartStreamTranscriptionCommand;
var cmd = new StartStreamTranscriptionCommand({ var cmd = new StartStreamTranscriptionCommand({
@ -132,17 +156,8 @@ async function transcribeWithAWS(audioBuffer, mimeType) {
AudioStream: makeAudioStream(audioToSend) AudioStream: makeAudioStream(audioToSend)
}); });
var resp = await client.send(cmd); var resp = await client.send(cmd);
for await (var ev of resp.TranscriptResultStream) { transcript = await collectTranscript(resp.TranscriptResultStream);
if (ev.TranscriptEvent && ev.TranscriptEvent.Transcript) { console.log('[Transcribe] Standard transcription OK (' + transcript.length + ' chars)');
var res = ev.TranscriptEvent.Transcript.Results || [];
for (var j = 0; j < res.length; j++) {
var item = res[j];
if (!item.IsPartial && item.Alternatives && item.Alternatives[0]) {
transcript += item.Alternatives[0].Transcript + ' ';
}
}
}
}
} }
return transcript.trim(); return transcript.trim();