echogarden 0.11.21 → 0.12.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -6,6 +6,7 @@ import { Logger } from "../utilities/Logger.js"
6
6
  import { commandExists, logToStderr } from "../utilities/Utilities.js"
7
7
  import path from "node:path"
8
8
  import { loadPackage } from "../utilities/PackageManager.js"
9
+ import { getGlobalOption } from "../api/GlobalOptions.js"
9
10
 
10
11
  const log = logToStderr
11
12
 
@@ -147,25 +148,53 @@ function buildCommandLineArguments(inputFilename: string, outputOptions: FFMpegO
147
148
  }
148
149
 
149
150
  async function getFFMpegExecutablePath() {
150
- if (process.platform == "win32") {
151
- const ffmpegPackagePath = await loadPackage("ffmpeg-6.0-essentials-win64")
152
-
153
- return path.join(ffmpegPackagePath, "ffmpeg.exe")
151
+ // If a global option set for the path, use it
152
+ if (getGlobalOption('ffmpegPath')) {
153
+ return getGlobalOption('ffmpegPath')
154
+ }
155
+
156
+ // If an 'ffmpeg' command exist in system path, use it
157
+ if (await commandExists('ffmpeg')) {
158
+ return 'ffmpeg'
159
+ }
160
+
161
+ // Otherwise, download and use an internal ffmpeg package
162
+ const platform = process.platform
163
+ const arch = process.arch
164
+
165
+ let packageName: string
166
+
167
+ if (platform === 'win32' && arch === 'x64') {
168
+ packageName = 'ffmpeg-6.0-win32-x64'
169
+ } else if (platform === 'win32' && arch === 'ia32') {
170
+ packageName = 'ffmpeg-6.0-win32-ia32'
171
+ } else if (platform === 'darwin' && arch === 'x64') {
172
+ packageName = 'ffmpeg-6.0-darwin-x64'
173
+ } else if (platform === 'darwin' && arch === 'arm64') {
174
+ packageName = 'ffmpeg-6.0-darwin-arm64'
175
+ } else if (platform === 'linux' && arch === 'x64') {
176
+ packageName = 'ffmpeg-6.0-linux-x64'
177
+ } else if (platform === 'linux' && arch === 'ia32') {
178
+ packageName = 'ffmpeg-6.0-linux-ia32'
179
+ } else if (platform === 'linux' && arch === 'arm64') {
180
+ packageName = 'ffmpeg-6.0-linux-arm64'
181
+ } else if (platform === 'linux' && arch === 'arm') {
182
+ packageName = 'ffmpeg-6.0-linux-arm'
183
+ } else if (platform === 'freebsd' && arch === 'x64') {
184
+ packageName = 'ffmpeg-6.0-freebsd-x64'
185
+ } else {
186
+ return undefined
154
187
  }
155
- /* else if (process.platform == "darwin" && process.arch == "x64") {
156
- const ffmpegPackagePath = await loadPackage("ffmpeg-6.0-macos64")
157
188
 
158
- return path.join(ffmpegPackagePath, "ffmpeg")
159
- }
160
- */ else if (process.platform == "linux" && process.arch == "x64") {
161
- const ffmpegPackagePath = await loadPackage("ffmpeg-6.0-linux-amd64")
189
+ const ffmpegPackagePath = await loadPackage(packageName)
190
+
191
+ let filename = packageName
162
192
 
163
- return path.join(ffmpegPackagePath, "ffmpeg")
164
- } else if (await commandExists("ffmpeg")) {
165
- return "ffmpeg"
193
+ if (platform === 'win32') {
194
+ filename += '.exe'
166
195
  }
167
196
 
168
- return undefined
197
+ return path.join(ffmpegPackagePath, filename)
169
198
  }
170
199
 
171
200
  export function getDefaultFFMpegOptionsForSpeech(fileExtension: string, customBitrate?: number) {
@@ -293,6 +293,12 @@ export const voiceList: SynthesisVoice[] = [
293
293
  languages: ["de-DE", "de"],
294
294
  gender: "male",
295
295
  },
296
+ {
297
+ name: "de_DE-mls-medium",
298
+ languages: ["de-DE", "de"],
299
+ gender: "unknown",
300
+ speakerCount: 236
301
+ },
296
302
 
297
303
  {
298
304
  name: "el_GR-rapunzelina-low",
@@ -353,6 +359,12 @@ export const voiceList: SynthesisVoice[] = [
353
359
  languages: ["en-GB", "en"],
354
360
  gender: "female",
355
361
  },
362
+ {
363
+ name: "en_GB-cori-high",
364
+ languages: ["en-GB", "en"],
365
+ gender: "female",
366
+ },
367
+
356
368
 
357
369
  {
358
370
  name: "en_US-amy-low",
@@ -443,6 +455,21 @@ export const voiceList: SynthesisVoice[] = [
443
455
  languages: ["en-US", "en"],
444
456
  gender: "female",
445
457
  },
458
+ {
459
+ name: "en_US-kristin-medium",
460
+ languages: ["en-US", "en"],
461
+ gender: "female",
462
+ },
463
+ {
464
+ name: "en_US-ljspeech-high",
465
+ languages: ["en-US", "en"],
466
+ gender: "female",
467
+ },
468
+ {
469
+ name: "en_US-ljspeech-medium",
470
+ languages: ["en-US", "en"],
471
+ gender: "female",
472
+ },
446
473
 
447
474
  {
448
475
  name: "es_ES-carlfm-x_low",
@@ -476,6 +503,23 @@ export const voiceList: SynthesisVoice[] = [
476
503
  languages: ["es-MX", "es"],
477
504
  gender: "male",
478
505
  },
506
+ {
507
+ name: "es_MX-claude-high",
508
+ languages: ["es-MX", "es"],
509
+ gender: "female",
510
+ },
511
+
512
+ {
513
+ name: "fa_IR-amir-medium",
514
+ languages: ["fa_IR", "fa"],
515
+ gender: "male",
516
+ },
517
+ {
518
+ name: "fa_IR-gyro-medium",
519
+ languages: ["fa_IR", "fa"],
520
+ gender: "male",
521
+ },
522
+
479
523
 
480
524
  {
481
525
  name: "fi_FI-harri-low",
@@ -514,6 +558,17 @@ export const voiceList: SynthesisVoice[] = [
514
558
  gender: "unknown",
515
559
  speakerCount: 2
516
560
  },
561
+ {
562
+ name: "fr_FR-mls-medium",
563
+ languages: ["fr-FR", "fr"],
564
+ gender: "unknown",
565
+ speakerCount: 125
566
+ },
567
+ {
568
+ name: "fr_FR-tom-medium",
569
+ languages: ["fr-FR", "fr"],
570
+ gender: "male",
571
+ },
517
572
 
518
573
  {
519
574
  name: "hu_HU-anna-medium",
@@ -605,6 +660,12 @@ export const voiceList: SynthesisVoice[] = [
605
660
  languages: ["nl-NL", "nl"],
606
661
  gender: "female",
607
662
  },
663
+ {
664
+ name: "nl_NL-mls-medium",
665
+ languages: ["nl-NL", "nl"],
666
+ gender: "unknown",
667
+ speakerCount: 52,
668
+ },
608
669
 
609
670
  {
610
671
  name: "nl_BE-nathalie-x_low",
@@ -705,6 +766,12 @@ export const voiceList: SynthesisVoice[] = [
705
766
  gender: "female",
706
767
  },
707
768
 
769
+ {
770
+ name: "sl_SI-artur-medium",
771
+ languages: ["sl_SI", "sl"],
772
+ gender: "male",
773
+ },
774
+
708
775
  {
709
776
  name: "sr_RS-serbski_institut-medium",
710
777
  languages: ["sr-RS", "sr"],
@@ -734,6 +801,11 @@ export const voiceList: SynthesisVoice[] = [
734
801
  languages: ["tr-TR", "tr"],
735
802
  gender: "male",
736
803
  },
804
+ {
805
+ name: "tr_TR-fettah-medium",
806
+ languages: ["tr-TR", "tr"],
807
+ gender: "male",
808
+ },
737
809
 
738
810
  {
739
811
  name: "uk_UA-lada-x_low",
@@ -1,8 +1,8 @@
1
- import path from "node:path"
2
- import { downloadAndExtractTarball } from "./FileDownloader.js"
3
- import { getAppDataDir, getAppTempDir, ensureDir, existsSync, remove } from "./FileSystem.js"
4
- import { appName } from "../api/Common.js"
5
- import { GaxiosOptions } from "gaxios"
1
+ import path from 'node:path'
2
+ import { downloadAndExtractTarball } from './FileDownloader.js'
3
+ import { getAppDataDir, getAppTempDir, ensureDir, existsSync, remove } from './FileSystem.js'
4
+ import { appName } from '../api/Common.js'
5
+ import { GaxiosOptions } from 'gaxios'
6
6
 
7
7
  export async function loadPackage(packageName: string) {
8
8
  packageName = resolveToVersionedPackageNameIfNeeded(packageName)
@@ -48,7 +48,7 @@ export async function removePackage(packageName: string) {
48
48
  export async function ensureAndGetPackagesDir() {
49
49
  const dataPath = getAppDataDir(appName)
50
50
 
51
- const packagesPath = path.join(dataPath, "packages")
51
+ const packagesPath = path.join(dataPath, 'packages')
52
52
 
53
53
  await ensureDir(packagesPath)
54
54
 
@@ -75,45 +75,69 @@ export function resolveVersionTagForUnversionedPackageName(unversionedPackageNam
75
75
  return packageVersionTagResolutionLookup[unversionedPackageName] || defaultVersionTag
76
76
  }
77
77
 
78
- const basePackageUrl = "https://huggingface.co/echogarden/echogarden-packages/resolve/main/"
78
+ const basePackageUrl = 'https://huggingface.co/echogarden/echogarden-packages/resolve/main/'
79
79
 
80
- const defaultVersionTag = "20230718"
80
+ const defaultVersionTag = '20230718'
81
81
 
82
82
  const packageVersionTagResolutionLookup: { [packageName: string]: string } = {
83
- "sox-14.4.2-linux-minimal": "20230802",
84
-
85
- "vits-de_DE-thorsten_emotional-medium": "20230808",
86
- "vits-en_GB-semaine-medium": "20230808",
87
- "vits-fr_FR-upmc-medium": "20230808",
88
- "vits-lb_LU-marylux-medium": "20230808",
89
- "vits-ro_RO-mihai-medium": "20230808",
90
- "vits-sr_RS-serbski_institut-medium": "20230808",
91
- "vits-tr_TR-dfki-medium": "20230808",
92
-
93
- "vits-cs_CZ-jirka-medium": "20230824",
94
- "vits-de_DE-thorsten-high": "20230824",
95
- "vits-hu_HU-anna-medium": "20230824",
96
- "vits-pt_PT-tugao-medium": "20230824",
97
- "vits-sk_SK-lili-medium": "20230824",
98
- "vits-tr_TR-fahrettin-medium": "20230824",
99
-
100
- "vits-ar_JO-kareem-medium": "20231022",
101
- "vits-cs_CZ-jirka-low": "20231022",
102
- "vits-en_US-hfc_male-medium": "20231022",
103
- "vits-en_US-libritts_r-medium": "20231022",
104
- "vits-hu_HU-imre-medium": "20231022",
105
- "vits-pl_PL-mc_speech-medium": "20231022",
106
-
107
- "whisper-tiny": "20231126",
108
- "whisper-tiny.en": "20231126",
109
- "whisper-base": "20231126",
110
- "whisper-base.en": "20231126",
111
- "whisper-small": "20231126",
112
- "whisper-small.en": "20231126",
113
- "whisper-medium": "20231126",
114
- "whisper-medium.en": "20231126",
115
- "whisper-large-v3": "20231126",
116
-
117
- "vits-ar_JO-kareem-low": "20231126",
118
- "vits-en_US-hfc_female-medium": "20231126",
83
+ 'sox-14.4.2-linux-minimal': '20230802',
84
+
85
+ 'vits-de_DE-thorsten_emotional-medium': '20230808',
86
+ 'vits-en_GB-semaine-medium': '20230808',
87
+ 'vits-fr_FR-upmc-medium': '20230808',
88
+ 'vits-lb_LU-marylux-medium': '20230808',
89
+ 'vits-ro_RO-mihai-medium': '20230808',
90
+ 'vits-sr_RS-serbski_institut-medium': '20230808',
91
+ 'vits-tr_TR-dfki-medium': '20230808',
92
+
93
+ 'vits-cs_CZ-jirka-medium': '20230824',
94
+ 'vits-de_DE-thorsten-high': '20230824',
95
+ 'vits-hu_HU-anna-medium': '20230824',
96
+ 'vits-pt_PT-tugao-medium': '20230824',
97
+ 'vits-sk_SK-lili-medium': '20230824',
98
+ 'vits-tr_TR-fahrettin-medium': '20230824',
99
+
100
+ 'vits-ar_JO-kareem-medium': '20231022',
101
+ 'vits-cs_CZ-jirka-low': '20231022',
102
+ 'vits-en_US-hfc_male-medium': '20231022',
103
+ 'vits-en_US-libritts_r-medium': '20231022',
104
+ 'vits-hu_HU-imre-medium': '20231022',
105
+ 'vits-pl_PL-mc_speech-medium': '20231022',
106
+
107
+ 'whisper-tiny': '20231126',
108
+ 'whisper-tiny.en': '20231126',
109
+ 'whisper-base': '20231126',
110
+ 'whisper-base.en': '20231126',
111
+ 'whisper-small': '20231126',
112
+ 'whisper-small.en': '20231126',
113
+ 'whisper-medium': '20231126',
114
+ 'whisper-medium.en': '20231126',
115
+ 'whisper-large-v3': '20231126',
116
+
117
+ 'vits-ar_JO-kareem-low': '20231126',
118
+ 'vits-en_US-hfc_female-medium': '20231126',
119
+
120
+ 'ffmpeg-6.0-win32-x64': '20240316',
121
+ 'ffmpeg-6.0-win32-ia32': '20240316',
122
+ 'ffmpeg-6.0-darwin-x64': '20240316',
123
+ 'ffmpeg-6.0-darwin-arm64': '20240316',
124
+ 'ffmpeg-6.0-linux-x64': '20240316',
125
+ 'ffmpeg-6.0-linux-ia32': '20240316',
126
+ 'ffmpeg-6.0-linux-arm64': '20240316',
127
+ 'ffmpeg-6.0-linux-arm': '20240316',
128
+ 'ffmpeg-6.0-freebsd-x64': '20240316',
129
+
130
+ 'vits-de_DE-mls-medium': '20240316',
131
+ 'vits-en_GB-cori-high': '20240316',
132
+ 'vits-en_US-kristin-medium': '20240316',
133
+ 'vits-en_US-ljspeech-high': '20240316',
134
+ 'vits-en_US-ljspeech-medium': '20240316',
135
+ 'vits-es_MX-claude-high': '20240316',
136
+ 'vits-fa_IR-amir-medium': '20240316',
137
+ 'vits-fa_IR-gyro-medium': '20240316',
138
+ 'vits-fr_FR-mls-medium': '20240316',
139
+ 'vits-fr_FR-tom-medium': '20240316',
140
+ 'vits-nl_NL-mls-medium': '20240316',
141
+ 'vits-sl_SI-artur-medium': '20240316',
142
+ 'vits-tr_TR-fettah-medium': '20240316',
119
143
  }
@@ -6,6 +6,7 @@ import { RandomGenerator } from './RandomGenerator.js'
6
6
  import { randomUUID, randomBytes } from 'node:crypto'
7
7
  import { Logger } from './Logger.js'
8
8
  import chalk from 'chalk'
9
+ import { shouldCancelCurrentTask } from '../server/Worker.js'
9
10
 
10
11
  const log = logToStderr
11
12
 
@@ -588,6 +589,10 @@ export async function runOperationWithRetries<R>(
588
589
 
589
590
  return result
590
591
  } catch (e: any) {
592
+ if (shouldCancelCurrentTask()) {
593
+ throw new Error("Canceled")
594
+ }
595
+
591
596
  logger.setAsActiveLogger()
592
597
 
593
598
  logger.logTitledMessage(`Error`, e.message, chalk.redBright)