in lambda/go/process-transcription/main.go [32:107]
func (h *Handler) Handle(ctx context.Context, input workshop.TranscribeStateMachineInput) (
workshop.TranscribeStateMachineOutput, error,
) {
log.Println("processing transcription,", input)
episode := input.Episode
transcribeOutput := manager.NewWriteAtBuffer(make([]byte, 0, 1*1024*1024))
_, err := h.s3Downloader.Download(ctx, transcribeOutput, &s3.GetObjectInput{
Bucket: &h.bucketName,
Key: &episode.TranscribeMetadataKey,
})
if err != nil {
return workshop.TranscribeStateMachineOutput{},
fmt.Errorf("failed to download transcribe metadata, %w", err)
}
var transcribeMetadata = struct {
Results struct {
LanguageCode string `json:"language_code"`
Transcripts []struct {
Transcript string `json:"transcript"`
} `json:"transcripts"`
} `json:"results"`
}{}
if err = json.Unmarshal(transcribeOutput.Bytes(), &transcribeMetadata); err != nil {
return workshop.TranscribeStateMachineOutput{},
fmt.Errorf("failed to decode transcribe metadata, %w", err)
}
if len(transcribeMetadata.Results.Transcripts) == 0 {
return workshop.TranscribeStateMachineOutput{},
fmt.Errorf("transcribe metadata did not contain transcription, %v", transcribeMetadata)
}
// TODO Do some kind of processing on transcription metadata
var transcriptBuffer bytes.Buffer
for _, result := range transcribeMetadata.Results.Transcripts {
transcriptBuffer.WriteString(result.Transcript)
transcriptBuffer.WriteString("\n\n")
}
episode.TranscriptionKey = workshop.MakeEpisodeTranscriptionPath(
h.mediaKeyPrefix, episode.ID,
)
_, err = h.s3Uploader.Upload(ctx, &s3.PutObjectInput{
Bucket: &h.bucketName,
Key: &episode.TranscriptionKey,
ContentType: aws.String("text/plain"),
Body: bytes.NewReader(transcriptBuffer.Bytes()),
})
if err != nil {
return workshop.TranscribeStateMachineOutput{},
fmt.Errorf("failed to upload transcription file, %w", err)
}
log.Println("uploaded media transcription,", episode.TranscriptionKey)
av, err := ddbav.MarshalMap(episode)
if err != nil {
return workshop.TranscribeStateMachineOutput{},
fmt.Errorf("failed to marshal episode, %w", err)
}
log.Println("updating episode table,", episode)
_, err = h.ddbClient.PutItem(ctx, &ddb.PutItemInput{
TableName: &h.episodeTableName,
Item: av,
})
if err != nil {
return workshop.TranscribeStateMachineOutput{},
fmt.Errorf("failed to put episode to metadata table, %w", err)
}
return workshop.TranscribeStateMachineOutput{
Episode: input.Episode,
}, nil
}