71 lines
2.2 KiB
JavaScript
71 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 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*', 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;
|