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,232 @@
1
+ import { spawn } from 'child_process';
2
+ import path from 'path';
3
+ import { encodeWaveBuffer, fadeAudioInOut, getRawAudioDuration, sliceRawAudioByTime } from "./AudioUtilities.js";
4
+ import * as AudioBufferConversion from './AudioBufferConversion.js';
5
+ import * as FFMpegTranscoder from "../codecs/FFMpegTranscoder.js";
6
+ import { Timer } from "../utilities/Timer.js";
7
+ import { commandExists, getRandomHexString, waitTimeout, writeToStderr } from '../utilities/Utilities.js';
8
+ import { encodeToAudioBuffer } from './AudioBufferConversion.js';
9
+ import { OpenPromise } from '../utilities/OpenPromise.js';
10
+ import { isWord } from '../nlp/Segmentation.js';
11
+ import { getAppTempDir, readAndParseJsonFile, readFile, remove, writeFile } from '../utilities/FileSystem.js';
12
+ import { tryResolvingSoxPath } from './SoxPath.js';
13
+ import { appName } from '../api/Globals.js';
14
+ export async function playAudioFileWithTimelineFile(audioFilename, timelineFileName, transcriptFileName) {
15
+ const rawAudio = await FFMpegTranscoder.decodeToChannels(audioFilename, 48000, 1);
16
+ const timeline = await readAndParseJsonFile(timelineFileName);
17
+ let transcript;
18
+ if (transcriptFileName) {
19
+ transcript = await readFile(transcriptFileName, "utf8");
20
+ }
21
+ await playAudioWithTimeline(rawAudio, timeline, transcript);
22
+ }
23
+ export async function playAudioWithTimeline(rawAudio, timeline, transcript) {
24
+ const lowerCaseTranscript = transcript?.toLocaleLowerCase();
25
+ timeline = timeline.filter(entry => isWord(entry.text));
26
+ let timelineEntryIndex = 0;
27
+ let transcriptOffset = 0;
28
+ function onTimePosition(timePosition) {
29
+ for (; timelineEntryIndex < timeline.length; timelineEntryIndex++) {
30
+ const entry = timeline[timelineEntryIndex];
31
+ if (entry.startTime > timePosition) {
32
+ return;
33
+ }
34
+ if (transcript == null) {
35
+ writeToStderr(`${entry.text} `);
36
+ return;
37
+ }
38
+ const wordStartOffset = lowerCaseTranscript.indexOf(entry.text.toLocaleLowerCase(), transcriptOffset);
39
+ if (wordStartOffset == -1) {
40
+ continue;
41
+ //throw new Error(`Couldn't find substring "${entry.text}" in remaining text.`)
42
+ }
43
+ let wordEndOffset = wordStartOffset + entry.text.length;
44
+ while (wordEndOffset < transcript.length &&
45
+ charactersToWriteAhead.includes(transcript[wordEndOffset]) &&
46
+ transcript[wordEndOffset] != timeline[timelineEntryIndex + 2]?.text) {
47
+ wordEndOffset += 1;
48
+ }
49
+ writeToStderr(`${transcript.substring(transcriptOffset, wordEndOffset)}`);
50
+ transcriptOffset = wordEndOffset;
51
+ }
52
+ }
53
+ writeToStderr("\n");
54
+ await playAudioSamples(rawAudio, onTimePosition);
55
+ writeToStderr("\n");
56
+ }
57
+ export async function playAudioWithTimelinePhones(rawAudio, timeline) {
58
+ let wordIndex = 0;
59
+ let phoneIndex = 0;
60
+ function onTimePosition(timePosition) {
61
+ for (; wordIndex < timeline.length; wordIndex++) {
62
+ const wordEntry = timeline[wordIndex];
63
+ const phoneTimeline = wordEntry.timeline;
64
+ if (phoneTimeline.every(phoneEntry => phoneEntry.text == "")) {
65
+ continue;
66
+ }
67
+ for (; phoneIndex < phoneTimeline.length; phoneIndex++) {
68
+ const entry = phoneTimeline[phoneIndex];
69
+ if (entry.startTime > timePosition) {
70
+ return;
71
+ }
72
+ writeToStderr(`${entry.text} `);
73
+ }
74
+ writeToStderr(`| `);
75
+ phoneIndex = 0;
76
+ }
77
+ }
78
+ writeToStderr("\n");
79
+ await playAudioSamples(rawAudio, onTimePosition);
80
+ writeToStderr("\n");
81
+ }
82
+ export async function playAudioPairWithTimelineInterleaved(rawAudio1, rawAudio2, timeline1, timeline2) {
83
+ if (timeline1.length != timeline2.length) {
84
+ throw new Error("Timelines have different lengths");
85
+ }
86
+ for (let i = 0; i < timeline1.length; i++) {
87
+ writeToStderr(`${timeline1[i].text} `);
88
+ await playAudioSamples(sliceRawAudioByTime(rawAudio1, timeline1[i].startTime, timeline1[i].endTime));
89
+ await waitTimeout(200);
90
+ await playAudioSamples(sliceRawAudioByTime(rawAudio2, timeline2[i].startTime, timeline2[i].endTime));
91
+ await waitTimeout(500);
92
+ }
93
+ writeToStderr("\n");
94
+ }
95
+ export function playAudioSamples(rawAudio, onTimePosition, microFadeInOut = true) {
96
+ return new Promise(async (resolve, reject) => {
97
+ if (microFadeInOut) {
98
+ rawAudio = fadeAudioInOut(rawAudio, 0.0025);
99
+ }
100
+ let playerProcessClosed = false;
101
+ const channelCount = rawAudio.audioChannels.length;
102
+ const audioDuration = getRawAudioDuration(rawAudio);
103
+ const playerSpawnedOpenPromise = new OpenPromise();
104
+ const soxPath = await tryResolvingSoxPath();
105
+ if (soxPath) {
106
+ const audioBuffer = encodeToAudioBuffer(rawAudio.audioChannels, 16);
107
+ const player = spawn(soxPath, ['-t', 'raw', '-r', `${rawAudio.sampleRate}`, '-e', 'signed', '-b', '16', '-c', channelCount.toString(), '-', '-d'], {});
108
+ // Required to work around SoX bug:
109
+ player.stderr.on("data", (data) => {
110
+ //logErr(data.toString('utf-8'))
111
+ });
112
+ player.once("spawn", () => {
113
+ player.stdin.write(audioBuffer);
114
+ player.stdin.end();
115
+ playerSpawnedOpenPromise.resolve(null);
116
+ });
117
+ player.once("error", (e) => {
118
+ reject(e);
119
+ });
120
+ player.once('close', () => {
121
+ playerProcessClosed = true;
122
+ resolve();
123
+ });
124
+ }
125
+ else {
126
+ const waveAudio = encodeWaveBuffer(rawAudio);
127
+ const tempDir = getAppTempDir(appName);
128
+ const tempWaveFilePath = path.join(tempDir, getRandomHexString(16) + ".wav");
129
+ await writeFile(tempWaveFilePath, waveAudio);
130
+ let command = "";
131
+ if (process.platform == 'darwin' && await commandExists("afplay")) {
132
+ command = "afplay";
133
+ }
134
+ else if (process.platform == 'linux' && await commandExists("aplay")) {
135
+ command = "aplay";
136
+ }
137
+ else {
138
+ throw new Error(`Couldn't find an audio player for this platform.`);
139
+ }
140
+ const player = spawn(command, [tempWaveFilePath], { stdio: "ignore" });
141
+ player.once("spawn", () => {
142
+ playerSpawnedOpenPromise.resolve(null);
143
+ });
144
+ player.once("error", async (e) => {
145
+ await remove(tempWaveFilePath);
146
+ reject(e);
147
+ });
148
+ player.once('close', async () => {
149
+ playerProcessClosed = true;
150
+ await remove(tempWaveFilePath);
151
+ resolve();
152
+ });
153
+ }
154
+ await playerSpawnedOpenPromise.promise;
155
+ const timer = new Timer();
156
+ while (true) {
157
+ const elapsedTime = timer.elapsedTimeSeconds;
158
+ if (onTimePosition) {
159
+ onTimePosition(elapsedTime);
160
+ }
161
+ if (playerProcessClosed || elapsedTime >= audioDuration) {
162
+ if (onTimePosition) {
163
+ onTimePosition(audioDuration);
164
+ }
165
+ return;
166
+ }
167
+ await waitTimeout(20);
168
+ }
169
+ });
170
+ }
171
+ export function playAudioSamples_Speaker(rawAudio, onTimePosition, microFadeInOut = true) {
172
+ return new Promise(async (resolve, reject) => {
173
+ if (microFadeInOut) {
174
+ rawAudio = fadeAudioInOut(rawAudio, 0.0025);
175
+ }
176
+ const channelCount = rawAudio.audioChannels.length;
177
+ let audioData = AudioBufferConversion.encodeToAudioBuffer(rawAudio.audioChannels, 16);
178
+ const { default: Speaker } = await import('speaker');
179
+ const speaker = new Speaker({
180
+ channels: rawAudio.audioChannels.length,
181
+ bitDepth: 16,
182
+ sampleRate: rawAudio.sampleRate,
183
+ });
184
+ speaker.on("error", (e) => {
185
+ reject(e);
186
+ });
187
+ const bytesPerSecond = rawAudio.sampleRate * 2 * channelCount;
188
+ const byteCountToDuration = (byteCount) => {
189
+ return byteCount / bytesPerSecond;
190
+ };
191
+ const audioDuration = byteCountToDuration(audioData.length);
192
+ let mpg123AudioBufferSize;
193
+ let mpg123AudioBufferDuration;
194
+ if (process.platform == "win32") {
195
+ mpg123AudioBufferSize = 65536;
196
+ mpg123AudioBufferDuration = byteCountToDuration(mpg123AudioBufferSize);
197
+ }
198
+ else {
199
+ mpg123AudioBufferDuration = 0.5;
200
+ mpg123AudioBufferSize = bytesPerSecond * mpg123AudioBufferDuration;
201
+ }
202
+ audioData = Buffer.concat([audioData, Buffer.alloc(mpg123AudioBufferSize)]);
203
+ const maxChunkSize = mpg123AudioBufferSize;
204
+ const writeAheadDuration = 0.5;
205
+ const timer = new Timer();
206
+ let readOffset = 0;
207
+ let targetTimePosition = 0;
208
+ while (true) {
209
+ const elapsedTime = timer.elapsedTimeSeconds;
210
+ if (onTimePosition) {
211
+ onTimePosition(elapsedTime);
212
+ }
213
+ if (readOffset < audioData.length) {
214
+ const targetWriteTime = targetTimePosition - writeAheadDuration;
215
+ if (elapsedTime >= targetWriteTime) {
216
+ const chunk = audioData.subarray(readOffset, readOffset + maxChunkSize);
217
+ speaker.write(chunk);
218
+ readOffset += chunk.length;
219
+ targetTimePosition += byteCountToDuration(chunk.length);
220
+ }
221
+ }
222
+ if (elapsedTime >= audioDuration) {
223
+ //speaker.close(false)
224
+ resolve();
225
+ return;
226
+ }
227
+ await waitTimeout(20);
228
+ }
229
+ });
230
+ }
231
+ export const charactersToWriteAhead = [",", ".", ",", "、", ":", ";", "。", ":", ";", "?", "!", ")", "]", "}", "\"", "'", "”", "’", "-", "—"];
232
+ //# sourceMappingURL=AudioPlayer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AudioPlayer.js","sourceRoot":"","sources":["../../src/audio/AudioPlayer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { RawAudio } from "./AudioUtilities.js";
2
+ export declare function recordAudioInput(channelCount?: number, sampleRate?: number, maxTime?: number): Promise<RawAudio>;
3
+ export declare function captureAudioInput(channelCount?: number, sampleRate?: number, maxTime?: number, onAudioSamples?: (rawAudio: Float32Array[]) => void): Promise<void>;
@@ -0,0 +1,68 @@
1
+ import { spawn } from 'child_process';
2
+ import { concatAudioSegments } from "./AudioUtilities.js";
3
+ import * as AudioBufferConversion from './AudioBufferConversion.js';
4
+ import { Timer } from "../utilities/Timer.js";
5
+ import { logToStderr } from '../utilities/Utilities.js';
6
+ import { OpenPromise } from '../utilities/OpenPromise.js';
7
+ import { SampleFormat } from '../codecs/WaveCodec.js';
8
+ import { tryResolvingSoxPath } from './SoxPath.js';
9
+ const log = logToStderr;
10
+ export async function recordAudioInput(channelCount = 1, sampleRate = 48000, maxTime = 10) {
11
+ const audioSegments = [];
12
+ await captureAudioInput(channelCount, sampleRate, maxTime, (rawAudio) => {
13
+ audioSegments.push(rawAudio);
14
+ });
15
+ const mergedAudio = concatAudioSegments(audioSegments);
16
+ const rawAudio = {
17
+ audioChannels: mergedAudio,
18
+ sampleRate
19
+ };
20
+ return rawAudio;
21
+ }
22
+ export function captureAudioInput(channelCount = 1, sampleRate = 48000, maxTime = -1, onAudioSamples) {
23
+ return new Promise(async (resolve, reject) => {
24
+ const timer = new Timer();
25
+ const recorderSpawnedOpenPromise = new OpenPromise();
26
+ const soxPath = await tryResolvingSoxPath();
27
+ if (!soxPath) {
28
+ throw new Error("Could not resolve a SoX executable");
29
+ }
30
+ let args;
31
+ if (process.platform == 'win32') {
32
+ args = ['-b', `${16}`, '--endian', 'little',
33
+ '-c', `${channelCount}`, '-r', `${sampleRate}`, '-e', 'signed',
34
+ '-t', 'waveaudio', 'default', '-t', 'raw', '-'];
35
+ }
36
+ else if (process.platform == 'darwin') {
37
+ args = ['-b', `${16}`, '--endian', 'little',
38
+ '-c', `${channelCount}`, '-r', `${sampleRate}`, '-e', 'signed',
39
+ '-t', 'raw', '-'];
40
+ }
41
+ else {
42
+ throw new Error("");
43
+ }
44
+ const recorder = spawn(soxPath, args, {});
45
+ recorder.once("spawn", () => {
46
+ recorderSpawnedOpenPromise.resolve(null);
47
+ timer.restart();
48
+ });
49
+ recorder.once('close', () => {
50
+ resolve();
51
+ });
52
+ recorder.stderr.on('data', (chunk) => {
53
+ //log(chunk.toString('utf8'))
54
+ });
55
+ recorder.stdout.on('data', (chunk) => {
56
+ //log(chunk)
57
+ const audioChannels = AudioBufferConversion.decodeToChannels(chunk, channelCount, 16, SampleFormat.PCM);
58
+ if (onAudioSamples) {
59
+ onAudioSamples(audioChannels);
60
+ }
61
+ if (maxTime >= 0 && timer.elapsedTimeSeconds >= maxTime) {
62
+ recorder.kill();
63
+ resolve();
64
+ }
65
+ });
66
+ });
67
+ }
68
+ //# sourceMappingURL=AudioRecorder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AudioRecorder.js","sourceRoot":"","sources":["../../src/audio/AudioRecorder.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,48 @@
1
+ /// <reference types="node" resolution-mode="require"/>
2
+ import { SampleFormat } from "../codecs/WaveCodec.js";
3
+ export declare function encodeWaveBuffer(rawAudio: RawAudio, bitDepth?: 8 | 16 | 24 | 32 | 64, sampleFormat?: SampleFormat, speakerPositionMask?: number): Buffer;
4
+ export declare function decodeWaveBuffer(waveFileBuffer: Buffer, ignoreTruncatedChunks?: boolean): {
5
+ rawAudio: {
6
+ audioChannels: Float32Array[];
7
+ sampleRate: number;
8
+ };
9
+ sourceSampleFormat: SampleFormat;
10
+ sourceBitDepth: 32 | 16 | 8 | 24 | 64;
11
+ sourceSpeakerPositionMask: number;
12
+ };
13
+ export declare function trimAudioStart(audioSamples: Float32Array, targetStartSilenceSampleCount?: number, amplitudeThreshold?: number): Float32Array;
14
+ export declare function trimAudioEnd(audio: Float32Array, targetEndSilenceSampleCount?: number, amplitudeThreshold?: number): Float32Array;
15
+ export declare function downmixToMonoAndNormalize(rawAudio: RawAudio, targetPeakDb?: number): RawAudio;
16
+ export declare function normalizeAudioLevel(rawAudio: RawAudio, targetPeakDb?: number, maxIncreaseDb?: number): RawAudio;
17
+ export declare function applyGainDecibels(rawAudio: RawAudio, decibelGain: number): RawAudio;
18
+ export declare function applyGain(rawAudio: RawAudio, gain: number): RawAudio;
19
+ export declare function downmixToMono(rawAudio: RawAudio): RawAudio;
20
+ export declare function getAudioPeakDecibels(audioChannels: Float32Array[]): number;
21
+ export declare function getAudioPeakGain(audioChannels: Float32Array[]): number;
22
+ export declare function mixAudio(rawAudio1: RawAudio, rawAudio2: RawAudio): RawAudio;
23
+ export declare function sliceRawAudioByTime(rawAudio: RawAudio, startTime: number, endTime: number): RawAudio;
24
+ export declare function sliceRawAudio(rawAudio: RawAudio, startSampleIndex: number, endSampleIndex: number): RawAudio;
25
+ export declare function sliceAudioChannels(audioChannels: Float32Array[], startSampleIndex: number, endSampleIndex: number): Float32Array[];
26
+ export declare function concatAudioSegments(audioSegments: Float32Array[][]): Float32Array[];
27
+ export declare function fadeAudioInOut(rawAudio: RawAudio, fadeTime: number): RawAudio;
28
+ export declare function cloneRawAudio(rawAudio: RawAudio): RawAudio;
29
+ export declare function getSilentAudio(sampleCount: number, channelCount: number): Float32Array[];
30
+ export declare function getEmptyRawAudio(channelCount: number, sampleRate: number): RawAudio;
31
+ export declare function getRawAudioDuration(rawAudio: RawAudio): number;
32
+ export declare function gainToDecibels(gain: number): number;
33
+ export declare function decibelsToGain(decibels: number): number;
34
+ export declare function powerToDecibels(power: number): number;
35
+ export declare function decibelsToPower(decibels: number): number;
36
+ export type RawAudio = {
37
+ audioChannels: Float32Array[];
38
+ sampleRate: number;
39
+ };
40
+ export type AudioEncoding = {
41
+ codec?: string;
42
+ format: string;
43
+ channelCount: number;
44
+ sampleRate: number;
45
+ bitdepth: number;
46
+ sampleFormat: SampleFormat;
47
+ bitrate?: number;
48
+ };
@@ -0,0 +1,209 @@
1
+ import { SampleFormat, encodeWave, decodeWave } from "../codecs/WaveCodec.js";
2
+ import { concatFloat32Arrays } from '../utilities/Utilities.js';
3
+ ////////////////////////////////////////////////////////////////////////////////////////////////
4
+ // Wave encoding and decoding
5
+ ////////////////////////////////////////////////////////////////////////////////////////////////
6
+ export function encodeWaveBuffer(rawAudio, bitDepth = 16, sampleFormat = SampleFormat.PCM, speakerPositionMask = 0) {
7
+ return encodeWave(rawAudio, bitDepth, sampleFormat, speakerPositionMask);
8
+ }
9
+ export function decodeWaveBuffer(waveFileBuffer, ignoreTruncatedChunks = false) {
10
+ return decodeWave(waveFileBuffer, ignoreTruncatedChunks);
11
+ }
12
+ ////////////////////////////////////////////////////////////////////////////////////////////////
13
+ // Audio trimming
14
+ ////////////////////////////////////////////////////////////////////////////////////////////////
15
+ export function trimAudioStart(audioSamples, targetStartSilenceSampleCount = 0, amplitudeThreshold = -40) {
16
+ let silentSampleCount = 0;
17
+ const minSampleValue = decibelsToPower(amplitudeThreshold);
18
+ for (let i = 0; i < audioSamples.length - 1; i++) {
19
+ if (Math.abs(audioSamples[i]) > minSampleValue) {
20
+ break;
21
+ }
22
+ silentSampleCount += 1;
23
+ }
24
+ const trimmedAudio = audioSamples.subarray(silentSampleCount, audioSamples.length);
25
+ const restoredSilence = new Float32Array(targetStartSilenceSampleCount);
26
+ const trimmedAudioSamples = concatFloat32Arrays([restoredSilence, trimmedAudio]);
27
+ return trimmedAudioSamples;
28
+ }
29
+ export function trimAudioEnd(audio, targetEndSilenceSampleCount = 0, amplitudeThreshold = -40) {
30
+ let silenceSampleCount = 0;
31
+ const minSampleValue = decibelsToPower(amplitudeThreshold);
32
+ for (let i = audio.length - 1; i >= 0; i--) {
33
+ if (Math.abs(audio[i]) > minSampleValue) {
34
+ break;
35
+ }
36
+ silenceSampleCount += 1;
37
+ }
38
+ const trimmedAudio = audio.subarray(0, audio.length - silenceSampleCount);
39
+ const restoredSilence = new Float32Array(targetEndSilenceSampleCount);
40
+ return concatFloat32Arrays([trimmedAudio, restoredSilence]);
41
+ }
42
+ ////////////////////////////////////////////////////////////////////////////////////////////////
43
+ // Gain, normalization, mixing, and channel downmixing
44
+ ////////////////////////////////////////////////////////////////////////////////////////////////
45
+ export function downmixToMonoAndNormalize(rawAudio, targetPeakDb = -3) {
46
+ return normalizeAudioLevel(downmixToMono(rawAudio), targetPeakDb);
47
+ }
48
+ export function normalizeAudioLevel(rawAudio, targetPeakDb = -3, maxIncreaseDb = 30) {
49
+ const targetPeakSampleValue = decibelsToGain(targetPeakDb);
50
+ const maxMultiplier = decibelsToGain(maxIncreaseDb);
51
+ const maxAbsoluteSampleValue = getAudioPeakGain(rawAudio.audioChannels);
52
+ const multiplier = Math.min(targetPeakSampleValue / maxAbsoluteSampleValue, maxMultiplier);
53
+ return applyGain(rawAudio, multiplier);
54
+ }
55
+ export function applyGainDecibels(rawAudio, decibelGain) {
56
+ return applyGain(rawAudio, decibelsToGain(decibelGain));
57
+ }
58
+ export function applyGain(rawAudio, gain) {
59
+ const sampleCount = rawAudio.audioChannels[0].length;
60
+ const outputAudioChannels = [];
61
+ const multiplier = gain;
62
+ for (const channelSamples of rawAudio.audioChannels) {
63
+ const outputChannelSamples = new Float32Array(sampleCount);
64
+ for (let j = 0; j < sampleCount; j++) {
65
+ outputChannelSamples[j] = channelSamples[j] * multiplier;
66
+ }
67
+ outputAudioChannels.push(outputChannelSamples);
68
+ }
69
+ return { audioChannels: outputAudioChannels, sampleRate: rawAudio.sampleRate };
70
+ }
71
+ export function downmixToMono(rawAudio) {
72
+ const sampleCount = rawAudio.audioChannels[0].length;
73
+ const downmixedAudio = new Float32Array(sampleCount);
74
+ for (const channel of rawAudio.audioChannels) {
75
+ for (let i = 0; i < sampleCount; i++) {
76
+ downmixedAudio[i] += channel[i];
77
+ }
78
+ }
79
+ return { audioChannels: [downmixedAudio], sampleRate: rawAudio.sampleRate };
80
+ }
81
+ export function getAudioPeakDecibels(audioChannels) {
82
+ return gainToDecibels(getAudioPeakGain(audioChannels));
83
+ }
84
+ export function getAudioPeakGain(audioChannels) {
85
+ let maxAbsoluteSampleValue = 0.00001;
86
+ for (const channel of audioChannels) {
87
+ for (const sample of channel) {
88
+ maxAbsoluteSampleValue = Math.max(maxAbsoluteSampleValue, Math.abs(sample));
89
+ }
90
+ }
91
+ return maxAbsoluteSampleValue;
92
+ }
93
+ export function mixAudio(rawAudio1, rawAudio2) {
94
+ if (rawAudio1.audioChannels.length != rawAudio2.audioChannels.length) {
95
+ throw new Error("Can't mix audio of unequal channel counts");
96
+ }
97
+ if (rawAudio1.sampleRate != rawAudio2.sampleRate) {
98
+ throw new Error("Can't mix audio of different sample rates");
99
+ }
100
+ const mixedAudioChannels = [];
101
+ for (let c = 0; c < rawAudio1.audioChannels.length; c++) {
102
+ const inputChannel1 = rawAudio1.audioChannels[c];
103
+ const inputChannel2 = rawAudio2.audioChannels[c];
104
+ const mixedChannelLength = Math.min(inputChannel1.length, inputChannel2.length);
105
+ const mixedChannel = new Float32Array(mixedChannelLength);
106
+ for (let i = 0; i < mixedChannelLength; i++) {
107
+ mixedChannel[i] = inputChannel1[i] + inputChannel2[i];
108
+ }
109
+ mixedAudioChannels.push(mixedChannel);
110
+ }
111
+ const mixedAudio = { audioChannels: mixedAudioChannels, sampleRate: rawAudio1.sampleRate };
112
+ return mixedAudio;
113
+ }
114
+ ////////////////////////////////////////////////////////////////////////////////////////////////
115
+ // Cutting, concatenation, and other operations
116
+ ////////////////////////////////////////////////////////////////////////////////////////////////
117
+ export function sliceRawAudioByTime(rawAudio, startTime, endTime) {
118
+ const startSampleIndex = Math.floor(startTime * rawAudio.sampleRate);
119
+ const endSampleIndex = Math.floor(endTime * rawAudio.sampleRate);
120
+ return sliceRawAudio(rawAudio, startSampleIndex, endSampleIndex);
121
+ }
122
+ export function sliceRawAudio(rawAudio, startSampleIndex, endSampleIndex) {
123
+ return { audioChannels: sliceAudioChannels(rawAudio.audioChannels, startSampleIndex, endSampleIndex), sampleRate: rawAudio.sampleRate };
124
+ }
125
+ export function sliceAudioChannels(audioChannels, startSampleIndex, endSampleIndex) {
126
+ const channelCount = audioChannels.length;
127
+ const outAudioChannels = [];
128
+ for (let i = 0; i < channelCount; i++) {
129
+ outAudioChannels.push(audioChannels[i].slice(startSampleIndex, endSampleIndex));
130
+ }
131
+ return outAudioChannels;
132
+ }
133
+ export function concatAudioSegments(audioSegments) {
134
+ if (audioSegments.length == 0) {
135
+ return [];
136
+ }
137
+ const channelCount = audioSegments[0].length;
138
+ const outAudioChannels = [];
139
+ for (let i = 0; i < channelCount; i++) {
140
+ const audioSegmentsForChannel = audioSegments.map(segment => segment[i]);
141
+ outAudioChannels.push(concatFloat32Arrays(audioSegmentsForChannel));
142
+ }
143
+ return outAudioChannels;
144
+ }
145
+ export function fadeAudioInOut(rawAudio, fadeTime) {
146
+ const fadeSampleCount = Math.floor(rawAudio.sampleRate * fadeTime);
147
+ const gainReductionPerFrameDecibels = -60 / fadeSampleCount;
148
+ const gainReductionPerFrameMultiplier = decibelsToGain(gainReductionPerFrameDecibels);
149
+ const outAudioChannels = rawAudio.audioChannels.map(channel => channel.slice());
150
+ for (const channel of outAudioChannels) {
151
+ if (channel.length < fadeSampleCount * 2) {
152
+ continue;
153
+ }
154
+ let multiplier = 1.0;
155
+ for (let i = fadeSampleCount - 1; i >= 0; i--) {
156
+ channel[i] *= multiplier;
157
+ multiplier *= gainReductionPerFrameMultiplier;
158
+ }
159
+ multiplier = 1.0;
160
+ for (let i = channel.length - fadeSampleCount; i < channel.length; i++) {
161
+ channel[i] *= multiplier;
162
+ multiplier *= gainReductionPerFrameMultiplier;
163
+ }
164
+ }
165
+ return { audioChannels: outAudioChannels, sampleRate: rawAudio.sampleRate };
166
+ }
167
+ export function cloneRawAudio(rawAudio) {
168
+ return {
169
+ audioChannels: rawAudio.audioChannels.map(channel => channel.slice()),
170
+ sampleRate: rawAudio.sampleRate
171
+ };
172
+ }
173
+ export function getSilentAudio(sampleCount, channelCount) {
174
+ const audioChannels = [];
175
+ for (let i = 0; i < channelCount; i++) {
176
+ audioChannels.push(new Float32Array(sampleCount));
177
+ }
178
+ return audioChannels;
179
+ }
180
+ export function getEmptyRawAudio(channelCount, sampleRate) {
181
+ const audioChannels = [];
182
+ for (let c = 0; c < channelCount; c++) {
183
+ audioChannels.push(new Float32Array(0));
184
+ }
185
+ const result = { audioChannels, sampleRate };
186
+ return result;
187
+ }
188
+ export function getRawAudioDuration(rawAudio) {
189
+ if (rawAudio.audioChannels.length == 0 || rawAudio.sampleRate == 0) {
190
+ return 0;
191
+ }
192
+ return rawAudio.audioChannels[0].length / rawAudio.sampleRate;
193
+ }
194
+ ////////////////////////////////////////////////////////////////////////////////////////////////
195
+ // Unit conversion
196
+ ////////////////////////////////////////////////////////////////////////////////////////////////
197
+ export function gainToDecibels(gain) {
198
+ return gain <= 0.00001 ? -100 : (20.0 * Math.log10(gain));
199
+ }
200
+ export function decibelsToGain(decibels) {
201
+ return decibels <= -100.0 ? 0 : Math.pow(10, 0.05 * decibels);
202
+ }
203
+ export function powerToDecibels(power) {
204
+ return power <= 0.0000000001 ? -100 : (10.0 * Math.log10(power));
205
+ }
206
+ export function decibelsToPower(decibels) {
207
+ return decibels <= -100.0 ? 0 : Math.pow(10, 0.1 * decibels);
208
+ }
209
+ //# sourceMappingURL=AudioUtilities.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AudioUtilities.js","sourceRoot":"","sources":["../../src/audio/AudioUtilities.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export declare function tryResolvingSoxPath(): Promise<string | undefined>;
@@ -0,0 +1,19 @@
1
+ import path from "path";
2
+ import { loadPackage } from "../utilities/PackageManager.js";
3
+ import { commandExists } from "../utilities/Utilities.js";
4
+ export async function tryResolvingSoxPath() {
5
+ let soxPath = undefined;
6
+ if (process.platform == "win32") {
7
+ const soxPackagePath = await loadPackage("sox-14.4.1a-win32");
8
+ soxPath = path.join(soxPackagePath, "sox.exe");
9
+ }
10
+ else if (process.platform == "darwin" && process.arch == "x64") {
11
+ const soxPackagePath = await loadPackage("sox-14.4.1-macosx");
12
+ soxPath = path.join(soxPackagePath, "sox");
13
+ }
14
+ else if (await commandExists("sox")) {
15
+ soxPath = "sox";
16
+ }
17
+ return soxPath;
18
+ }
19
+ //# sourceMappingURL=SoxPath.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SoxPath.js","sourceRoot":"","sources":["../../src/audio/SoxPath.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAA;AACvB,OAAO,EAAE,WAAW,EAAE,MAAM,gCAAgC,CAAA;AAC5D,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAA;AAEzD,MAAM,CAAC,KAAK,UAAU,mBAAmB;IACxC,IAAI,OAAO,GAAuB,SAAS,CAAA;IAE3C,IAAI,OAAO,CAAC,QAAQ,IAAI,OAAO,EAAE;QAChC,MAAM,cAAc,GAAG,MAAM,WAAW,CAAC,mBAAmB,CAAC,CAAA;QAC7D,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,SAAS,CAAC,CAAA;KAC9C;SAAM,IAAI,OAAO,CAAC,QAAQ,IAAI,QAAQ,IAAI,OAAO,CAAC,IAAI,IAAI,KAAK,EAAE;QACjE,MAAM,cAAc,GAAG,MAAM,WAAW,CAAC,mBAAmB,CAAC,CAAA;QAC7D,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,KAAK,CAAC,CAAA;KAC1C;SAAM,IAAI,MAAM,aAAa,CAAC,KAAK,CAAC,EAAE;QACtC,OAAO,GAAG,KAAK,CAAA;KACf;IAED,OAAO,OAAO,CAAA;AACf,CAAC"}