From 78ac990f0ce903f33735adeefa19ea3a5d8044a7 Mon Sep 17 00:00:00 2001 From: Koki Takahashi Date: Mon, 4 Sep 2023 21:37:23 +0000 Subject: [PATCH] WIP: Implement TTS coefont --- discord/speeches/coefont.ts | 36 ++++++++++++++++++++++++++++++++++++ discord/speeches/index.ts | 8 +++++++- discord/tts.ts | 4 +++- 3 files changed, 46 insertions(+), 2 deletions(-) create mode 100644 discord/speeches/coefont.ts diff --git a/discord/speeches/coefont.ts b/discord/speeches/coefont.ts new file mode 100644 index 00000000..18dd8127 --- /dev/null +++ b/discord/speeches/coefont.ts @@ -0,0 +1,36 @@ +import axios from 'axios'; +import {SynthesizeFunction} from './types'; + +const authorization = 'Bearer **********'; +let prevId: string = null; + +const speech: SynthesizeFunction = async (text: string, voiceType: string, {speed, engine}: {speed: number, engine: string}) => { + console.log('start', text); + const res = await axios.post('https://plbwpbyme3.execute-api.ap-northeast-1.amazonaws.com/production/projects/3d03e5ea-4596-43ce-a2c9-35450496d901/parts/e1106b18-03f0-4859-9cf5-e1cdc92a23ca/blocks', JSON.stringify({ + coefontId: '19d55439-312d-4a1d-a27b-28f0f31bedc5', + text, + ...(prevId ? {prevId} : {}), + }), { + headers: { + authorization, + 'content-type': 'application/json', + }, + }); + console.log(res.data); + const {blockId} = res.data; + prevId = blockId; + const res2 = await axios.get(`https://plbwpbyme3.execute-api.ap-northeast-1.amazonaws.com/production/projects/3d03e5ea-4596-43ce-a2c9-35450496d901/parts/e1106b18-03f0-4859-9cf5-e1cdc92a23ca/blocks/${blockId}/audio`, { + headers: { + authorization, + }, + }); + console.log(res2.data); + const {location} = res2.data; + const res3 = await axios.get(location, { + responseType: 'arraybuffer', + }); + console.log(res3.data); + return {data: res3.data as Buffer}; +}; + +export default speech; diff --git a/discord/speeches/index.ts b/discord/speeches/index.ts index cba8e769..ed5c37f0 100644 --- a/discord/speeches/index.ts +++ b/discord/speeches/index.ts @@ -4,6 +4,7 @@ import azure from './azure'; import google from './google'; import voicetext, {Emotion, EmoLV} from './voicetext'; import voicevox from './voicevox'; +import coefont from './coefont'; const log = logger.child({bot: 'discord'}); @@ -45,6 +46,7 @@ enum Voice { AI = 'AI', AJ = 'AJ', AK = 'AK', + AL = 'AL', } export {Voice}; @@ -61,7 +63,7 @@ export const getDefaultVoiceMeta: () => VoiceMeta = () => ({ }); interface Config { - provider: 'google' | 'amazon' | 'azure' | 'voicetext' | 'voicevox', + provider: 'google' | 'amazon' | 'azure' | 'voicetext' | 'voicevox' | 'coefont', name: string, emotional?: boolean, lang?: string, @@ -105,6 +107,7 @@ export const speechConfig: Map = new Map([ [Voice.AI, {provider: 'google', name: 'ja-JP-Neural2-B', lang: 'ja-JP'}], [Voice.AJ, {provider: 'google', name: 'ja-JP-Neural2-C', lang: 'ja-JP'}], [Voice.AK, {provider: 'google', name: 'ja-JP-Neural2-D', lang: 'ja-JP'}], + [Voice.AL, {provider: 'coefont', name: 'Hiroyuki', lang: 'ja-JP'}], // coming soon // [Voice., {provider: 'voicevox', name: 'whitecul', emotional: true}], // [Voice., {provider: 'voicevox', name: 'goki', emotional: true}], @@ -133,5 +136,8 @@ export const getSpeech = (text: string, voiceType: Voice, meta: VoiceMeta, audio if (config.provider === 'voicevox') { return voicevox(text, config.name, meta); } + if (config.provider === 'coefont') { + return coefont(text, config.name, meta); + } return voicetext(text, config.name, meta); }; diff --git a/discord/tts.ts b/discord/tts.ts index d91d488b..99d3f40c 100644 --- a/discord/tts.ts +++ b/discord/tts.ts @@ -178,7 +178,7 @@ export default class TTS extends EventEmitter { const tokens = message.content.split(/\s+/); const user = message.member.user.id; - if (tokens[0]?.toUpperCase() === 'TTS') { + if (tokens[0]?.toUpperCase() === 'TTSDEV') { if (tokens.length === 1 || tokens[1] === 'start') { mutex.runExclusive(async () => { if (!this.users.has(user)) { @@ -246,6 +246,8 @@ export default class TTS extends EventEmitter { providerName = 'VoiceText Web API'; } else if (config.provider === 'voicevox') { providerName = 'VoiceVox Web API'; + } else if (config.provider === 'coefont') { + providerName = 'CoeFont'; } else { providerName = 'Unknown'; }