echogarden 0.0.1 → 0.1.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.
Files changed (295) hide show
  1. package/README.md +59 -1
  2. package/data/lexicons/heteronyms.json +674 -0
  3. package/data/schemas/options.json +1057 -0
  4. package/data/tables/lcid-table.json +7427 -0
  5. package/dist/alignment/DTWMfccSequenceAlignment.d.ts +2 -0
  6. package/dist/alignment/DTWMfccSequenceAlignment.js +26 -0
  7. package/dist/alignment/DTWMfccSequenceAlignment.js.map +1 -0
  8. package/dist/alignment/DTWSequenceAlignment.d.ts +5 -0
  9. package/dist/alignment/DTWSequenceAlignment.js +99 -0
  10. package/dist/alignment/DTWSequenceAlignment.js.map +1 -0
  11. package/dist/alignment/DTWSequenceAlignmentWindowed.d.ts +5 -0
  12. package/dist/alignment/DTWSequenceAlignmentWindowed.js +161 -0
  13. package/dist/alignment/DTWSequenceAlignmentWindowed.js.map +1 -0
  14. package/dist/alignment/LevenshteinSequenceAlignment.d.ts +5 -0
  15. package/dist/alignment/LevenshteinSequenceAlignment.js +102 -0
  16. package/dist/alignment/LevenshteinSequenceAlignment.js.map +1 -0
  17. package/dist/alignment/SpeechAlignment.d.ts +27 -0
  18. package/dist/alignment/SpeechAlignment.js +266 -0
  19. package/dist/alignment/SpeechAlignment.js.map +1 -0
  20. package/dist/api/API.d.ts +8 -0
  21. package/dist/api/API.js +10 -0
  22. package/dist/api/API.js.map +1 -0
  23. package/dist/api/APIOptions.d.ts +12 -0
  24. package/dist/api/APIOptions.js +2 -0
  25. package/dist/api/APIOptions.js.map +1 -0
  26. package/dist/api/Alignment.d.ts +32 -0
  27. package/dist/api/Alignment.js +134 -0
  28. package/dist/api/Alignment.js.map +1 -0
  29. package/dist/api/Denoising.d.ts +14 -0
  30. package/dist/api/Denoising.js +66 -0
  31. package/dist/api/Denoising.js.map +1 -0
  32. package/dist/api/Globals.d.ts +1 -0
  33. package/dist/api/Globals.js +2 -0
  34. package/dist/api/Globals.js.map +1 -0
  35. package/dist/api/LanguageDetection.d.ts +49 -0
  36. package/dist/api/LanguageDetection.js +118 -0
  37. package/dist/api/LanguageDetection.js.map +1 -0
  38. package/dist/api/Recognition.d.ts +49 -0
  39. package/dist/api/Recognition.js +162 -0
  40. package/dist/api/Recognition.js.map +1 -0
  41. package/dist/api/Synthesis.d.ts +125 -0
  42. package/dist/api/Synthesis.js +892 -0
  43. package/dist/api/Synthesis.js.map +1 -0
  44. package/dist/api/Translation.d.ts +25 -0
  45. package/dist/api/Translation.js +69 -0
  46. package/dist/api/Translation.js.map +1 -0
  47. package/dist/api/Vad.d.ts +25 -0
  48. package/dist/api/Vad.js +88 -0
  49. package/dist/api/Vad.js.map +1 -0
  50. package/dist/audio/AudioBufferConversion.d.ts +15 -0
  51. package/dist/audio/AudioBufferConversion.js +228 -0
  52. package/dist/audio/AudioBufferConversion.js.map +1 -0
  53. package/dist/audio/AudioPlayer.d.ts +9 -0
  54. package/dist/audio/AudioPlayer.js +232 -0
  55. package/dist/audio/AudioPlayer.js.map +1 -0
  56. package/dist/audio/AudioRecorder.d.ts +3 -0
  57. package/dist/audio/AudioRecorder.js +68 -0
  58. package/dist/audio/AudioRecorder.js.map +1 -0
  59. package/dist/audio/AudioUtilities.d.ts +48 -0
  60. package/dist/audio/AudioUtilities.js +209 -0
  61. package/dist/audio/AudioUtilities.js.map +1 -0
  62. package/dist/audio/SoxPath.d.ts +1 -0
  63. package/dist/audio/SoxPath.js +19 -0
  64. package/dist/audio/SoxPath.js.map +1 -0
  65. package/dist/cli/CLI.d.ts +8 -0
  66. package/dist/cli/CLI.js +860 -0
  67. package/dist/cli/CLI.js.map +1 -0
  68. package/dist/cli/CLIConfigFile.d.ts +3 -0
  69. package/dist/cli/CLIConfigFile.js +62 -0
  70. package/dist/cli/CLIConfigFile.js.map +1 -0
  71. package/dist/cli/CLILauncher.d.ts +2 -0
  72. package/dist/cli/CLILauncher.js +22 -0
  73. package/dist/cli/CLILauncher.js.map +1 -0
  74. package/dist/cli/CLIOptionsSchema.d.ts +5 -0
  75. package/dist/cli/CLIOptionsSchema.js +36 -0
  76. package/dist/cli/CLIOptionsSchema.js.map +1 -0
  77. package/dist/cli/CLIParser.d.ts +6 -0
  78. package/dist/cli/CLIParser.js +34 -0
  79. package/dist/cli/CLIParser.js.map +1 -0
  80. package/dist/cli/CLIStarter.d.ts +1 -0
  81. package/dist/cli/CLIStarter.js +3 -0
  82. package/dist/cli/CLIStarter.js.map +1 -0
  83. package/dist/codecs/FFMpegTranscoder.d.ts +20 -0
  84. package/dist/codecs/FFMpegTranscoder.js +169 -0
  85. package/dist/codecs/FFMpegTranscoder.js.map +1 -0
  86. package/dist/codecs/TIMITCodec.d.ts +9 -0
  87. package/dist/codecs/TIMITCodec.js +14 -0
  88. package/dist/codecs/TIMITCodec.js.map +1 -0
  89. package/dist/codecs/WaveCodec.d.ts +19 -0
  90. package/dist/codecs/WaveCodec.js +208 -0
  91. package/dist/codecs/WaveCodec.js.map +1 -0
  92. package/dist/denoising/RNNoise.d.ts +6 -0
  93. package/dist/denoising/RNNoise.js +68 -0
  94. package/dist/denoising/RNNoise.js.map +1 -0
  95. package/dist/dsp/BiquadFilter.d.ts +26 -0
  96. package/dist/dsp/BiquadFilter.js +399 -0
  97. package/dist/dsp/BiquadFilter.js.map +1 -0
  98. package/dist/dsp/FFT.d.ts +9 -0
  99. package/dist/dsp/FFT.js +135 -0
  100. package/dist/dsp/FFT.js.map +1 -0
  101. package/dist/dsp/MFCC.d.ts +25 -0
  102. package/dist/dsp/MFCC.js +162 -0
  103. package/dist/dsp/MFCC.js.map +1 -0
  104. package/dist/dsp/MelSpectogram.d.ts +19 -0
  105. package/dist/dsp/MelSpectogram.js +102 -0
  106. package/dist/dsp/MelSpectogram.js.map +1 -0
  107. package/dist/dsp/Rubberband.d.ts +52 -0
  108. package/dist/dsp/Rubberband.js +186 -0
  109. package/dist/dsp/Rubberband.js.map +1 -0
  110. package/dist/dsp/Sonic.d.ts +2 -0
  111. package/dist/dsp/Sonic.js +39 -0
  112. package/dist/dsp/Sonic.js.map +1 -0
  113. package/dist/dsp/SpeexResampler.d.ts +3 -0
  114. package/dist/dsp/SpeexResampler.js +53 -0
  115. package/dist/dsp/SpeexResampler.js.map +1 -0
  116. package/dist/math/VectorMath.d.ts +70 -0
  117. package/dist/math/VectorMath.js +564 -0
  118. package/dist/math/VectorMath.js.map +1 -0
  119. package/dist/nlp/ChineseSegmentation.d.ts +1 -0
  120. package/dist/nlp/ChineseSegmentation.js +53 -0
  121. package/dist/nlp/ChineseSegmentation.js.map +1 -0
  122. package/dist/nlp/CompromiseNLP.d.ts +15 -0
  123. package/dist/nlp/CompromiseNLP.js +66 -0
  124. package/dist/nlp/CompromiseNLP.js.map +1 -0
  125. package/dist/nlp/EspeakPhonemizer.d.ts +4 -0
  126. package/dist/nlp/EspeakPhonemizer.js +133 -0
  127. package/dist/nlp/EspeakPhonemizer.js.map +1 -0
  128. package/dist/nlp/IPA.d.ts +19 -0
  129. package/dist/nlp/IPA.js +113 -0
  130. package/dist/nlp/IPA.js.map +1 -0
  131. package/dist/nlp/JapaneseSegmentation.d.ts +1 -0
  132. package/dist/nlp/JapaneseSegmentation.js +40 -0
  133. package/dist/nlp/JapaneseSegmentation.js.map +1 -0
  134. package/dist/nlp/Lexicon.d.ts +17 -0
  135. package/dist/nlp/Lexicon.js +6 -0
  136. package/dist/nlp/Lexicon.js.map +1 -0
  137. package/dist/nlp/PhoneConversion.d.ts +6 -0
  138. package/dist/nlp/PhoneConversion.js +467 -0
  139. package/dist/nlp/PhoneConversion.js.map +1 -0
  140. package/dist/nlp/Segmentation.d.ts +41 -0
  141. package/dist/nlp/Segmentation.js +158 -0
  142. package/dist/nlp/Segmentation.js.map +1 -0
  143. package/dist/nlp/TextNormalizer.d.ts +4 -0
  144. package/dist/nlp/TextNormalizer.js +69 -0
  145. package/dist/nlp/TextNormalizer.js.map +1 -0
  146. package/dist/recognition/AmazonTranscribeSTT.d.ts +6 -0
  147. package/dist/recognition/AmazonTranscribeSTT.js +79 -0
  148. package/dist/recognition/AmazonTranscribeSTT.js.map +1 -0
  149. package/dist/recognition/AzureCognitiveServicesSTT.d.ts +7 -0
  150. package/dist/recognition/AzureCognitiveServicesSTT.js +51 -0
  151. package/dist/recognition/AzureCognitiveServicesSTT.js.map +1 -0
  152. package/dist/recognition/GoogleCloudSTT.d.ts +7 -0
  153. package/dist/recognition/GoogleCloudSTT.js +66 -0
  154. package/dist/recognition/GoogleCloudSTT.js.map +1 -0
  155. package/dist/recognition/SileroSTT.d.ts +9 -0
  156. package/dist/recognition/SileroSTT.js +125 -0
  157. package/dist/recognition/SileroSTT.js.map +1 -0
  158. package/dist/recognition/VoskSTT.d.ts +10 -0
  159. package/dist/recognition/VoskSTT.js +78 -0
  160. package/dist/recognition/VoskSTT.js.map +1 -0
  161. package/dist/recognition/WhisperSTT.d.ts +69 -0
  162. package/dist/recognition/WhisperSTT.js +977 -0
  163. package/dist/recognition/WhisperSTT.js.map +1 -0
  164. package/dist/server/Server.d.ts +1 -0
  165. package/dist/server/Server.js +18 -0
  166. package/dist/server/Server.js.map +1 -0
  167. package/dist/speech-language-detection/SileroLanguageDetection.d.ts +9 -0
  168. package/dist/speech-language-detection/SileroLanguageDetection.js +47 -0
  169. package/dist/speech-language-detection/SileroLanguageDetection.js.map +1 -0
  170. package/dist/subtitles/Subtitles.d.ts +25 -0
  171. package/dist/subtitles/Subtitles.js +286 -0
  172. package/dist/subtitles/Subtitles.js.map +1 -0
  173. package/dist/synthesis/AwsPollyTTS.d.ts +7 -0
  174. package/dist/synthesis/AwsPollyTTS.js +51 -0
  175. package/dist/synthesis/AwsPollyTTS.js.map +1 -0
  176. package/dist/synthesis/AzureCognitiveServicesTTS.d.ts +9 -0
  177. package/dist/synthesis/AzureCognitiveServicesTTS.js +103 -0
  178. package/dist/synthesis/AzureCognitiveServicesTTS.js.map +1 -0
  179. package/dist/synthesis/CoquiServerTTS.d.ts +6 -0
  180. package/dist/synthesis/CoquiServerTTS.js +22 -0
  181. package/dist/synthesis/CoquiServerTTS.js.map +1 -0
  182. package/dist/synthesis/ElevenLabsTTS.d.ts +8 -0
  183. package/dist/synthesis/ElevenLabsTTS.js +48 -0
  184. package/dist/synthesis/ElevenLabsTTS.js.map +1 -0
  185. package/dist/synthesis/EspeakTTS.d.ts +46 -0
  186. package/dist/synthesis/EspeakTTS.js +353 -0
  187. package/dist/synthesis/EspeakTTS.js.map +1 -0
  188. package/dist/synthesis/FliteTTS.d.ts +17 -0
  189. package/dist/synthesis/FliteTTS.js +326 -0
  190. package/dist/synthesis/FliteTTS.js.map +1 -0
  191. package/dist/synthesis/GoogleCloudTTS.d.ts +16 -0
  192. package/dist/synthesis/GoogleCloudTTS.js +72 -0
  193. package/dist/synthesis/GoogleCloudTTS.js.map +1 -0
  194. package/dist/synthesis/GoogleTranslateTTS.d.ts +13 -0
  195. package/dist/synthesis/GoogleTranslateTTS.js +177 -0
  196. package/dist/synthesis/GoogleTranslateTTS.js.map +1 -0
  197. package/dist/synthesis/MicrosoftEdgeTTS.d.ts +10 -0
  198. package/dist/synthesis/MicrosoftEdgeTTS.js +216 -0
  199. package/dist/synthesis/MicrosoftEdgeTTS.js.map +1 -0
  200. package/dist/synthesis/SamTTS.d.ts +4 -0
  201. package/dist/synthesis/SamTTS.js +21 -0
  202. package/dist/synthesis/SamTTS.js.map +1 -0
  203. package/dist/synthesis/SapiTTS.d.ts +9 -0
  204. package/dist/synthesis/SapiTTS.js +211 -0
  205. package/dist/synthesis/SapiTTS.js.map +1 -0
  206. package/dist/synthesis/StreamlabsPollyTTS.d.ts +12 -0
  207. package/dist/synthesis/StreamlabsPollyTTS.js +88 -0
  208. package/dist/synthesis/StreamlabsPollyTTS.js.map +1 -0
  209. package/dist/synthesis/SvoxPicoTTS.d.ts +11 -0
  210. package/dist/synthesis/SvoxPicoTTS.js +236 -0
  211. package/dist/synthesis/SvoxPicoTTS.js.map +1 -0
  212. package/dist/synthesis/VitsTTS.d.ts +27 -0
  213. package/dist/synthesis/VitsTTS.js +359 -0
  214. package/dist/synthesis/VitsTTS.js.map +1 -0
  215. package/dist/tests/Test.d.ts +1 -0
  216. package/dist/tests/Test.js +10 -0
  217. package/dist/tests/Test.js.map +1 -0
  218. package/dist/text-language-detection/FastTextLanguageDetection.d.ts +2 -0
  219. package/dist/text-language-detection/FastTextLanguageDetection.js +38 -0
  220. package/dist/text-language-detection/FastTextLanguageDetection.js.map +1 -0
  221. package/dist/text-language-detection/TinyLDLanguageDetection.d.ts +2 -0
  222. package/dist/text-language-detection/TinyLDLanguageDetection.js +12 -0
  223. package/dist/text-language-detection/TinyLDLanguageDetection.js.map +1 -0
  224. package/dist/utilities/BinaryArrayConversion.d.ts +15 -0
  225. package/dist/utilities/BinaryArrayConversion.js +115 -0
  226. package/dist/utilities/BinaryArrayConversion.js.map +1 -0
  227. package/dist/utilities/Compression.d.ts +4 -0
  228. package/dist/utilities/Compression.js +67 -0
  229. package/dist/utilities/Compression.js.map +1 -0
  230. package/dist/utilities/FileDownloader.d.ts +3 -0
  231. package/dist/utilities/FileDownloader.js +147 -0
  232. package/dist/utilities/FileDownloader.js.map +1 -0
  233. package/dist/utilities/FileSystem.d.ts +30 -0
  234. package/dist/utilities/FileSystem.js +141 -0
  235. package/dist/utilities/FileSystem.js.map +1 -0
  236. package/dist/utilities/Hashing.d.ts +10 -0
  237. package/dist/utilities/Hashing.js +169 -0
  238. package/dist/utilities/Hashing.js.map +1 -0
  239. package/dist/utilities/Locale.d.ts +9 -0
  240. package/dist/utilities/Locale.js +65 -0
  241. package/dist/utilities/Locale.js.map +1 -0
  242. package/dist/utilities/Logger.d.ts +11 -0
  243. package/dist/utilities/Logger.js +49 -0
  244. package/dist/utilities/Logger.js.map +1 -0
  245. package/dist/utilities/NdArrayUtilities.d.ts +3 -0
  246. package/dist/utilities/NdArrayUtilities.js +22 -0
  247. package/dist/utilities/NdArrayUtilities.js.map +1 -0
  248. package/dist/utilities/ObjectUtilities.d.ts +4 -0
  249. package/dist/utilities/ObjectUtilities.js +132 -0
  250. package/dist/utilities/ObjectUtilities.js.map +1 -0
  251. package/dist/utilities/OpenPromise.d.ts +6 -0
  252. package/dist/utilities/OpenPromise.js +12 -0
  253. package/dist/utilities/OpenPromise.js.map +1 -0
  254. package/dist/utilities/PackageManager.d.ts +4 -0
  255. package/dist/utilities/PackageManager.js +46 -0
  256. package/dist/utilities/PackageManager.js.map +1 -0
  257. package/dist/utilities/RandomGenerator.d.ts +35 -0
  258. package/dist/utilities/RandomGenerator.js +149 -0
  259. package/dist/utilities/RandomGenerator.js.map +1 -0
  260. package/dist/utilities/TarballMaker.d.ts +4 -0
  261. package/dist/utilities/TarballMaker.js +50 -0
  262. package/dist/utilities/TarballMaker.js.map +1 -0
  263. package/dist/utilities/Timeline.d.ts +20 -0
  264. package/dist/utilities/Timeline.js +110 -0
  265. package/dist/utilities/Timeline.js.map +1 -0
  266. package/dist/utilities/Timer.d.ts +13 -0
  267. package/dist/utilities/Timer.js +70 -0
  268. package/dist/utilities/Timer.js.map +1 -0
  269. package/dist/utilities/Utilities.d.ts +68 -0
  270. package/dist/utilities/Utilities.js +305 -0
  271. package/dist/utilities/Utilities.js.map +1 -0
  272. package/dist/utilities/WasmMemoryManager.d.ts +142 -0
  273. package/dist/utilities/WasmMemoryManager.js +407 -0
  274. package/dist/utilities/WasmMemoryManager.js.map +1 -0
  275. package/dist/utilities/WebReader.d.ts +1 -0
  276. package/dist/utilities/WebReader.js +47 -0
  277. package/dist/utilities/WebReader.js.map +1 -0
  278. package/dist/utilities/WikipediaReader.d.ts +1 -0
  279. package/dist/utilities/WikipediaReader.js +31 -0
  280. package/dist/utilities/WikipediaReader.js.map +1 -0
  281. package/dist/voice-activity-detection/SileroVAD.d.ts +13 -0
  282. package/dist/voice-activity-detection/SileroVAD.js +58 -0
  283. package/dist/voice-activity-detection/SileroVAD.js.map +1 -0
  284. package/dist/voice-activity-detection/WebRtcVAD.d.ts +3 -0
  285. package/dist/voice-activity-detection/WebRtcVAD.js +53 -0
  286. package/dist/voice-activity-detection/WebRtcVAD.js.map +1 -0
  287. package/docs/CLI.md +234 -0
  288. package/docs/Development.md +3 -0
  289. package/docs/Engines.md +80 -0
  290. package/docs/Licenses.md +37 -0
  291. package/docs/Options.md +192 -0
  292. package/docs/Roadmap.md +16 -0
  293. package/docs/Technical.md +72 -0
  294. package/package.json +119 -19
  295. package/cli.js +0 -3
