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.
- package/README.md +59 -1
- package/data/lexicons/heteronyms.json +674 -0
- package/data/schemas/options.json +1057 -0
- package/data/tables/lcid-table.json +7427 -0
- package/dist/alignment/DTWMfccSequenceAlignment.d.ts +2 -0
- package/dist/alignment/DTWMfccSequenceAlignment.js +26 -0
- package/dist/alignment/DTWMfccSequenceAlignment.js.map +1 -0
- package/dist/alignment/DTWSequenceAlignment.d.ts +5 -0
- package/dist/alignment/DTWSequenceAlignment.js +99 -0
- package/dist/alignment/DTWSequenceAlignment.js.map +1 -0
- package/dist/alignment/DTWSequenceAlignmentWindowed.d.ts +5 -0
- package/dist/alignment/DTWSequenceAlignmentWindowed.js +161 -0
- package/dist/alignment/DTWSequenceAlignmentWindowed.js.map +1 -0
- package/dist/alignment/LevenshteinSequenceAlignment.d.ts +5 -0
- package/dist/alignment/LevenshteinSequenceAlignment.js +102 -0
- package/dist/alignment/LevenshteinSequenceAlignment.js.map +1 -0
- package/dist/alignment/SpeechAlignment.d.ts +27 -0
- package/dist/alignment/SpeechAlignment.js +266 -0
- package/dist/alignment/SpeechAlignment.js.map +1 -0
- package/dist/api/API.d.ts +8 -0
- package/dist/api/API.js +10 -0
- package/dist/api/API.js.map +1 -0
- package/dist/api/APIOptions.d.ts +12 -0
- package/dist/api/APIOptions.js +2 -0
- package/dist/api/APIOptions.js.map +1 -0
- package/dist/api/Alignment.d.ts +32 -0
- package/dist/api/Alignment.js +134 -0
- package/dist/api/Alignment.js.map +1 -0
- package/dist/api/Denoising.d.ts +14 -0
- package/dist/api/Denoising.js +66 -0
- package/dist/api/Denoising.js.map +1 -0
- package/dist/api/Globals.d.ts +1 -0
- package/dist/api/Globals.js +2 -0
- package/dist/api/Globals.js.map +1 -0
- package/dist/api/LanguageDetection.d.ts +49 -0
- package/dist/api/LanguageDetection.js +118 -0
- package/dist/api/LanguageDetection.js.map +1 -0
- package/dist/api/Recognition.d.ts +49 -0
- package/dist/api/Recognition.js +162 -0
- package/dist/api/Recognition.js.map +1 -0
- package/dist/api/Synthesis.d.ts +125 -0
- package/dist/api/Synthesis.js +892 -0
- package/dist/api/Synthesis.js.map +1 -0
- package/dist/api/Translation.d.ts +25 -0
- package/dist/api/Translation.js +69 -0
- package/dist/api/Translation.js.map +1 -0
- package/dist/api/Vad.d.ts +25 -0
- package/dist/api/Vad.js +88 -0
- package/dist/api/Vad.js.map +1 -0
- package/dist/audio/AudioBufferConversion.d.ts +15 -0
- package/dist/audio/AudioBufferConversion.js +228 -0
- package/dist/audio/AudioBufferConversion.js.map +1 -0
- package/dist/audio/AudioPlayer.d.ts +9 -0
- package/dist/audio/AudioPlayer.js +232 -0
- package/dist/audio/AudioPlayer.js.map +1 -0
- package/dist/audio/AudioRecorder.d.ts +3 -0
- package/dist/audio/AudioRecorder.js +68 -0
- package/dist/audio/AudioRecorder.js.map +1 -0
- package/dist/audio/AudioUtilities.d.ts +48 -0
- package/dist/audio/AudioUtilities.js +209 -0
- package/dist/audio/AudioUtilities.js.map +1 -0
- package/dist/audio/SoxPath.d.ts +1 -0
- package/dist/audio/SoxPath.js +19 -0
- package/dist/audio/SoxPath.js.map +1 -0
- package/dist/cli/CLI.d.ts +8 -0
- package/dist/cli/CLI.js +860 -0
- package/dist/cli/CLI.js.map +1 -0
- package/dist/cli/CLIConfigFile.d.ts +3 -0
- package/dist/cli/CLIConfigFile.js +62 -0
- package/dist/cli/CLIConfigFile.js.map +1 -0
- package/dist/cli/CLILauncher.d.ts +2 -0
- package/dist/cli/CLILauncher.js +22 -0
- package/dist/cli/CLILauncher.js.map +1 -0
- package/dist/cli/CLIOptionsSchema.d.ts +5 -0
- package/dist/cli/CLIOptionsSchema.js +36 -0
- package/dist/cli/CLIOptionsSchema.js.map +1 -0
- package/dist/cli/CLIParser.d.ts +6 -0
- package/dist/cli/CLIParser.js +34 -0
- package/dist/cli/CLIParser.js.map +1 -0
- package/dist/cli/CLIStarter.d.ts +1 -0
- package/dist/cli/CLIStarter.js +3 -0
- package/dist/cli/CLIStarter.js.map +1 -0
- package/dist/codecs/FFMpegTranscoder.d.ts +20 -0
- package/dist/codecs/FFMpegTranscoder.js +169 -0
- package/dist/codecs/FFMpegTranscoder.js.map +1 -0
- package/dist/codecs/TIMITCodec.d.ts +9 -0
- package/dist/codecs/TIMITCodec.js +14 -0
- package/dist/codecs/TIMITCodec.js.map +1 -0
- package/dist/codecs/WaveCodec.d.ts +19 -0
- package/dist/codecs/WaveCodec.js +208 -0
- package/dist/codecs/WaveCodec.js.map +1 -0
- package/dist/denoising/RNNoise.d.ts +6 -0
- package/dist/denoising/RNNoise.js +68 -0
- package/dist/denoising/RNNoise.js.map +1 -0
- package/dist/dsp/BiquadFilter.d.ts +26 -0
- package/dist/dsp/BiquadFilter.js +399 -0
- package/dist/dsp/BiquadFilter.js.map +1 -0
- package/dist/dsp/FFT.d.ts +9 -0
- package/dist/dsp/FFT.js +135 -0
- package/dist/dsp/FFT.js.map +1 -0
- package/dist/dsp/MFCC.d.ts +25 -0
- package/dist/dsp/MFCC.js +162 -0
- package/dist/dsp/MFCC.js.map +1 -0
- package/dist/dsp/MelSpectogram.d.ts +19 -0
- package/dist/dsp/MelSpectogram.js +102 -0
- package/dist/dsp/MelSpectogram.js.map +1 -0
- package/dist/dsp/Rubberband.d.ts +52 -0
- package/dist/dsp/Rubberband.js +186 -0
- package/dist/dsp/Rubberband.js.map +1 -0
- package/dist/dsp/Sonic.d.ts +2 -0
- package/dist/dsp/Sonic.js +39 -0
- package/dist/dsp/Sonic.js.map +1 -0
- package/dist/dsp/SpeexResampler.d.ts +3 -0
- package/dist/dsp/SpeexResampler.js +53 -0
- package/dist/dsp/SpeexResampler.js.map +1 -0
- package/dist/math/VectorMath.d.ts +70 -0
- package/dist/math/VectorMath.js +564 -0
- package/dist/math/VectorMath.js.map +1 -0
- package/dist/nlp/ChineseSegmentation.d.ts +1 -0
- package/dist/nlp/ChineseSegmentation.js +53 -0
- package/dist/nlp/ChineseSegmentation.js.map +1 -0
- package/dist/nlp/CompromiseNLP.d.ts +15 -0
- package/dist/nlp/CompromiseNLP.js +66 -0
- package/dist/nlp/CompromiseNLP.js.map +1 -0
- package/dist/nlp/EspeakPhonemizer.d.ts +4 -0
- package/dist/nlp/EspeakPhonemizer.js +133 -0
- package/dist/nlp/EspeakPhonemizer.js.map +1 -0
- package/dist/nlp/IPA.d.ts +19 -0
- package/dist/nlp/IPA.js +113 -0
- package/dist/nlp/IPA.js.map +1 -0
- package/dist/nlp/JapaneseSegmentation.d.ts +1 -0
- package/dist/nlp/JapaneseSegmentation.js +40 -0
- package/dist/nlp/JapaneseSegmentation.js.map +1 -0
- package/dist/nlp/Lexicon.d.ts +17 -0
- package/dist/nlp/Lexicon.js +6 -0
- package/dist/nlp/Lexicon.js.map +1 -0
- package/dist/nlp/PhoneConversion.d.ts +6 -0
- package/dist/nlp/PhoneConversion.js +467 -0
- package/dist/nlp/PhoneConversion.js.map +1 -0
- package/dist/nlp/Segmentation.d.ts +41 -0
- package/dist/nlp/Segmentation.js +158 -0
- package/dist/nlp/Segmentation.js.map +1 -0
- package/dist/nlp/TextNormalizer.d.ts +4 -0
- package/dist/nlp/TextNormalizer.js +69 -0
- package/dist/nlp/TextNormalizer.js.map +1 -0
- package/dist/recognition/AmazonTranscribeSTT.d.ts +6 -0
- package/dist/recognition/AmazonTranscribeSTT.js +79 -0
- package/dist/recognition/AmazonTranscribeSTT.js.map +1 -0
- package/dist/recognition/AzureCognitiveServicesSTT.d.ts +7 -0
- package/dist/recognition/AzureCognitiveServicesSTT.js +51 -0
- package/dist/recognition/AzureCognitiveServicesSTT.js.map +1 -0
- package/dist/recognition/GoogleCloudSTT.d.ts +7 -0
- package/dist/recognition/GoogleCloudSTT.js +66 -0
- package/dist/recognition/GoogleCloudSTT.js.map +1 -0
- package/dist/recognition/SileroSTT.d.ts +9 -0
- package/dist/recognition/SileroSTT.js +125 -0
- package/dist/recognition/SileroSTT.js.map +1 -0
- package/dist/recognition/VoskSTT.d.ts +10 -0
- package/dist/recognition/VoskSTT.js +78 -0
- package/dist/recognition/VoskSTT.js.map +1 -0
- package/dist/recognition/WhisperSTT.d.ts +69 -0
- package/dist/recognition/WhisperSTT.js +977 -0
- package/dist/recognition/WhisperSTT.js.map +1 -0
- package/dist/server/Server.d.ts +1 -0
- package/dist/server/Server.js +18 -0
- package/dist/server/Server.js.map +1 -0
- package/dist/speech-language-detection/SileroLanguageDetection.d.ts +9 -0
- package/dist/speech-language-detection/SileroLanguageDetection.js +47 -0
- package/dist/speech-language-detection/SileroLanguageDetection.js.map +1 -0
- package/dist/subtitles/Subtitles.d.ts +25 -0
- package/dist/subtitles/Subtitles.js +286 -0
- package/dist/subtitles/Subtitles.js.map +1 -0
- package/dist/synthesis/AwsPollyTTS.d.ts +7 -0
- package/dist/synthesis/AwsPollyTTS.js +51 -0
- package/dist/synthesis/AwsPollyTTS.js.map +1 -0
- package/dist/synthesis/AzureCognitiveServicesTTS.d.ts +9 -0
- package/dist/synthesis/AzureCognitiveServicesTTS.js +103 -0
- package/dist/synthesis/AzureCognitiveServicesTTS.js.map +1 -0
- package/dist/synthesis/CoquiServerTTS.d.ts +6 -0
- package/dist/synthesis/CoquiServerTTS.js +22 -0
- package/dist/synthesis/CoquiServerTTS.js.map +1 -0
- package/dist/synthesis/ElevenLabsTTS.d.ts +8 -0
- package/dist/synthesis/ElevenLabsTTS.js +48 -0
- package/dist/synthesis/ElevenLabsTTS.js.map +1 -0
- package/dist/synthesis/EspeakTTS.d.ts +46 -0
- package/dist/synthesis/EspeakTTS.js +353 -0
- package/dist/synthesis/EspeakTTS.js.map +1 -0
- package/dist/synthesis/FliteTTS.d.ts +17 -0
- package/dist/synthesis/FliteTTS.js +326 -0
- package/dist/synthesis/FliteTTS.js.map +1 -0
- package/dist/synthesis/GoogleCloudTTS.d.ts +16 -0
- package/dist/synthesis/GoogleCloudTTS.js +72 -0
- package/dist/synthesis/GoogleCloudTTS.js.map +1 -0
- package/dist/synthesis/GoogleTranslateTTS.d.ts +13 -0
- package/dist/synthesis/GoogleTranslateTTS.js +177 -0
- package/dist/synthesis/GoogleTranslateTTS.js.map +1 -0
- package/dist/synthesis/MicrosoftEdgeTTS.d.ts +10 -0
- package/dist/synthesis/MicrosoftEdgeTTS.js +216 -0
- package/dist/synthesis/MicrosoftEdgeTTS.js.map +1 -0
- package/dist/synthesis/SamTTS.d.ts +4 -0
- package/dist/synthesis/SamTTS.js +21 -0
- package/dist/synthesis/SamTTS.js.map +1 -0
- package/dist/synthesis/SapiTTS.d.ts +9 -0
- package/dist/synthesis/SapiTTS.js +211 -0
- package/dist/synthesis/SapiTTS.js.map +1 -0
- package/dist/synthesis/StreamlabsPollyTTS.d.ts +12 -0
- package/dist/synthesis/StreamlabsPollyTTS.js +88 -0
- package/dist/synthesis/StreamlabsPollyTTS.js.map +1 -0
- package/dist/synthesis/SvoxPicoTTS.d.ts +11 -0
- package/dist/synthesis/SvoxPicoTTS.js +236 -0
- package/dist/synthesis/SvoxPicoTTS.js.map +1 -0
- package/dist/synthesis/VitsTTS.d.ts +27 -0
- package/dist/synthesis/VitsTTS.js +359 -0
- package/dist/synthesis/VitsTTS.js.map +1 -0
- package/dist/tests/Test.d.ts +1 -0
- package/dist/tests/Test.js +10 -0
- package/dist/tests/Test.js.map +1 -0
- package/dist/text-language-detection/FastTextLanguageDetection.d.ts +2 -0
- package/dist/text-language-detection/FastTextLanguageDetection.js +38 -0
- package/dist/text-language-detection/FastTextLanguageDetection.js.map +1 -0
- package/dist/text-language-detection/TinyLDLanguageDetection.d.ts +2 -0
- package/dist/text-language-detection/TinyLDLanguageDetection.js +12 -0
- package/dist/text-language-detection/TinyLDLanguageDetection.js.map +1 -0
- package/dist/utilities/BinaryArrayConversion.d.ts +15 -0
- package/dist/utilities/BinaryArrayConversion.js +115 -0
- package/dist/utilities/BinaryArrayConversion.js.map +1 -0
- package/dist/utilities/Compression.d.ts +4 -0
- package/dist/utilities/Compression.js +67 -0
- package/dist/utilities/Compression.js.map +1 -0
- package/dist/utilities/FileDownloader.d.ts +3 -0
- package/dist/utilities/FileDownloader.js +147 -0
- package/dist/utilities/FileDownloader.js.map +1 -0
- package/dist/utilities/FileSystem.d.ts +30 -0
- package/dist/utilities/FileSystem.js +141 -0
- package/dist/utilities/FileSystem.js.map +1 -0
- package/dist/utilities/Hashing.d.ts +10 -0
- package/dist/utilities/Hashing.js +169 -0
- package/dist/utilities/Hashing.js.map +1 -0
- package/dist/utilities/Locale.d.ts +9 -0
- package/dist/utilities/Locale.js +65 -0
- package/dist/utilities/Locale.js.map +1 -0
- package/dist/utilities/Logger.d.ts +11 -0
- package/dist/utilities/Logger.js +49 -0
- package/dist/utilities/Logger.js.map +1 -0
- package/dist/utilities/NdArrayUtilities.d.ts +3 -0
- package/dist/utilities/NdArrayUtilities.js +22 -0
- package/dist/utilities/NdArrayUtilities.js.map +1 -0
- package/dist/utilities/ObjectUtilities.d.ts +4 -0
- package/dist/utilities/ObjectUtilities.js +132 -0
- package/dist/utilities/ObjectUtilities.js.map +1 -0
- package/dist/utilities/OpenPromise.d.ts +6 -0
- package/dist/utilities/OpenPromise.js +12 -0
- package/dist/utilities/OpenPromise.js.map +1 -0
- package/dist/utilities/PackageManager.d.ts +4 -0
- package/dist/utilities/PackageManager.js +46 -0
- package/dist/utilities/PackageManager.js.map +1 -0
- package/dist/utilities/RandomGenerator.d.ts +35 -0
- package/dist/utilities/RandomGenerator.js +149 -0
- package/dist/utilities/RandomGenerator.js.map +1 -0
- package/dist/utilities/TarballMaker.d.ts +4 -0
- package/dist/utilities/TarballMaker.js +50 -0
- package/dist/utilities/TarballMaker.js.map +1 -0
- package/dist/utilities/Timeline.d.ts +20 -0
- package/dist/utilities/Timeline.js +110 -0
- package/dist/utilities/Timeline.js.map +1 -0
- package/dist/utilities/Timer.d.ts +13 -0
- package/dist/utilities/Timer.js +70 -0
- package/dist/utilities/Timer.js.map +1 -0
- package/dist/utilities/Utilities.d.ts +68 -0
- package/dist/utilities/Utilities.js +305 -0
- package/dist/utilities/Utilities.js.map +1 -0
- package/dist/utilities/WasmMemoryManager.d.ts +142 -0
- package/dist/utilities/WasmMemoryManager.js +407 -0
- package/dist/utilities/WasmMemoryManager.js.map +1 -0
- package/dist/utilities/WebReader.d.ts +1 -0
- package/dist/utilities/WebReader.js +47 -0
- package/dist/utilities/WebReader.js.map +1 -0
- package/dist/utilities/WikipediaReader.d.ts +1 -0
- package/dist/utilities/WikipediaReader.js +31 -0
- package/dist/utilities/WikipediaReader.js.map +1 -0
- package/dist/voice-activity-detection/SileroVAD.d.ts +13 -0
- package/dist/voice-activity-detection/SileroVAD.js +58 -0
- package/dist/voice-activity-detection/SileroVAD.js.map +1 -0
- package/dist/voice-activity-detection/WebRtcVAD.d.ts +3 -0
- package/dist/voice-activity-detection/WebRtcVAD.js +53 -0
- package/dist/voice-activity-detection/WebRtcVAD.js.map +1 -0
- package/docs/CLI.md +234 -0
- package/docs/Development.md +3 -0
- package/docs/Engines.md +80 -0
- package/docs/Licenses.md +37 -0
- package/docs/Options.md +192 -0
- package/docs/Roadmap.md +16 -0
- package/docs/Technical.md +72 -0
- package/package.json +119 -19
- package/cli.js +0 -3
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { RawAudio } from "../audio/AudioUtilities.js";
|
|
2
|
+
import * as API from "./API.js";
|
|
3
|
+
import type { WhisperModelName } from "../recognition/WhisperSTT.js";
|
|
4
|
+
export declare function detectSpeechFileLanguage(filename: string, options: SpeechLanguageDetectionOptions): Promise<{
|
|
5
|
+
detectedLanguage: string;
|
|
6
|
+
detectedLanguageName: string;
|
|
7
|
+
detectedLanguageProbabilities: API.LanguageDetectionResults;
|
|
8
|
+
detectedLanguageGroupProbabilities: API.LanguageDetectionGroupResults;
|
|
9
|
+
}>;
|
|
10
|
+
export declare function detectSpeechLanguage(rawAudio: RawAudio, options: SpeechLanguageDetectionOptions): Promise<{
|
|
11
|
+
detectedLanguage: string;
|
|
12
|
+
detectedLanguageName: string;
|
|
13
|
+
detectedLanguageProbabilities: API.LanguageDetectionResults;
|
|
14
|
+
detectedLanguageGroupProbabilities: API.LanguageDetectionGroupResults;
|
|
15
|
+
}>;
|
|
16
|
+
export type SpeechLanguageDetectionEngine = "silero" | "whisper";
|
|
17
|
+
export interface SpeechLanguageDetectionOptions {
|
|
18
|
+
engine?: SpeechLanguageDetectionEngine;
|
|
19
|
+
defaultLanguage?: string;
|
|
20
|
+
fallbackThresholdProbability?: number;
|
|
21
|
+
silero?: {};
|
|
22
|
+
whisper?: {
|
|
23
|
+
model: WhisperModelName;
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
export declare const defaultSpeechLanguageDetectionOptions: SpeechLanguageDetectionOptions;
|
|
27
|
+
export declare function detectTextLanguage(text: string, options: TextLanguageDetectionOptions): Promise<{
|
|
28
|
+
detectedLanguage: string;
|
|
29
|
+
detectedLanguageName: string;
|
|
30
|
+
detectedLanguageProbabilities: API.LanguageDetectionResults;
|
|
31
|
+
}>;
|
|
32
|
+
export type LanguageDetectionResults = LanguageDetectionResultsEntry[];
|
|
33
|
+
export type LanguageDetectionResultsEntry = {
|
|
34
|
+
language: string;
|
|
35
|
+
languageName: string;
|
|
36
|
+
probability: number;
|
|
37
|
+
};
|
|
38
|
+
export type LanguageDetectionGroupResults = LanguageDetectionGroupResultsEntry[];
|
|
39
|
+
export type LanguageDetectionGroupResultsEntry = {
|
|
40
|
+
languageGroup: string;
|
|
41
|
+
probability: number;
|
|
42
|
+
};
|
|
43
|
+
export type TextLanguageDetectionEngine = "tinyld" | "fasttext";
|
|
44
|
+
export type TextLanguageDetectionOptions = {
|
|
45
|
+
engine?: TextLanguageDetectionEngine;
|
|
46
|
+
defaultLanguage?: string;
|
|
47
|
+
fallbackThresholdProbability?: number;
|
|
48
|
+
};
|
|
49
|
+
export declare const defaultTextLanguageDetectionOptions: TextLanguageDetectionOptions;
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
import { extendDeep } from "../utilities/ObjectUtilities.js";
|
|
2
|
+
import * as FFMpegTranscoder from "../codecs/FFMpegTranscoder.js";
|
|
3
|
+
import { downmixToMonoAndNormalize } from "../audio/AudioUtilities.js";
|
|
4
|
+
import { Logger } from "../utilities/Logger.js";
|
|
5
|
+
import { resampleAudioSpeex } from "../dsp/SpeexResampler.js";
|
|
6
|
+
import { logToStderr } from "../utilities/Utilities.js";
|
|
7
|
+
import path from "path";
|
|
8
|
+
import { languageCodeToName } from "../utilities/Locale.js";
|
|
9
|
+
import { loadPackage } from "../utilities/PackageManager.js";
|
|
10
|
+
const log = logToStderr;
|
|
11
|
+
/////////////////////////////////////////////////////////////////////////////////////////////
|
|
12
|
+
// Speech language detection
|
|
13
|
+
/////////////////////////////////////////////////////////////////////////////////////////////
|
|
14
|
+
export async function detectSpeechFileLanguage(filename, options) {
|
|
15
|
+
const rawAudio = await FFMpegTranscoder.decodeToChannels(filename);
|
|
16
|
+
return detectSpeechLanguage(rawAudio, options);
|
|
17
|
+
}
|
|
18
|
+
export async function detectSpeechLanguage(rawAudio, options) {
|
|
19
|
+
const logger = new Logger();
|
|
20
|
+
logger.start("Prepare for speech language detection");
|
|
21
|
+
options = extendDeep(defaultSpeechLanguageDetectionOptions, options);
|
|
22
|
+
const defaultLanguage = options.defaultLanguage;
|
|
23
|
+
const fallbackThresholdProbability = options.fallbackThresholdProbability;
|
|
24
|
+
rawAudio = await resampleAudioSpeex(rawAudio, 16000);
|
|
25
|
+
rawAudio = downmixToMonoAndNormalize(rawAudio);
|
|
26
|
+
logger.start(`Initialize ${options.engine} module`);
|
|
27
|
+
let detectedLanguageProbabilities;
|
|
28
|
+
let detectedLanguageGroupProbabilities;
|
|
29
|
+
switch (options.engine) {
|
|
30
|
+
case "silero": {
|
|
31
|
+
const SileroLanguageDetection = await import("../speech-language-detection/SileroLanguageDetection.js");
|
|
32
|
+
logger.end();
|
|
33
|
+
const sileroOptions = options.silero;
|
|
34
|
+
const modelDir = await loadPackage("silero-lang-classifier-95");
|
|
35
|
+
const modelPath = path.join(modelDir, "lang_classifier_95.onnx");
|
|
36
|
+
const languageDictionaryPath = path.join(modelDir, "lang_dict_95.json");
|
|
37
|
+
const languageGroupDictionaryPath = path.join(modelDir, "lang_group_dict_95.json");
|
|
38
|
+
const { languageResults, languageGroupResults } = await SileroLanguageDetection.detectLanguage(rawAudio, modelPath, languageDictionaryPath, languageGroupDictionaryPath);
|
|
39
|
+
detectedLanguageProbabilities = languageResults;
|
|
40
|
+
detectedLanguageGroupProbabilities = languageGroupResults;
|
|
41
|
+
break;
|
|
42
|
+
}
|
|
43
|
+
case "whisper": {
|
|
44
|
+
const WhisperSTT = await import("../recognition/WhisperSTT.js");
|
|
45
|
+
const whisperOptions = options.whisper;
|
|
46
|
+
const { modelName, modelDir, tokenizerDir } = await WhisperSTT.loadPackagesAndGetPaths(whisperOptions.model, undefined);
|
|
47
|
+
logger.end();
|
|
48
|
+
detectedLanguageProbabilities = await WhisperSTT.detectLanguage(rawAudio, modelName, modelDir, tokenizerDir);
|
|
49
|
+
detectedLanguageGroupProbabilities = [];
|
|
50
|
+
break;
|
|
51
|
+
}
|
|
52
|
+
default: {
|
|
53
|
+
throw new Error(`Engine '${options.engine}' is not supported`);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
let detectedLanguage;
|
|
57
|
+
let detectedLanguageName;
|
|
58
|
+
if (detectedLanguageProbabilities.length == 0 ||
|
|
59
|
+
detectedLanguageProbabilities[0].probability < fallbackThresholdProbability) {
|
|
60
|
+
detectedLanguage = defaultLanguage;
|
|
61
|
+
}
|
|
62
|
+
else {
|
|
63
|
+
detectedLanguage = detectedLanguageProbabilities[0].language;
|
|
64
|
+
}
|
|
65
|
+
logger.end();
|
|
66
|
+
return { detectedLanguage, detectedLanguageName: languageCodeToName(detectedLanguage), detectedLanguageProbabilities, detectedLanguageGroupProbabilities };
|
|
67
|
+
}
|
|
68
|
+
export const defaultSpeechLanguageDetectionOptions = {
|
|
69
|
+
engine: "silero",
|
|
70
|
+
silero: {},
|
|
71
|
+
whisper: {
|
|
72
|
+
model: "tiny",
|
|
73
|
+
}
|
|
74
|
+
};
|
|
75
|
+
/////////////////////////////////////////////////////////////////////////////////////////////
|
|
76
|
+
// Text language detection
|
|
77
|
+
/////////////////////////////////////////////////////////////////////////////////////////////
|
|
78
|
+
export async function detectTextLanguage(text, options) {
|
|
79
|
+
const logger = new Logger();
|
|
80
|
+
options = extendDeep(defaultTextLanguageDetectionOptions, options);
|
|
81
|
+
const defaultLanguage = options.defaultLanguage;
|
|
82
|
+
const fallbackThresholdProbability = options.fallbackThresholdProbability;
|
|
83
|
+
let detectedLanguageProbabilities;
|
|
84
|
+
logger.start(`Initialize ${options.engine} module`);
|
|
85
|
+
switch (options.engine) {
|
|
86
|
+
case "tinyld": {
|
|
87
|
+
const { detectLanguage } = await import("../text-language-detection/TinyLDLanguageDetection.js");
|
|
88
|
+
logger.start("Detecting text language using tinyld");
|
|
89
|
+
detectedLanguageProbabilities = await detectLanguage(text);
|
|
90
|
+
break;
|
|
91
|
+
}
|
|
92
|
+
case "fasttext": {
|
|
93
|
+
const { detectLanguage } = await import("../text-language-detection/FastTextLanguageDetection.js");
|
|
94
|
+
logger.start("Detecting text language using FastText");
|
|
95
|
+
detectedLanguageProbabilities = await detectLanguage(text);
|
|
96
|
+
break;
|
|
97
|
+
}
|
|
98
|
+
default: {
|
|
99
|
+
throw new Error(`Engine '${options.engine}' is not supported`);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
let detectedLanguage;
|
|
103
|
+
if (detectedLanguageProbabilities.length == 0 ||
|
|
104
|
+
detectedLanguageProbabilities[0].probability < fallbackThresholdProbability) {
|
|
105
|
+
detectedLanguage = defaultLanguage;
|
|
106
|
+
}
|
|
107
|
+
else {
|
|
108
|
+
detectedLanguage = detectedLanguageProbabilities[0].language;
|
|
109
|
+
}
|
|
110
|
+
logger.end();
|
|
111
|
+
return { detectedLanguage, detectedLanguageName: languageCodeToName(detectedLanguage), detectedLanguageProbabilities };
|
|
112
|
+
}
|
|
113
|
+
export const defaultTextLanguageDetectionOptions = {
|
|
114
|
+
engine: "tinyld",
|
|
115
|
+
defaultLanguage: "en",
|
|
116
|
+
fallbackThresholdProbability: 0.05
|
|
117
|
+
};
|
|
118
|
+
//# sourceMappingURL=LanguageDetection.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LanguageDetection.js","sourceRoot":"","sources":["../../src/api/LanguageDetection.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { RawAudio } from "../audio/AudioUtilities.js";
|
|
2
|
+
import * as API from "./API.js";
|
|
3
|
+
import { Timeline } from "../utilities/Timeline.js";
|
|
4
|
+
import type { WhisperModelName } from "../recognition/WhisperSTT.js";
|
|
5
|
+
export declare function recognizeFile(filename: string, options: RecognitionOptions): Promise<{
|
|
6
|
+
transcript: string;
|
|
7
|
+
timeline: Timeline;
|
|
8
|
+
rawAudio: RawAudio;
|
|
9
|
+
language: string;
|
|
10
|
+
}>;
|
|
11
|
+
export declare function recognize(inputRawAudio: RawAudio, options: RecognitionOptions): Promise<{
|
|
12
|
+
transcript: string;
|
|
13
|
+
timeline: Timeline;
|
|
14
|
+
rawAudio: RawAudio;
|
|
15
|
+
language: string;
|
|
16
|
+
}>;
|
|
17
|
+
export type RecognitionEngine = "whisper" | "vosk" | "silero" | "google-cloud" | "microsoft-azure" | "amazon-transcribe";
|
|
18
|
+
export interface RecognitionOptions {
|
|
19
|
+
engine?: RecognitionEngine;
|
|
20
|
+
language?: string;
|
|
21
|
+
maxAlternatives?: number;
|
|
22
|
+
alignment?: API.AlignmentOptions;
|
|
23
|
+
whisper?: {
|
|
24
|
+
model?: WhisperModelName;
|
|
25
|
+
};
|
|
26
|
+
vosk?: {
|
|
27
|
+
modelPath?: string;
|
|
28
|
+
};
|
|
29
|
+
silero?: {
|
|
30
|
+
modelPath?: string;
|
|
31
|
+
};
|
|
32
|
+
googleCloud?: {
|
|
33
|
+
apiKey?: string;
|
|
34
|
+
alternativeLanguageCodes?: string[];
|
|
35
|
+
profanityFilter?: boolean;
|
|
36
|
+
autoPunctuation?: boolean;
|
|
37
|
+
useEnhancedModel?: boolean;
|
|
38
|
+
};
|
|
39
|
+
microsoftAzure?: {
|
|
40
|
+
subscriptionKey?: string;
|
|
41
|
+
serviceRegion?: string;
|
|
42
|
+
};
|
|
43
|
+
amazonTranscribe?: {
|
|
44
|
+
region?: string;
|
|
45
|
+
accessKeyId?: string;
|
|
46
|
+
secretAccessKey?: string;
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
export declare const defaultRecognitionOptions: RecognitionOptions;
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
import { extendDeep } from "../utilities/ObjectUtilities.js";
|
|
2
|
+
import * as FFMpegTranscoder from "../codecs/FFMpegTranscoder.js";
|
|
3
|
+
import { logToStderr } from "../utilities/Utilities.js";
|
|
4
|
+
import { downmixToMonoAndNormalize, trimAudioEnd } from "../audio/AudioUtilities.js";
|
|
5
|
+
import { Logger } from "../utilities/Logger.js";
|
|
6
|
+
import { resampleAudioSpeex } from "../dsp/SpeexResampler.js";
|
|
7
|
+
import * as API from "./API.js";
|
|
8
|
+
import { formatLanguageCodeWithName, getShortLanguageCode, normalizeLanguageCode } from "../utilities/Locale.js";
|
|
9
|
+
import { loadPackage } from "../utilities/PackageManager.js";
|
|
10
|
+
const log = logToStderr;
|
|
11
|
+
export async function recognizeFile(filename, options) {
|
|
12
|
+
const rawAudio = await FFMpegTranscoder.decodeToChannels(filename);
|
|
13
|
+
return recognize(rawAudio, options);
|
|
14
|
+
}
|
|
15
|
+
export async function recognize(inputRawAudio, options) {
|
|
16
|
+
const logger = new Logger();
|
|
17
|
+
const startTimestamp = logger.getTimestamp();
|
|
18
|
+
logger.start("Prepare for recognition");
|
|
19
|
+
options = extendDeep(defaultRecognitionOptions, options);
|
|
20
|
+
const engine = options.engine;
|
|
21
|
+
let sourceRawAudio = await resampleAudioSpeex(inputRawAudio, 16000);
|
|
22
|
+
sourceRawAudio = downmixToMonoAndNormalize(sourceRawAudio);
|
|
23
|
+
sourceRawAudio.audioChannels[0] = trimAudioEnd(sourceRawAudio.audioChannels[0], 0, -40);
|
|
24
|
+
if (!options.language) { // && options.engine != "whisper") {
|
|
25
|
+
logger.start("No language provided. Detecting audio language");
|
|
26
|
+
const { detectedLanguage } = await API.detectSpeechLanguage(inputRawAudio, { engine: "silero" });
|
|
27
|
+
logger.end();
|
|
28
|
+
logger.log(`Language detected: ${formatLanguageCodeWithName(detectedLanguage)}`);
|
|
29
|
+
options.language = detectedLanguage;
|
|
30
|
+
}
|
|
31
|
+
let language = normalizeLanguageCode(options.language);
|
|
32
|
+
let transcript;
|
|
33
|
+
let timeline;
|
|
34
|
+
logger.start(`Load ${engine} module`);
|
|
35
|
+
switch (engine) {
|
|
36
|
+
case "whisper": {
|
|
37
|
+
const WhisperSTT = await import("../recognition/WhisperSTT.js");
|
|
38
|
+
const whisperOptions = options.whisper;
|
|
39
|
+
const shortLanguageCode = getShortLanguageCode(language);
|
|
40
|
+
const { modelName, modelDir, tokenizerDir } = await WhisperSTT.loadPackagesAndGetPaths(whisperOptions.model, shortLanguageCode);
|
|
41
|
+
if (shortLanguageCode != "en" && modelName.endsWith(".en")) {
|
|
42
|
+
throw new Error(`The model '${modelName}' is English only and cannot transcribe language '${shortLanguageCode}'`);
|
|
43
|
+
}
|
|
44
|
+
logger.end();
|
|
45
|
+
({ transcript, timeline } = await WhisperSTT.recognize(sourceRawAudio, modelName, modelDir, tokenizerDir, "transcribe", language));
|
|
46
|
+
break;
|
|
47
|
+
}
|
|
48
|
+
case "vosk": {
|
|
49
|
+
const VoskSTT = await import("../recognition/VoskSTT.js");
|
|
50
|
+
const voskOptions = options.vosk;
|
|
51
|
+
const modelPath = voskOptions.modelPath;
|
|
52
|
+
if (!modelPath) {
|
|
53
|
+
throw new Error("Vosk models are not currently auto-downloaded. You'll need to download a model manually and set a model path in 'vosk.modelPath'.");
|
|
54
|
+
}
|
|
55
|
+
logger.end();
|
|
56
|
+
({ transcript, timeline } = await VoskSTT.recognize(sourceRawAudio, modelPath, true));
|
|
57
|
+
break;
|
|
58
|
+
}
|
|
59
|
+
case "silero": {
|
|
60
|
+
const SileroSTT = await import("../recognition/SileroSTT.js");
|
|
61
|
+
const sileroOptions = options.silero;
|
|
62
|
+
let modelPath = sileroOptions.modelPath;
|
|
63
|
+
if (!modelPath) {
|
|
64
|
+
const shortLanguageCode = getShortLanguageCode(language);
|
|
65
|
+
const packageName = SileroSTT.languageCodeToPackageName[shortLanguageCode];
|
|
66
|
+
if (!packageName) {
|
|
67
|
+
throw new Error(`Language '${shortLanguageCode}' is not supported by Silero`);
|
|
68
|
+
}
|
|
69
|
+
modelPath = await loadPackage(packageName);
|
|
70
|
+
}
|
|
71
|
+
logger.end();
|
|
72
|
+
({ transcript, timeline } = await SileroSTT.recognize(sourceRawAudio, modelPath));
|
|
73
|
+
break;
|
|
74
|
+
}
|
|
75
|
+
case "google-cloud": {
|
|
76
|
+
const GoogleCloudSTT = await import("../recognition/GoogleCloudSTT.js");
|
|
77
|
+
const apiKey = options.googleCloud.apiKey;
|
|
78
|
+
if (!apiKey) {
|
|
79
|
+
throw new Error(`No API key given`);
|
|
80
|
+
}
|
|
81
|
+
logger.end();
|
|
82
|
+
({ transcript, timeline } = await GoogleCloudSTT.recognize(sourceRawAudio, apiKey, language));
|
|
83
|
+
break;
|
|
84
|
+
}
|
|
85
|
+
case "microsoft-azure": {
|
|
86
|
+
const AzureCognitiveServicesSTT = await import("../recognition/AzureCognitiveServicesSTT.js");
|
|
87
|
+
const subscriptionKey = options.microsoftAzure.subscriptionKey;
|
|
88
|
+
if (!subscriptionKey) {
|
|
89
|
+
throw new Error(`No subscription key given`);
|
|
90
|
+
}
|
|
91
|
+
const serviceRegion = options.microsoftAzure.serviceRegion;
|
|
92
|
+
if (!serviceRegion) {
|
|
93
|
+
throw new Error(`No service region given`);
|
|
94
|
+
}
|
|
95
|
+
logger.end();
|
|
96
|
+
({ transcript, timeline } = await AzureCognitiveServicesSTT.recognize(sourceRawAudio, subscriptionKey, serviceRegion, language));
|
|
97
|
+
break;
|
|
98
|
+
}
|
|
99
|
+
case "amazon-transcribe": {
|
|
100
|
+
const AmazonTranscribeSTT = await import("../recognition/AmazonTranscribeSTT.js");
|
|
101
|
+
const region = options.amazonTranscribe.region;
|
|
102
|
+
if (!region) {
|
|
103
|
+
throw new Error(`No region given`);
|
|
104
|
+
}
|
|
105
|
+
const accessKeyId = options.amazonTranscribe.accessKeyId;
|
|
106
|
+
if (!accessKeyId) {
|
|
107
|
+
throw new Error(`No access key id given`);
|
|
108
|
+
}
|
|
109
|
+
const secretAccessKey = options.amazonTranscribe.secretAccessKey;
|
|
110
|
+
if (!secretAccessKey) {
|
|
111
|
+
throw new Error(`No secret access key given`);
|
|
112
|
+
}
|
|
113
|
+
logger.end();
|
|
114
|
+
({ transcript, timeline } = await AmazonTranscribeSTT.recgonize(sourceRawAudio, language, region, accessKeyId, secretAccessKey));
|
|
115
|
+
break;
|
|
116
|
+
}
|
|
117
|
+
default: {
|
|
118
|
+
throw new Error(`Engine '${options.engine}' is not supported`);
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
if (!timeline) {
|
|
122
|
+
logger.start(`Align audio to transcript`);
|
|
123
|
+
const alignmentOptions = extendDeep(options.alignment, { language: language });
|
|
124
|
+
const { wordTimeline } = await API.align(sourceRawAudio, transcript, alignmentOptions);
|
|
125
|
+
timeline = wordTimeline;
|
|
126
|
+
}
|
|
127
|
+
logger.end();
|
|
128
|
+
logger.logDuration(`Total recognition time`, startTimestamp);
|
|
129
|
+
return { transcript, timeline, rawAudio: inputRawAudio, language };
|
|
130
|
+
}
|
|
131
|
+
export const defaultRecognitionOptions = {
|
|
132
|
+
engine: "whisper",
|
|
133
|
+
language: undefined,
|
|
134
|
+
maxAlternatives: 1,
|
|
135
|
+
alignment: undefined,
|
|
136
|
+
whisper: {
|
|
137
|
+
model: undefined,
|
|
138
|
+
},
|
|
139
|
+
vosk: {
|
|
140
|
+
modelPath: undefined
|
|
141
|
+
},
|
|
142
|
+
silero: {
|
|
143
|
+
modelPath: undefined
|
|
144
|
+
},
|
|
145
|
+
googleCloud: {
|
|
146
|
+
apiKey: undefined,
|
|
147
|
+
alternativeLanguageCodes: [],
|
|
148
|
+
profanityFilter: false,
|
|
149
|
+
autoPunctuation: true,
|
|
150
|
+
useEnhancedModel: true,
|
|
151
|
+
},
|
|
152
|
+
microsoftAzure: {
|
|
153
|
+
subscriptionKey: undefined,
|
|
154
|
+
serviceRegion: undefined
|
|
155
|
+
},
|
|
156
|
+
amazonTranscribe: {
|
|
157
|
+
region: undefined,
|
|
158
|
+
accessKeyId: undefined,
|
|
159
|
+
secretAccessKey: undefined,
|
|
160
|
+
}
|
|
161
|
+
};
|
|
162
|
+
//# sourceMappingURL=Recognition.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Recognition.js","sourceRoot":"","sources":["../../src/api/Recognition.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
import { RawAudio } from "../audio/AudioUtilities.js";
|
|
2
|
+
import { type RubberbandOptions } from "../dsp/Rubberband.js";
|
|
3
|
+
import * as API from "./API.js";
|
|
4
|
+
import { Timeline } from "../utilities/Timeline.js";
|
|
5
|
+
export declare function synthesizeSegments(segments: string[], options: SynthesisOptions, onSegment?: SynthesisSegmentEvent, onSentence?: SynthesisSegmentEvent): Promise<{
|
|
6
|
+
synthesizedAudio: RawAudio;
|
|
7
|
+
timeline: Timeline;
|
|
8
|
+
segmentsAudio: RawAudio[];
|
|
9
|
+
segmentsTimelines: Timeline[];
|
|
10
|
+
}>;
|
|
11
|
+
export type SynthesisEngine = "vits" | "pico" | "flite" | "espeak" | "sam" | "sapi" | "msspeech" | "coqui-server" | "google-cloud" | "microsoft-azure" | "amazon-polly" | "elevenlabs" | "google-translate" | "microsoft-edge" | "streamlabs-polly";
|
|
12
|
+
export type TimePitchShiftingMethod = "sonic" | "rubberband";
|
|
13
|
+
export interface SynthesisOptions {
|
|
14
|
+
engine?: SynthesisEngine;
|
|
15
|
+
language?: string;
|
|
16
|
+
voice?: string;
|
|
17
|
+
voiceGender?: VoiceGender;
|
|
18
|
+
speed?: number;
|
|
19
|
+
pitch?: number;
|
|
20
|
+
pitchVariation?: number;
|
|
21
|
+
ssml?: boolean;
|
|
22
|
+
splitToSentences?: boolean;
|
|
23
|
+
segmentEndPause?: number;
|
|
24
|
+
sentenceEndPause?: number;
|
|
25
|
+
alignment?: API.AlignmentOptions;
|
|
26
|
+
postProcessing?: {
|
|
27
|
+
normalizeAudio?: boolean;
|
|
28
|
+
targetPeakDb?: number;
|
|
29
|
+
maxIncreaseDb?: number;
|
|
30
|
+
speed?: number;
|
|
31
|
+
pitch?: number;
|
|
32
|
+
timePitchShiftingMethod?: TimePitchShiftingMethod;
|
|
33
|
+
rubberband?: RubberbandOptions;
|
|
34
|
+
};
|
|
35
|
+
vits?: {
|
|
36
|
+
speakerId?: number;
|
|
37
|
+
};
|
|
38
|
+
pico?: {};
|
|
39
|
+
flite?: {};
|
|
40
|
+
espeak?: {
|
|
41
|
+
rate?: number;
|
|
42
|
+
pitch?: number;
|
|
43
|
+
pitchRange?: number;
|
|
44
|
+
};
|
|
45
|
+
sam?: {
|
|
46
|
+
pitch?: number;
|
|
47
|
+
speed?: number;
|
|
48
|
+
mouth?: number;
|
|
49
|
+
throat?: number;
|
|
50
|
+
};
|
|
51
|
+
sapi?: {
|
|
52
|
+
rate?: number;
|
|
53
|
+
};
|
|
54
|
+
msspeech?: {
|
|
55
|
+
rate?: number;
|
|
56
|
+
};
|
|
57
|
+
coquiServer?: {
|
|
58
|
+
serverUrl?: string;
|
|
59
|
+
speakerId?: string | null;
|
|
60
|
+
};
|
|
61
|
+
googleCloud?: {
|
|
62
|
+
apiKey?: string;
|
|
63
|
+
pitchDeltaSemitones?: number;
|
|
64
|
+
customVoice?: {
|
|
65
|
+
model?: string;
|
|
66
|
+
reportedUsage?: string;
|
|
67
|
+
};
|
|
68
|
+
};
|
|
69
|
+
microsoftAzure?: {
|
|
70
|
+
subscriptionKey?: string;
|
|
71
|
+
serviceRegion?: string;
|
|
72
|
+
pitchDeltaHz?: number;
|
|
73
|
+
};
|
|
74
|
+
awsPolly?: {
|
|
75
|
+
region?: string;
|
|
76
|
+
accessKeyId?: string;
|
|
77
|
+
secretAccessKey?: string;
|
|
78
|
+
pollyEngine?: "standard" | "neural";
|
|
79
|
+
lexiconNames?: string[];
|
|
80
|
+
};
|
|
81
|
+
elevenlabs?: {
|
|
82
|
+
apiKey?: string;
|
|
83
|
+
stability?: number;
|
|
84
|
+
similarityBoost?: number;
|
|
85
|
+
};
|
|
86
|
+
googleTranslate?: {
|
|
87
|
+
tld?: string;
|
|
88
|
+
};
|
|
89
|
+
microsoftEdge?: {
|
|
90
|
+
trustedClientToken?: string;
|
|
91
|
+
pitchDeltaHz?: number;
|
|
92
|
+
};
|
|
93
|
+
streamlabsPolly?: {};
|
|
94
|
+
}
|
|
95
|
+
export declare const defaultSynthesisOptions: SynthesisOptions;
|
|
96
|
+
export declare function requestVoiceList(options: VoiceListRequestOptions): Promise<{
|
|
97
|
+
voiceList: API.SynthesisVoice[];
|
|
98
|
+
bestMatchingVoice: API.SynthesisVoice;
|
|
99
|
+
}>;
|
|
100
|
+
export declare function selectBestOfflineEngineForLanguage(language: string): SynthesisEngine;
|
|
101
|
+
export interface VoiceListRequestOptions extends SynthesisOptions {
|
|
102
|
+
cache?: {
|
|
103
|
+
path?: string;
|
|
104
|
+
duration?: number;
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
export declare const defaultVoiceListRequestOptions: VoiceListRequestOptions;
|
|
108
|
+
export interface SynthesisSegmentEventData {
|
|
109
|
+
index: number;
|
|
110
|
+
total: number;
|
|
111
|
+
audio: RawAudio;
|
|
112
|
+
timeline: Timeline;
|
|
113
|
+
transcript: string;
|
|
114
|
+
language: string;
|
|
115
|
+
peakDecibelsSoFar: number;
|
|
116
|
+
}
|
|
117
|
+
export type SynthesisSegmentEvent = (data: SynthesisSegmentEventData) => Promise<void>;
|
|
118
|
+
export interface SynthesisVoice {
|
|
119
|
+
name: string;
|
|
120
|
+
languages: string[];
|
|
121
|
+
gender: VoiceGender;
|
|
122
|
+
speakerCount?: number;
|
|
123
|
+
packageName?: string;
|
|
124
|
+
}
|
|
125
|
+
export type VoiceGender = "male" | "female" | "unknown";
|