This repository has been archived on 2024-07-22. You can view files and clone it, but cannot push or open issues or pull requests.
Zaimki/server/routes/pronounce.js

72 lines
2.2 KiB
JavaScript

import { Router } from 'express';
import { loadTsv } from '../loader';
import {buildPronoun, parsePronouns} from "../../src/buildPronoun";
import {Example} from "../../src/classes";
import sha1 from 'sha1';
import {handleErrorAsync} from "../../src/helpers";
import awsConfig from '../aws';
import Polly from 'aws-sdk/clients/polly';
import S3 from 'aws-sdk/clients/s3';
const router = Router();
router.get('/pronounce/:voice/:pronoun*', handleErrorAsync(async (req, res) => {
const pronounString = req.params.pronoun + req.params[0];
const pronoun = buildPronoun(
parsePronouns(loadTsv('pronouns/pronouns')),
pronounString,
);
if (!pronoun || !req.query.example) {
return res.status(404).json({error: 'Not found'});
}
let [singular, plural, isHonorific] = req.query.example.split('|');
const example = new Example(
Example.parse(singular),
Example.parse(plural || singular),
!!parseInt(isHonorific || '0'),
)
const text = example.pronounce(pronoun);
if (!text || text.length > 256) {
return res.status(404).json({error: 'Not found'});
}
const voice = req.config.pronunciation.voices[req.params.voice];
if (!voice) {
return res.status(404).json({error: 'Not found'});
}
const s3 = new S3(awsConfig);
const polly = new Polly(awsConfig);
const key = `pronunciation/${req.config.locale}-${req.params.voice}/${pronounString}/${sha1(text)}.mp3`;
try {
const s3getResponse = await s3.getObject({Key: key}).promise();
return res.set('content-type', s3getResponse.ContentType).send(s3getResponse.Body);
} catch {
const pollyResponse = await polly.synthesizeSpeech({
TextType: 'ssml',
Text: text,
OutputFormat: 'mp3',
LanguageCode: voice.language,
VoiceId: voice.voice,
Engine: voice.engine,
}).promise();
const s3putResponse = await s3.putObject({
Key: key,
Body: pollyResponse.AudioStream,
ContentType: pollyResponse.ContentType,
}).promise();
return res.set('content-type', pollyResponse.ContentType).send(pollyResponse.AudioStream);
}
}));
export default router;