@@ -0,0 +1,103 @@
1
+ import SpeechSDK from 'microsoft-cognitiveservices-speech-sdk';
2
+ import * as FFMpegTranscoder from "../codecs/FFMpegTranscoder.js";
3
+ import { escape } from 'html-escaper';
4
+ import { Logger } from '../utilities/Logger.js';
5
+ import { getRawAudioDuration } from '../audio/AudioUtilities.js';
6
+ export async function synthesize(text, subscriptionKey, serviceRegion, languageCode = "en-US", voice = "Microsoft Server Speech Text to Speech Voice (en-US, AriaNeural)", ssmlEnabled = false, ssmlPitchString = "+0Hz", ssmlRateString = "+0%") {
7
+ return new Promise((resolve, reject) => {
8
+ const logger = new Logger();
9
+ logger.start("Request synthesis from Azure Cognitive Services");
10
+ const speechConfig = SpeechSDK.SpeechConfig.fromSubscription(subscriptionKey, serviceRegion);
11
+ speechConfig.speechSynthesisLanguage = languageCode;
12
+ speechConfig.speechSynthesisVoiceName = voice;
13
+ speechConfig.speechSynthesisOutputFormat = SpeechSDK.SpeechSynthesisOutputFormat.Ogg24Khz16BitMonoOpus;
14
+ const audioOutputStream = SpeechSDK.AudioOutputStream.createPullStream();
15
+ const audioConfig = SpeechSDK.AudioConfig.fromStreamOutput(audioOutputStream);
16
+ const synthesis = new SpeechSDK.SpeechSynthesizer(speechConfig, audioConfig);
17
+ const events = [];
18
+ synthesis.wordBoundary = (sender, event) => {
19
+ events.push(event);
20
+ };
21
+ const onResult = async (result) => {
22
+ if (result.errorDetails != null) {
23
+ reject(result.errorDetails);
24
+ return;
25
+ }
26
+ /*
27
+ const bufferSize = 2 ** 16
28
+ const buffers: Buffer[] = []
29
+
30
+ while (true) {
31
+
32
+ const buffer = Buffer.alloc(bufferSize)
33
+ const amountRead = await audioOutputStream.read(buffer)
34
+
35
+ if (amountRead == 0) {
36
+ audioOutputStream.close()
37
+ break
38
+ }
39
+
40
+ buffers.push(buffer.subarray(0, amountRead))
41
+ }
42
+
43
+ const encodedAudio = Buffer.concat(buffers)
44
+ */
45
+ const encodedAudio = Buffer.from(result.audioData);
46
+ logger.end();
47
+ const rawAudio = await FFMpegTranscoder.decodeToChannels(encodedAudio, 24000, 1);
48
+ logger.start("Convert boundary events to a timeline");
49
+ const timeline = boundaryEventsToTimeline(events, getRawAudioDuration(rawAudio));
50
+ logger.end();
51
+ resolve({ rawAudio, timeline: timeline });
52
+ };
53
+ const onError = (error) => {
54
+ reject(error);
55
+ };
56
+ if (!ssmlEnabled && ssmlPitchString != "+0%" || ssmlRateString != "+0Hz") {
57
+ ssmlEnabled = true;
58
+ text = escape(text);
59
+ }
60
+ if (ssmlEnabled) {
61
+ text =
62
+ `<speak version="1.0" xmlns="http://www.w3.org/2001/10/synthesis" xml:lang="en-US">` +
63
+ `<voice name="${voice}">` +
64
+ `<prosody pitch="${ssmlPitchString}" rate="${ssmlRateString}">` +
65
+ text +
66
+ `</prosody>` +
67
+ `</voice>` +
68
+ `</speak>`;
69
+ synthesis.speakSsmlAsync(text, onResult, onError);
70
+ }
71
+ else {
72
+ synthesis.speakTextAsync(text, onResult, onError);
73
+ }
74
+ });
75
+ }
76
+ export async function getVoiceList(subscriptionKey, serviceRegion) {
77
+ const speechConfig = SpeechSDK.SpeechConfig.fromSubscription(subscriptionKey, serviceRegion);
78
+ const synthesis = new SpeechSDK.SpeechSynthesizer(speechConfig, undefined);
79
+ const result = await synthesis.getVoicesAsync();
80
+ return result.voices;
81
+ }
82
+ export function boundaryEventsToTimeline(events, totalDuration) {
83
+ const timeline = [];
84
+ for (const event of events) {
85
+ const boundaryType = event.boundaryType != null ? event.boundaryType : event.Type;
86
+ if (boundaryType != "WordBoundary") {
87
+ continue;
88
+ }
89
+ const text = event.text != null ? event.text : event.Data.text.Text;
90
+ const offset = event.audioOffset != null ? event.audioOffset : event.Data.Offset;
91
+ const duration = event.duration != null ? event.duration : event.Data.Duration;
92
+ const startTime = offset / 10000000;
93
+ const endTime = (offset + duration) / 10000000;
94
+ timeline.push({
95
+ type: "word",
96
+ text,
97
+ startTime,
98
+ endTime
99
+ });
100
+ }
101
+ return timeline;
102
+ }
103
+ //# sourceMappingURL=AzureCognitiveServicesTTS.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AzureCognitiveServicesTTS.js","sourceRoot":"","sources":["../../src/synthesis/AzureCognitiveServicesTTS.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ export declare function synthesize(text: string, speakerId: string | null, serverURL?: string): Promise<{
2
+ rawAudio: {
3
+ audioChannels: Float32Array[];
4
+ sampleRate: number;
5
+ };
6
+ }>;
@@ -0,0 +1,22 @@
1
+ import { request } from "gaxios";
2
+ import { decodeWaveBuffer } from "../audio/AudioUtilities.js";
3
+ import { Logger } from "../utilities/Logger.js";
4
+ import { logToStderr } from "../utilities/Utilities.js";
5
+ const log = logToStderr;
6
+ export async function synthesize(text, speakerId, serverURL = "http://[::1]:5002") {
7
+ const logger = new Logger();
8
+ logger.start("Request synthesis from Coqui Server");
9
+ const response = await request({
10
+ url: `${serverURL}/api/tts`,
11
+ params: {
12
+ "text": text,
13
+ "speaker_id": speakerId
14
+ },
15
+ responseType: "arraybuffer"
16
+ });
17
+ const waveData = Buffer.from(response.data);
18
+ const rawAudio = decodeWaveBuffer(waveData).rawAudio;
19
+ logger.end();
20
+ return { rawAudio };
21
+ }
22
+ //# sourceMappingURL=CoquiServerTTS.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CoquiServerTTS.js","sourceRoot":"","sources":["../../src/synthesis/CoquiServerTTS.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAA;AAChC,OAAO,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAA;AAC7D,OAAO,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAA;AAC/C,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAA;AACvD,MAAM,GAAG,GAAG,WAAW,CAAA;AAEvB,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,IAAY,EAAE,SAAwB,EAAE,SAAS,GAAG,mBAAmB;IACvG,MAAM,MAAM,GAAG,IAAI,MAAM,EAAE,CAAA;IAC3B,MAAM,CAAC,KAAK,CAAC,qCAAqC,CAAC,CAAA;IAEnD,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAS;QACtC,GAAG,EAAE,GAAG,SAAS,UAAU;QAE3B,MAAM,EAAE;YACP,MAAM,EAAE,IAAI;YACZ,YAAY,EAAE,SAAS;SACvB;QAED,YAAY,EAAE,aAAa;KAC3B,CAAC,CAAA;IAEF,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAA;IAE3C,MAAM,QAAQ,GAAG,gBAAgB,CAAC,QAAQ,CAAC,CAAC,QAAQ,CAAA;IAEpD,MAAM,CAAC,GAAG,EAAE,CAAA;IAEZ,OAAO,EAAE,QAAQ,EAAE,CAAA;AACpB,CAAC"}
@@ -0,0 +1,8 @@
1
+ import { SynthesisVoice } from "../api/API.js";
2
+ export declare function synthesize(text: string, voiceId: string, apiKey: string, stability?: number, similarityBoost?: number): Promise<{
3
+ rawAudio: {
4
+ audioChannels: Float32Array[];
5
+ sampleRate: number;
6
+ };
7
+ }>;
8
+ export declare function getVoiceList(): Promise<SynthesisVoice[]>;
@@ -0,0 +1,48 @@
1
+ import { request } from "gaxios";
2
+ import * as FFMpegTranscoder from "../codecs/FFMpegTranscoder.js";
3
+ import { Logger } from "../utilities/Logger.js";
4
+ import { logToStderr } from "../utilities/Utilities.js";
5
+ const log = logToStderr;
6
+ export async function synthesize(text, voiceId, apiKey, stability = 0, similarityBoost = 0) {
7
+ const logger = new Logger();
8
+ logger.start("Request synthesis from ElevenLabs");
9
+ const response = await request({
10
+ url: `https://api.elevenlabs.io/v1/text-to-speech/${voiceId}`,
11
+ method: "POST",
12
+ data: {
13
+ text,
14
+ voice_setting: {
15
+ stability,
16
+ similarity_boost: similarityBoost
17
+ }
18
+ },
19
+ headers: {
20
+ "dnt": "1",
21
+ "xi-api-key": apiKey,
22
+ },
23
+ responseType: "arraybuffer"
24
+ });
25
+ logger.start("Decode synthesized audio");
26
+ const rawAudio = await FFMpegTranscoder.decodeToChannels(Buffer.from(response.data));
27
+ logger.end();
28
+ return { rawAudio };
29
+ }
30
+ export async function getVoiceList() {
31
+ const response = await request({
32
+ method: "GET",
33
+ url: "https://api.elevenlabs.io/v1/voices",
34
+ headers: {
35
+ "dnt": "1",
36
+ },
37
+ responseType: "json"
38
+ });
39
+ const elevenLabsVoices = response.data.voices;
40
+ const voices = elevenLabsVoices.map(elevenLabsVoice => ({
41
+ name: elevenLabsVoice.name,
42
+ languages: ['en-US', 'en'],
43
+ gender: "unknown",
44
+ elevenLabsVoiceId: elevenLabsVoice.voice_id
45
+ }));
46
+ return voices;
47
+ }
48
+ //# sourceMappingURL=ElevenLabsTTS.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ElevenLabsTTS.js","sourceRoot":"","sources":["../../src/synthesis/ElevenLabsTTS.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAA;AAEhC,OAAO,KAAK,gBAAgB,MAAM,+BAA+B,CAAA;AACjE,OAAO,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAA;AAC/C,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAA;AAEvD,MAAM,GAAG,GAAG,WAAW,CAAA;AAEvB,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,IAAY,EAAE,OAAe,EAAE,MAAc,EAAE,SAAS,GAAG,CAAC,EAAE,eAAe,GAAG,CAAC;IACjH,MAAM,MAAM,GAAG,IAAI,MAAM,EAAE,CAAA;IAC3B,MAAM,CAAC,KAAK,CAAC,mCAAmC,CAAC,CAAA;IAEjD,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAM;QACnC,GAAG,EAAE,+CAA+C,OAAO,EAAE;QAE7D,MAAM,EAAE,MAAM;QAEd,IAAI,EAAE;YACL,IAAI;YAEJ,aAAa,EAAE;gBACd,SAAS;gBACT,gBAAgB,EAAE,eAAe;aACjC;SACD;QAED,OAAO,EAAE;YACR,KAAK,EAAE,GAAG;YACV,YAAY,EAAE,MAAM;SACpB;QAED,YAAY,EAAE,aAAa;KAC3B,CAAC,CAAA;IAEF,MAAM,CAAC,KAAK,CAAC,0BAA0B,CAAC,CAAA;IACxC,MAAM,QAAQ,GAAG,MAAM,gBAAgB,CAAC,gBAAgB,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAA;IAEpF,MAAM,CAAC,GAAG,EAAE,CAAA;IAEZ,OAAO,EAAE,QAAQ,EAAE,CAAA;AACpB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY;IACjC,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAM;QACnC,MAAM,EAAE,KAAK;QAEb,GAAG,EAAE,qCAAqC;QAC1C,OAAO,EAAE;YACR,KAAK,EAAE,GAAG;SACV;QAED,YAAY,EAAE,MAAM;KACpB,CAAC,CAAA;IAEF,MAAM,gBAAgB,GAAU,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAA;IAEpD,MAAM,MAAM,GAAqB,gBAAgB,CAAC,GAAG,CAAC,eAAe,CAAC,EAAE,CAAC,CAAC;QACzE,IAAI,EAAE,eAAe,CAAC,IAAI;QAC1B,SAAS,EAAE,CAAC,OAAO,EAAE,IAAI,CAAC;QAC1B,MAAM,EAAE,SAAS;QAEjB,iBAAiB,EAAE,eAAe,CAAC,QAAQ;KAC3C,CAAC,CAAC,CAAA;IAEH,OAAO,MAAM,CAAA;AACd,CAAC"}
@@ -0,0 +1,46 @@
1
+ import { RawAudio } from "../audio/AudioUtilities.js";
2
+ import { Lexicon } from "../nlp/Lexicon.js";
3
+ import { Timeline } from "../utilities/Timeline.js";
4
+ export declare function synthesize(text: string, ssmlEnabled: boolean): Promise<{
5
+ rawAudio: RawAudio;
6
+ events: EspeakEvent[];
7
+ }>;
8
+ export declare function preprocessAndSynthesizeSentence(sentence: string, espeakVoice: string, lexicons?: Lexicon[], normalize?: boolean, rate?: number, pitch?: number, pitchRange?: number): Promise<{
9
+ referenceSynthesizedAudio: RawAudio;
10
+ referenceTimeline: Timeline;
11
+ fragments: string[];
12
+ preprocessedFragments: string[];
13
+ phonemizedFragmentsSubstitutions: Map<number, string[]>;
14
+ phonemizedSentence: string[][][];
15
+ }>;
16
+ export declare function synthesizeFragments(fragments: string[], voice: string, insertSeparators?: boolean, rate?: number, pitch?: number, pitchRange?: number): Promise<{
17
+ rawAudio: RawAudio;
18
+ timeline: Timeline;
19
+ events: EspeakEvent[];
20
+ }>;
21
+ export declare function textToIPA(text: string, voice: string): Promise<string>;
22
+ export declare function textToPhonemes(text: string, voice: string, useIPA?: boolean): Promise<string>;
23
+ export declare function setVoice(voiceId: string): Promise<void>;
24
+ export declare function setVolume(volume: number): Promise<any>;
25
+ export declare function setRate(rate: number): Promise<any>;
26
+ export declare function setPitch(pitch: number): Promise<any>;
27
+ export declare function setPitchRange(pitchRange: number): Promise<any>;
28
+ export declare function getSampleRate(): Promise<22050>;
29
+ export declare function listVoices(): Promise<{
30
+ identifier: string;
31
+ name: string;
32
+ languages: {
33
+ priority: number;
34
+ name: string;
35
+ }[];
36
+ }[]>;
37
+ export type EspeakEventType = "sentence" | "word" | "phoneme" | "end" | "mark" | "play" | "msg_terminated" | "list_terminated" | "samplerate";
38
+ export interface EspeakEvent {
39
+ audio_position: number;
40
+ type: EspeakEventType;
41
+ text_position: number;
42
+ word_length: number;
43
+ id?: string | number;
44
+ }
45
+ export declare function testEspeakSynthesisWithPrePhonemizedInputs(text: string): Promise<void>;
46
+ export declare function testKirshenbaumPhonemization(text: string): Promise<void>;
@@ -0,0 +1,353 @@
1
+ import { concatFloat32Arrays, logToStderr, objToString } from "../utilities/Utilities.js";
2
+ import { int16PcmToFloat32 } from "../audio/AudioBufferConversion.js";
3
+ import { Logger } from '../utilities/Logger.js';
4
+ import { WasmMemoryManager } from "../utilities/WasmMemoryManager.js";
5
+ import { getEmptyRawAudio } from "../audio/AudioUtilities.js";
6
+ import { playAudioWithTimelinePhones } from "../audio/AudioPlayer.js";
7
+ import * as CompromiseNLP from "../nlp/CompromiseNLP.js";
8
+ import { getNormalizationMapForSpeech } from "../nlp/TextNormalizer.js";
9
+ import { ipaPhoneToKirshenbaum } from "../nlp/PhoneConversion.js";
10
+ import { splitToWords } from "../nlp/Segmentation.js";
11
+ import { phonemizeSentence } from "../nlp/EspeakPhonemizer.js";
12
+ const log = logToStderr;
13
+ let espeakInstance;
14
+ let espeakModule;
15
+ export async function synthesize(text, ssmlEnabled) {
16
+ const logger = new Logger();
17
+ logger.start("Get espeak WASM instance");
18
+ if (!ssmlEnabled) {
19
+ const { escape } = await import('html-escaper');
20
+ text = escape(text);
21
+ }
22
+ const { instance } = await getEspeakInstance();
23
+ const sampleChunks = [];
24
+ const allEvents = [];
25
+ logger.start("Synthesize with espeak");
26
+ instance.synthesize(text, (samples, events) => {
27
+ if (samples && samples.length > 0) {
28
+ sampleChunks.push(int16PcmToFloat32(samples));
29
+ }
30
+ for (const event of events) {
31
+ if (event.type == "word") {
32
+ const textPosition = event.text_position - 1;
33
+ event["text"] = text.substring(textPosition, textPosition + event.word_length);
34
+ }
35
+ }
36
+ allEvents.push(...events);
37
+ });
38
+ const concatenatedSamples = concatFloat32Arrays(sampleChunks);
39
+ const rawAudio = { audioChannels: [concatenatedSamples], sampleRate: 22050 };
40
+ logger.end();
41
+ return { rawAudio, events: allEvents };
42
+ }
43
+ export async function preprocessAndSynthesizeSentence(sentence, espeakVoice, lexicons = [], normalize = true, rate = 150, pitch = 50, pitchRange = 50) {
44
+ const logger = new Logger();
45
+ await logger.startAsync("Tokenize and analyze text");
46
+ let fragments;
47
+ let preprocessedFragments;
48
+ const phonemizedFragmentsSubstitutions = new Map();
49
+ if (espeakVoice == "en-us") {
50
+ fragments = [];
51
+ preprocessedFragments = [];
52
+ const parsedSentences = await CompromiseNLP.parse(sentence);
53
+ const terms = parsedSentences.flatMap(s => s);
54
+ const normalizationMap = getNormalizationMapForSpeech(terms, espeakVoice);
55
+ for (let termIndex = 0; termIndex < terms.length; termIndex++) {
56
+ const term = terms[termIndex];
57
+ const trimmedPreText = term.preText.trim();
58
+ if (trimmedPreText != "") {
59
+ fragments.push(trimmedPreText);
60
+ preprocessedFragments.push(trimmedPreText);
61
+ }
62
+ const termText = term.text;
63
+ if (termText != "") {
64
+ const substitutionPhonemes = CompromiseNLP.tryMatchInLexicons(term, lexicons, espeakVoice);
65
+ if (substitutionPhonemes) {
66
+ phonemizedFragmentsSubstitutions.set(fragments.length, substitutionPhonemes);
67
+ const referenceIPA = (await textToPhonemes(term.text, espeakVoice, true)).replaceAll("_", " ");
68
+ const referenceKirshenbaum = (await textToPhonemes(term.text, espeakVoice, false)).replaceAll("_", "");
69
+ logger.log(`\nSubstitution references: Target IPA: ${substitutionPhonemes.join(" ")}, IPA: ${referenceIPA}, Kirshenbaum: ${referenceKirshenbaum}`);
70
+ const kirshenbaumPhonemes = substitutionPhonemes.map(phone => ipaPhoneToKirshenbaum(phone)).join("");
71
+ logger.log(`Kirshenbaum conversion result: ${kirshenbaumPhonemes}`);
72
+ const substitutionPhonemesFragment = ` [[${kirshenbaumPhonemes}]] `;
73
+ preprocessedFragments.push(substitutionPhonemesFragment);
74
+ }
75
+ else {
76
+ let normalizedFragment = undefined;
77
+ if (normalize) {
78
+ normalizedFragment = normalizationMap.get(termIndex);
79
+ }
80
+ if (normalizedFragment) {
81
+ preprocessedFragments.push(normalizedFragment);
82
+ }
83
+ else {
84
+ preprocessedFragments.push(termText);
85
+ }
86
+ }
87
+ fragments.push(termText);
88
+ }
89
+ const trimmedPostText = term.postText.trim();
90
+ if (trimmedPostText != "") {
91
+ fragments.push(trimmedPostText);
92
+ preprocessedFragments.push(trimmedPostText);
93
+ }
94
+ }
95
+ }
96
+ else {
97
+ fragments = (await splitToWords(sentence, espeakVoice)).filter(word => word.trim() != "");
98
+ preprocessedFragments = fragments;
99
+ }
100
+ logger.start("Synthesize preprocessed fragments with Espeak");
101
+ const { rawAudio: referenceSynthesizedAudio, timeline: referenceTimeline } = await synthesizeFragments(preprocessedFragments, espeakVoice, false);
102
+ await logger.startAsync("Build phonemized tokens");
103
+ const phonemizedSentence = [];
104
+ let wordIndex = 0;
105
+ for (const phraseEntry of referenceTimeline) {
106
+ const phrase = [];
107
+ for (const wordEntry of phraseEntry.timeline) {
108
+ wordEntry.text = fragments[wordIndex];
109
+ if (phonemizedFragmentsSubstitutions.has(wordIndex)) {
110
+ phrase.push(phonemizedFragmentsSubstitutions.get(wordIndex));
111
+ }
112
+ else {
113
+ for (const tokenEntry of wordEntry.timeline) {
114
+ const tokenPhonemes = [];
115
+ for (const phoneme of tokenEntry.timeline) {
116
+ if (phoneme.text) {
117
+ tokenPhonemes.push(phoneme.text);
118
+ }
119
+ }
120
+ if (tokenPhonemes.length > 0) {
121
+ phrase.push(tokenPhonemes);
122
+ }
123
+ }
124
+ }
125
+ wordIndex += 1;
126
+ }
127
+ if (phrase.length > 0) {
128
+ phonemizedSentence.push(phrase);
129
+ }
130
+ }
131
+ logger.log(phonemizedSentence.map(phrase => phrase.map(word => word.join(" ")).join(" | ")).join(" || "));
132
+ logger.end();
133
+ return { referenceSynthesizedAudio, referenceTimeline, fragments, preprocessedFragments, phonemizedFragmentsSubstitutions, phonemizedSentence };
134
+ }
135
+ export async function synthesizeFragments(fragments, voice, insertSeparators = false, rate = 150, pitch = 50, pitchRange = 50) {
136
+ const logger = new Logger();
137
+ await setVoice(voice);
138
+ await setRate(rate);
139
+ await setPitch(pitch);
140
+ await setPitchRange(pitchRange);
141
+ const sampleRate = await getSampleRate();
142
+ //fragments = fragments.filter(fragment => fragment.trim() != "")
143
+ if (fragments.length == 0) {
144
+ return {
145
+ rawAudio: getEmptyRawAudio(1, sampleRate),
146
+ timeline: [],
147
+ events: []
148
+ };
149
+ }
150
+ const { escape } = await import('html-escaper');
151
+ let textWithMarkers = '';
152
+ for (let i = 0; i < fragments.length; i++) {
153
+ //let fragment = escape(fragments[i])
154
+ let fragment = fragments[i];
155
+ if (insertSeparators) {
156
+ textWithMarkers += `<mark name="wordstart-${i}"/> | ${fragment} | <mark name="wordend-${i}"/>`;
157
+ }
158
+ else {
159
+ if (fragment.endsWith(".")) {
160
+ fragment += " ()";
161
+ }
162
+ textWithMarkers += `<mark name="wordstart-${i}"/>${fragment}<mark name="wordend-${i}"/> `;
163
+ }
164
+ }
165
+ //log(textWithMarkers)
166
+ const { rawAudio, events } = await synthesize(textWithMarkers, true);
167
+ const timeline = fragments.map(word => ({
168
+ type: "word",
169
+ text: word,
170
+ startTime: -1,
171
+ endTime: -1,
172
+ timeline: [{
173
+ type: "token",
174
+ text: "",
175
+ startTime: -1,
176
+ endTime: -1,
177
+ timeline: []
178
+ }]
179
+ }));
180
+ let wordIndex = 0;
181
+ const clauseEndIndexes = [];
182
+ for (const event of events) {
183
+ const eventTime = event.audio_position / 1000;
184
+ const currentWordEntry = timeline[wordIndex];
185
+ const currentSubwordTimeline = currentWordEntry.timeline;
186
+ const currentSubwordEntry = currentSubwordTimeline[currentSubwordTimeline.length - 1];
187
+ const currentPhoneTimeline = currentSubwordEntry.timeline;
188
+ const lastPhoneEntry = currentPhoneTimeline[currentPhoneTimeline.length - 1];
189
+ if (lastPhoneEntry && lastPhoneEntry.endTime == -1) {
190
+ lastPhoneEntry.endTime = eventTime;
191
+ }
192
+ if (event.type == "word") {
193
+ if (!event.id || currentPhoneTimeline.length == 0) {
194
+ continue;
195
+ }
196
+ if (currentSubwordEntry.endTime == -1) {
197
+ currentSubwordEntry.endTime = eventTime;
198
+ }
199
+ currentSubwordTimeline.push({
200
+ type: "token",
201
+ text: "",
202
+ startTime: eventTime,
203
+ endTime: -1,
204
+ timeline: []
205
+ });
206
+ }
207
+ else if (event.type == "phoneme") {
208
+ const phoneText = event.id;
209
+ if (!phoneText || phoneText.startsWith("(")) {
210
+ continue;
211
+ }
212
+ currentPhoneTimeline.push({
213
+ type: "phone",
214
+ text: phoneText,
215
+ startTime: eventTime,
216
+ endTime: -1
217
+ });
218
+ currentSubwordEntry.text += phoneText;
219
+ currentSubwordEntry.startTime = currentPhoneTimeline[0].startTime;
220
+ }
221
+ else if (event.type == "mark") {
222
+ const markerName = event.id;
223
+ if (markerName.startsWith("wordstart-")) {
224
+ const markerIndex = parseInt(markerName.substring(10));
225
+ if (markerIndex != wordIndex) {
226
+ throw new Error(`Word start marker for index ${wordIndex} is not consistent with word index. The words were: ${objToString(fragments)}`);
227
+ }
228
+ if (currentPhoneTimeline.length > 0) {
229
+ throw new Error(`Word entry ${wordIndex} already has phones before its start marker was seen. The words were: ${objToString(fragments)}`);
230
+ }
231
+ currentWordEntry.startTime = eventTime;
232
+ currentSubwordEntry.startTime = eventTime;
233
+ }
234
+ else if (markerName.startsWith("wordend-")) {
235
+ const markerIndex = parseInt(markerName.substring(8));
236
+ if (markerIndex != wordIndex) {
237
+ throw new Error(`Word end marker for index ${wordIndex} is not consistent with word index. The words were: ${objToString(fragments)}`);
238
+ }
239
+ currentWordEntry.startTime = currentSubwordTimeline[0].startTime;
240
+ currentWordEntry.endTime = eventTime;
241
+ currentSubwordEntry.endTime = eventTime;
242
+ wordIndex += 1;
243
+ if (wordIndex == timeline.length) {
244
+ break;
245
+ }
246
+ }
247
+ else {
248
+ continue;
249
+ }
250
+ }
251
+ else if (event.type == "end") {
252
+ clauseEndIndexes.push(wordIndex);
253
+ }
254
+ }
255
+ clauseEndIndexes.push(timeline.length);
256
+ const timelineWithClauses = [];
257
+ let clauseStartIndex = 0;
258
+ for (const clauseEndIndex of clauseEndIndexes) {
259
+ const newClause = {
260
+ type: "clause",
261
+ text: "",
262
+ startTime: -1,
263
+ endTime: -1,
264
+ timeline: []
265
+ };
266
+ for (let entryIndex = clauseStartIndex; entryIndex <= clauseEndIndex && entryIndex < timeline.length; entryIndex++) {
267
+ const wordEntry = timeline[entryIndex];
268
+ if (newClause.startTime == -1) {
269
+ newClause.startTime = wordEntry.startTime;
270
+ }
271
+ newClause.endTime = wordEntry.endTime;
272
+ newClause.text += `${wordEntry.text} `;
273
+ newClause.timeline.push(wordEntry);
274
+ }
275
+ if (newClause.timeline.length > 0) {
276
+ timelineWithClauses.push(newClause);
277
+ clauseStartIndex = clauseEndIndex + 1;
278
+ }
279
+ }
280
+ return { rawAudio, timeline: timelineWithClauses, events };
281
+ }
282
+ export async function textToIPA(text, voice) {
283
+ await setVoice(voice);
284
+ const { instance } = await getEspeakInstance();
285
+ const ipa = instance.synthesize_ipa(text).ipa.trim();
286
+ return ipa;
287
+ }
288
+ export async function textToPhonemes(text, voice, useIPA = true) {
289
+ await setVoice(voice);
290
+ const { instance, module } = await getEspeakInstance();
291
+ const textPtr = instance.convert_to_phonemes(text, useIPA);
292
+ const wasmMemory = new WasmMemoryManager(module);
293
+ const resultRef = wasmMemory.wrapNullTerminatedUtf8String(textPtr.ptr);
294
+ const result = resultRef.getValue();
295
+ wasmMemory.freeAll();
296
+ return result;
297
+ }
298
+ export async function setVoice(voiceId) {
299
+ const { instance } = await getEspeakInstance();
300
+ instance.set_voice(voiceId);
301
+ }
302
+ export async function setVolume(volume) {
303
+ const { instance } = await getEspeakInstance();
304
+ return instance.setVolume(volume);
305
+ }
306
+ export async function setRate(rate) {
307
+ const { instance } = await getEspeakInstance();
308
+ return instance.set_rate(rate);
309
+ }
310
+ export async function setPitch(pitch) {
311
+ const { instance } = await getEspeakInstance();
312
+ return instance.set_pitch(pitch);
313
+ }
314
+ export async function setPitchRange(pitchRange) {
315
+ const { instance } = await getEspeakInstance();
316
+ return instance.set_range(pitchRange);
317
+ }
318
+ export async function getSampleRate() {
319
+ return 22050;
320
+ }
321
+ export async function listVoices() {
322
+ const { instance } = await getEspeakInstance();
323
+ const voiceList = instance.list_voices();
324
+ return voiceList;
325
+ }
326
+ async function getEspeakInstance() {
327
+ if (!espeakInstance) {
328
+ const { default: EspeakInitializer } = await import('@echogarden/espeak-ng-emscripten');
329
+ const m = await EspeakInitializer();
330
+ espeakInstance = await (new m.eSpeakNGWorker());
331
+ espeakModule = m;
332
+ }
333
+ return { instance: espeakInstance, module: espeakModule };
334
+ }
335
+ export async function testEspeakSynthesisWithPrePhonemizedInputs(text) {
336
+ const ipaPhonemizedSentence = (await phonemizeSentence(text, "en-us")).flatMap(clause => clause);
337
+ const kirshenbaumPhonemizedSentence = (await phonemizeSentence(text, "en-us", undefined, false)).flatMap(clause => clause);
338
+ log(kirshenbaumPhonemizedSentence);
339
+ const fragments = ipaPhonemizedSentence.map(word => word.map(phoneme => ipaPhoneToKirshenbaum(phoneme)).join("")).map(word => ` [[${word}]] `);
340
+ const { rawAudio, timeline } = await synthesizeFragments(fragments, 'en-us');
341
+ await playAudioWithTimelinePhones(rawAudio, timeline);
342
+ }
343
+ export async function testKirshenbaumPhonemization(text) {
344
+ const ipaPhonemizedSentence = (await phonemizeSentence(text, "en-us")).flatMap(clause => clause);
345
+ const kirshenbaumPhonemizedSentence = (await phonemizeSentence(text, "en-us", undefined, false)).flatMap(clause => clause);
346
+ const ipaFragments = ipaPhonemizedSentence.map(word => word.join(""));
347
+ const kirshenbaumFragments = kirshenbaumPhonemizedSentence.map(word => word.join(""));
348
+ const fragments = ipaPhonemizedSentence.map(word => word.map(phoneme => ipaPhoneToKirshenbaum(phoneme)).join(""));
349
+ for (let i = 0; i < fragments.length; i++) {
350
+ log(`IPA: ${ipaFragments[i]} | converted: ${fragments[i]} | ground truth: ${kirshenbaumFragments[i]}`);
351
+ }
352
+ }
353
+ //# sourceMappingURL=EspeakTTS.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EspeakTTS.js","sourceRoot":"","sources":["../../src/synthesis/EspeakTTS.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import { SynthesisVoice } from "../api/API.js";
2
+ export type FliteVoiceName = "kal" | "kal16" | "awb" | "rms" | "slt" | string;
3
+ export declare function synthesize(text: string, voice: FliteVoiceName, voiceDir: string | undefined, rate: number, pitchMeanHz?: number, pitchStdDev?: number): Promise<{
4
+ rawAudio: {
5
+ audioChannels: Float32Array[];
6
+ sampleRate: number;
7
+ };
8
+ events: FliteEvent[];
9
+ }>;
10
+ export type FliteEventType = "phone" | "pause" | "phrasePause";
11
+ export type FliteEvent = {
12
+ type: FliteEventType;
13
+ id: string;
14
+ startTime: number;
15
+ endTime: number;
16
+ };
17
+ export declare const voices: SynthesisVoice[];