diff --git a/apps/showcase/src/components/voice.js b/apps/showcase/src/components/voice.js index 62b1e2f..c68d585 100644 --- a/apps/showcase/src/components/voice.js +++ b/apps/showcase/src/components/voice.js @@ -95,7 +95,7 @@ export default class Voice { this.#default.language.voice = this.#voice.languages[0] this.#config.language = this.#default.language.voice this.#voice.locations = this.#getVoiceLocations() - this.#voice.list = Object.keys(this.#getVoices()) + this.#voice.list = this.#charwordTable.availability[this.#config.language] } success() { @@ -206,7 +206,7 @@ export default class Voice { const content = subtitle.text const cvInfo = this.#charwordTable.voiceLangs[this.subtitleLanguage][ - this.#config.language + this.#config.language ] document.getElementById('voice-title').innerText = title document.getElementById('voice-subtitle').innerText = content @@ -251,15 +251,7 @@ export default class Voice { #nextVoice() { const getVoiceId = () => { - let list = this.#voice.list - if ( - this.#config.language === 'EN' || - this.#config.language === 'KR' - ) { - // filter out CN_043 as this voice is not available in en and kr - list = list.filter((item) => item !== 'CN_043') - } - const id = list[Math.floor(Math.random() * list.length)] + const id = this.#voice.list[Math.floor(Math.random() * this.#voice.list.length)] return id === this.#voice.id.last ? getVoiceId() : id } this.#playVoice(getVoiceId()) @@ -360,8 +352,10 @@ export default class Voice { set language(lang) { if (this.#voice.languages.includes(lang)) { this.#config.language = lang + this.#voice.list = this.#charwordTable.availability[lang] } else { this.#config.language = this.#default.language.voice + this.#voice.list = this.#charwordTable.availability[this.#config.language] } const availableSubtitleLang = this.#getSubtitleLanguages() if (!availableSubtitleLang.includes(this.#config.subtitle.language)) { diff --git a/packages/charword-table/index.ts b/packages/charword-table/index.ts index 694d92c..566f0da 100644 --- a/packages/charword-table/index.ts +++ b/packages/charword-table/index.ts @@ -89,6 +89,7 @@ export const build = async (namesToBuild: string[]) => { const voiceJson = {} as OperatorCharwordTable voiceJson.voiceLangs = {} voiceJson.subtitleLangs = {} + voiceJson.availability = {} const subtitleInfo = Object.keys(charwordTableLookup.info) as Region[] const voiceList = {} as { [key: string]: string[] @@ -119,65 +120,69 @@ export const build = async (namesToBuild: string[]) => { ) } }) - let voiceLangs = [] as string[] try { - voiceLangs = getLangs(name, voiceJson).voiceLangs + const voiceLangs = getLangs(name, voiceJson).voiceLangs + + // check whether voice files has been added + const customVoiceName = voiceLangs.filter( + (i) => !config.dir_name.voice.sub.map((e) => e.lang).includes(i) + )[0] + const voiceLangMapping = config.dir_name.voice.sub + .filter((e) => { + return ( + voiceLangs.includes(e.lang) || + (e.lang === 'CUSTOM' && + typeof customVoiceName !== 'undefined') + ) + }) + .map((e) => { + return { + name: e.name, + lang: e.lang === 'CUSTOM' ? customVoiceName : e.lang, + lookup_region: e.lookup_region.replace('_', '-'), + } + }) + for (const voiceSubFolderMapping of voiceLangMapping) { + const voiceSubFolder = path.join( + OPERATOR_SOURCE_FOLDER, + name, + config.dir_name.voice.main, + voiceSubFolderMapping.name + ) + const voiceFileList = file.readdirSync(voiceSubFolder) + voiceJson.availability[voiceSubFolderMapping.lang] = + voiceFileList.map((item) => item.replace('.ogg', '')) + voiceJson.availability[voiceSubFolderMapping.lang].sort() + voiceList[voiceSubFolderMapping.lookup_region].forEach( + (item) => { + // an exception for detecting file existence + if ( + item.endsWith('043') && + voiceFileList.includes(`${item}.ogg`) && + (voiceSubFolderMapping.name === 'kr' || + voiceSubFolderMapping.name === 'en') + ) { + console.log( + `Voice folder ${voiceSubFolderMapping.name} for ${name} has ${item}.ogg` + ) + } + if ( + !voiceFileList.includes(`${item}.ogg`) && + // make an exception + !item.endsWith('043') + ) { + err.push( + `Voice folder ${voiceSubFolderMapping.name} for ${name} is missing ${item}.ogg` + ) + } + } + ) + } file.writeSync(JSON.stringify(voiceJson), getDistDir(name)) } catch (e) { console.log(`charword_table is not available`, e) } - - // check whether voice files has been added - const customVoiceName = voiceLangs.filter( - (i) => !config.dir_name.voice.sub.map((e) => e.lang).includes(i) - )[0] - const voiceLangMapping = config.dir_name.voice.sub - .filter((e) => { - return ( - voiceLangs.includes(e.lang) || - (e.lang === 'CUSTOM' && - typeof customVoiceName !== 'undefined') - ) - }) - .map((e) => { - return { - name: e.name, - lang: e.lang === 'CUSTOM' ? customVoiceName : e.lang, - lookup_region: e.lookup_region.replace('_', '-'), - } - }) - for (const voiceSubFolderMapping of voiceLangMapping) { - const voiceSubFolder = path.join( - OPERATOR_SOURCE_FOLDER, - name, - config.dir_name.voice.main, - voiceSubFolderMapping.name - ) - const voiceFileList = file.readdirSync(voiceSubFolder) - voiceList[voiceSubFolderMapping.lookup_region].map((item) => { - // an exception for detecting file existence - if ( - item.endsWith('043') && - voiceFileList.includes(`${item}.ogg`) && - (voiceSubFolderMapping.name === 'kr' || - voiceSubFolderMapping.name === 'en') - ) { - console.log( - `Voice folder ${voiceSubFolderMapping.name} for ${name} has ${item}.ogg` - ) - } - if ( - !voiceFileList.includes(`${item}.ogg`) && - // make an exception - !item.endsWith('043') - ) { - err.push( - `Voice folder ${voiceSubFolderMapping.name} for ${name} is missing ${item}.ogg` - ) - } - }) - } } return err diff --git a/packages/charword-table/types.ts b/packages/charword-table/types.ts index 528b6e1..20a6571 100644 --- a/packages/charword-table/types.ts +++ b/packages/charword-table/types.ts @@ -90,6 +90,9 @@ export type CharwordTableJson = { } export type OperatorCharwordTable = { + availability: { + [languageCode: string]: string[] + } voiceLangs: { [languageCode: string]: { [voiceLangType: string]: string[]