From b0bf4fc5cee1278207c223cc85acdb20bc3e1208 Mon Sep 17 00:00:00 2001 From: Hongbo Wu Date: Wed, 17 Aug 2022 10:51:39 +0800 Subject: [PATCH] Create speech while requesting --- packages/api/src/routers/article_router.ts | 39 +++++++++++++++++++--- packages/api/src/routers/svc/speech.ts | 2 +- packages/api/src/server.ts | 2 +- packages/api/src/utils/createTask.ts | 10 +++++- 4 files changed, 45 insertions(+), 8 deletions(-) diff --git a/packages/api/src/routers/article_router.ts b/packages/api/src/routers/article_router.ts index 836980cac..89625429f 100644 --- a/packages/api/src/routers/article_router.ts +++ b/packages/api/src/routers/article_router.ts @@ -17,6 +17,10 @@ import { env } from '../env' import { Claims } from '../resolvers/types' import { getRepository } from '../entity/utils' import { Speech } from '../entity/speech' +import { getPageById } from '../elastic/pages' +import { parseHTML } from 'linkedom' +import { synthesizeTextToSpeech } from '../utils/textToSpeech' +import { UserPersonalization } from '../entity/user_personalization' const logger = buildLogger('app.dispatch') @@ -87,15 +91,40 @@ export function articleRouter() { }, }) - const speech = await getRepository(Speech).findOneBy({ - elasticPageId: id, + logger.debug('Text to speech request', { articleId: id }) + const userPersonalization = await getRepository( + UserPersonalization + ).findOneBy({ user: { id: uid }, }) - - if (!speech) { - return res.status(404).send({ errorCode: 'NOT_FOUND' }) + if (!userPersonalization) { + return res.status(200).send('userPersonalization not found') } + const page = await getPageById(id) + if (!page) { + return res.status(200).send('Page not found') + } + + const text = parseHTML(page.content).document.documentElement.textContent + if (!text) { + return res.status(200).send('Page has no text') + } + + const speech = await synthesizeTextToSpeech({ + id, + text, + languageCode: page.language, + voice: userPersonalization.speechVoice, + }) + + await getRepository(Speech).save({ + elasticPageId: id, + audioUrl: speech.audioUrl, + speechMarks: JSON.stringify(speech.speechMarks), + user: { id: uid }, + }) + logger.info('Found speech mp3', { audioUrl: speech.audioUrl }) res.redirect(speech.audioUrl) } diff --git a/packages/api/src/routers/svc/speech.ts b/packages/api/src/routers/svc/speech.ts index 958750fc9..71c978e5a 100644 --- a/packages/api/src/routers/svc/speech.ts +++ b/packages/api/src/routers/svc/speech.ts @@ -36,7 +36,7 @@ export function speechServiceRouter() { return res.status(200).send('Page not found') } - const text = parseHTML(page.content).document.textContent + const text = parseHTML(page.content).document.documentElement.textContent if (!text) { return res.status(200).send('Page has no text') } diff --git a/packages/api/src/server.ts b/packages/api/src/server.ts index 1945b3e2c..7c9273f92 100755 --- a/packages/api/src/server.ts +++ b/packages/api/src/server.ts @@ -120,7 +120,7 @@ export const createApp = (): { app.use('/svc/pubsub/integrations', integrationsServiceRouter()) app.use('/svc/reminders', remindersServiceRouter()) app.use('/svc/pdf-attachments', pdfAttachmentsRouter()) - app.use('/svc/speech', speechServiceRouter()) + app.use('/svc/text-to-speech', speechServiceRouter()) if (env.dev.isLocal) { app.use('/local/debug', localDebugRouter()) diff --git a/packages/api/src/utils/createTask.ts b/packages/api/src/utils/createTask.ts index c69d5a986..ae9e230b3 100644 --- a/packages/api/src/utils/createTask.ts +++ b/packages/api/src/utils/createTask.ts @@ -337,7 +337,15 @@ export const enqueueTextToSpeech = async ( // If there is no Google Cloud Project Id exposed, it means that we are in local environment if (env.dev.isLocal || !GOOGLE_CLOUD_PROJECT) { - return nanoid() + // Calling the handler function directly. + setTimeout(() => { + axios + .post(env.queue.textToSpeechTaskHandlerUrl, payload) + .catch((error) => { + logger.error(error) + }) + }, 0) + return '' } const createdTasks = await createHttpTaskWithToken({