echogarden
Version:
An easy-to-use speech toolset. Includes tools for synthesis, recognition, alignment, speech translation, language detection, source separation and more.
223 lines (180 loc) • 6.94 kB
text/typescript
import { downloadAndExtractTarball } from './FileDownloader.js'
import { getAppDataDir, ensureDir, existsSync, remove } from './FileSystem.js'
import { appName } from '../api/Common.js'
import { GaxiosOptions } from 'gaxios'
import { getAppTempDir, joinPath } from './PathUtilities.js'
import { getGlobalOption } from '../api/GlobalOptions.js'
export async function loadPackage(packageName: string) {
packageName = resolveToVersionedPackageNameIfNeeded(packageName)
const packagesPath = await ensureAndGetPackagesDir()
const packagePath = joinPath(packagesPath, packageName)
if (existsSync(packagePath)) {
return packagePath
}
const packageBaseURL = getGlobalOption('packageBaseURL')
const tempPath = getAppTempDir(appName)
const headers = {
}
const options: GaxiosOptions = {
url: `${packageBaseURL}${packageName}.tar.gz`,
headers
}
await downloadAndExtractTarball(
options,
packagesPath,
tempPath,
packageName,
)
return packagePath
}
export async function removePackage(packageName: string) {
packageName = resolveToVersionedPackageNameIfNeeded(packageName)
const packagesPath = await ensureAndGetPackagesDir()
const packagePath = joinPath(packagesPath, packageName)
await remove(packagePath)
}
export async function ensureAndGetPackagesDir() {
const dataPath = getAppDataDir(appName)
const packagesPath = joinPath(dataPath, 'packages')
await ensureDir(packagesPath)
return packagesPath
}
export function resolveToVersionedPackageNameIfNeeded(packageName: string) {
const versionTag = getVersionTagFromPackageName(packageName)
if (versionTag) {
return packageName
}
const resolvedVersionTag = resolveVersionTagForUnversionedPackageName(packageName)
return packageName = `${packageName}-${resolvedVersionTag}`
}
export function getVersionTagFromPackageName(packageName: string) {
return packageName.match(/.*\-([0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9](_[0-9]+)?)$/)?.[1]
}
export function resolveVersionTagForUnversionedPackageName(unversionedPackageName: string) {
return packageVersionTagResolutionLookup[unversionedPackageName] || defaultVersionTag
}
const defaultVersionTag = '20230718'
const packageVersionTagResolutionLookup: { [packageName: string]: string } = {
// SOX binary
'sox-14.4.2-linux-minimal': '20230802',
// VITS voices
'vits-de_DE-thorsten_emotional-medium': '20230808',
'vits-en_GB-semaine-medium': '20230808',
'vits-fr_FR-upmc-medium': '20230808',
'vits-lb_LU-marylux-medium': '20230808',
'vits-ro_RO-mihai-medium': '20230808',
'vits-sr_RS-serbski_institut-medium': '20230808',
'vits-tr_TR-dfki-medium': '20230808',
'vits-cs_CZ-jirka-medium': '20230824',
'vits-de_DE-thorsten-high': '20230824',
'vits-hu_HU-anna-medium': '20230824',
'vits-pt_PT-tugao-medium': '20230824',
'vits-sk_SK-lili-medium': '20230824',
'vits-tr_TR-fahrettin-medium': '20230824',
'vits-ar_JO-kareem-medium': '20231022',
'vits-cs_CZ-jirka-low': '20231022',
'vits-en_US-hfc_male-medium': '20231022',
'vits-en_US-libritts_r-medium': '20231022',
'vits-hu_HU-imre-medium': '20231022',
'vits-pl_PL-mc_speech-medium': '20231022',
'vits-ar_JO-kareem-low': '20231126',
'vits-en_US-hfc_female-medium': '20231126',
'vits-de_DE-mls-medium': '20240316',
'vits-en_GB-cori-high': '20240316',
'vits-en_US-kristin-medium': '20240316',
'vits-en_US-ljspeech-high': '20240316',
'vits-en_US-ljspeech-medium': '20240316',
'vits-es_MX-claude-high': '20240316',
'vits-fa_IR-amir-medium': '20240316',
'vits-fa_IR-gyro-medium': '20240316',
'vits-fr_FR-mls-medium': '20240316',
'vits-fr_FR-tom-medium': '20240316',
'vits-nl_NL-mls-medium': '20240316',
'vits-sl_SI-artur-medium': '20240316',
'vits-tr_TR-fettah-medium': '20240316',
'vits-it_IT-paola-medium': '20241001',
'vits-en_US-norman-medium': '20241001',
'vits-en_US-john-medium': '20241001',
'vits-en_US-bryce-medium': '20241001',
'vits-en_GB-cori-medium': '20241001',
'vits-cy_GB-gwryw_gogleddol-medium': '20241001',
// Kokoro models
'kokoro-82m-v1.0-fp32': '20250209',
'kokoro-82m-v1.0-quantized': '20250209',
'kokoro-82m-v1.0-voices': '20250209',
// Whisper (integrated engine) models
'whisper-tiny': '20231126',
'whisper-tiny.en': '20231126',
'whisper-base': '20231126',
'whisper-base.en': '20231126',
'whisper-small': '20231126',
'whisper-small.en': '20231126',
'whisper-medium': '20231126',
'whisper-medium.en': '20231126',
'whisper-large-v3-turbo-fp16': '20241002',
// Whisper tiktoken data
'whisper-tiktoken-data': '20240408',
// FFMpeg binaries
'ffmpeg-6.0-win32-x64': '20240316',
'ffmpeg-6.0-win32-ia32': '20240316',
'ffmpeg-6.1-win32-arm64': '20250819',
'ffmpeg-6.0-darwin-x64': '20240316',
'ffmpeg-6.0-darwin-arm64': '20240316',
'ffmpeg-6.0-linux-x64': '20240316',
'ffmpeg-6.0-linux-ia32': '20240316',
'ffmpeg-6.0-linux-arm64': '20240316',
'ffmpeg-6.0-linux-arm': '20240316',
'ffmpeg-6.0-freebsd-x64': '20240316',
// MDXNET models
'mdxnet-UVR_MDXNET_1_9703': '20240330',
'mdxnet-UVR_MDXNET_2_9682': '20240330',
'mdxnet-UVR_MDXNET_3_9662': '20240330',
'mdxnet-UVR_MDXNET_KARA': '20240330',
'mdxnet-UVR_MDXNET_Main': '20241008',
'mdxnet-Kim_Vocal_1': '20241008',
'mdxnet-Kim_Vocal_2': '20241008',
// whisper.cpp models
'whisper.cpp-tiny': '20240405',
'whisper.cpp-tiny-q5_1': '20240405',
'whisper.cpp-tiny.en': '20240405',
'whisper.cpp-tiny.en-q5_1': '20240405',
'whisper.cpp-tiny.en-q8_0': '20240405',
'whisper.cpp-base': '20240405',
'whisper.cpp-base-q5_1': '20240405',
'whisper.cpp-base.en': '20240405',
'whisper.cpp-base.en-q5_1': '20240405',
'whisper.cpp-small': '20240405',
'whisper.cpp-small-q5_1': '20240405',
'whisper.cpp-small.en': '20240405',
'whisper.cpp-small.en-q5_1': '20240405',
'whisper.cpp-medium': '20240405',
'whisper.cpp-medium-q5_0': '20240405',
'whisper.cpp-medium.en': '20240405',
'whisper.cpp-medium.en-q5_0': '20240405',
'whisper.cpp-large-v1': '20240405',
'whisper.cpp-large-v2': '20240405',
'whisper.cpp-large-v2-q5_0': '20240405',
'whisper.cpp-large-v3': '20240405',
'whisper.cpp-large-v3-q5_0': '20240405',
'whisper.cpp-large-v3-turbo': '20241003',
'whisper.cpp-large-v3-turbo-q5_0': '20241003',
// whisper.cpp binaries
'whisper.cpp-binaries-windows-x64-cpu-latest': '20250502',
'whisper.cpp-binaries-windows-x64-cublas-12.4.0-latest': '20250502',
'whisper.cpp-binaries-linux-x64-cpu-latest': '20250502',
'whisper.cpp-binaries-linux-x64-cublas-12.4.0-latest': '20250502',
// E5 models
'xenova-multilingual-e5-small-q8': '20240504',
'xenova-multilingual-e5-small-fp16': '20240514',
'xenova-multilingual-e5-base-fp16': '20240514',
'xenova-multilingual-e5-base-q8': '20240514',
'xenova-multilingual-e5-large-q8': '20240514',
// NLLB models
'xenova-nllb-200-distilled-600M-q8': '20240505',
// W2V-BERT models
'w2v-bert-2.0-int8': '20240517',
'w2v-bert-2.0-uint8': '20240517',
// NSNet2 models
'nsnet2-20ms-baseline': '20242610',
'nsnet2-20ms-48k-baseline': '20242610',
}