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 transcript = '';
if (useMedical) {
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);
for await (var event of medResp.TranscriptResultStream) {
// Helper to collect transcript from a result stream
async function collectTranscript(resultStream) {
var text = '';
for await (var event of resultStream) {
if (event.TranscriptEvent && event.TranscriptEvent.Transcript) {
var results = event.TranscriptEvent.Transcript.Results || [];
for (var i = 0; i < results.length; i++) {
var r = results[i];
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 {
var StartStreamTranscriptionCommand = TranscribeModule.StartStreamTranscriptionCommand;
var cmd = new StartStreamTranscriptionCommand({
@ -132,17 +156,8 @@ async function transcribeWithAWS(audioBuffer, mimeType) {
AudioStream: makeAudioStream(audioToSend)
});
var resp = await client.send(cmd);
for await (var ev of resp.TranscriptResultStream) {
if (ev.TranscriptEvent && ev.TranscriptEvent.Transcript) {
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 + ' ';
}
}
}
}
transcript = await collectTranscript(resp.TranscriptResultStream);
console.log('[Transcribe] Standard transcription OK (' + transcript.length + ' chars)');
}
return transcript.trim();