@pico-brief/speech-services 1.0.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 +177 -0
- package/dist/audio-sampler.d.ts +9 -0
- package/dist/audio-sampler.d.ts.map +1 -0
- package/dist/audio-sampler.js +135 -0
- package/dist/audio-sampler.js.map +1 -0
- package/dist/client.d.ts +3 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +23 -0
- package/dist/client.js.map +1 -0
- package/dist/detect-locale.d.ts +3 -0
- package/dist/detect-locale.d.ts.map +1 -0
- package/dist/detect-locale.js +73 -0
- package/dist/detect-locale.js.map +1 -0
- package/dist/errors.d.ts +7 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +13 -0
- package/dist/errors.js.map +1 -0
- package/dist/fetch-voices.d.ts +3 -0
- package/dist/fetch-voices.d.ts.map +1 -0
- package/dist/fetch-voices.js +50 -0
- package/dist/fetch-voices.js.map +1 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +12 -0
- package/dist/index.js.map +1 -0
- package/dist/providers/assemblyai/index.d.ts +2 -0
- package/dist/providers/assemblyai/index.d.ts.map +1 -0
- package/dist/providers/assemblyai/index.js +2 -0
- package/dist/providers/assemblyai/index.js.map +1 -0
- package/dist/providers/assemblyai/transcribe.d.ts +3 -0
- package/dist/providers/assemblyai/transcribe.d.ts.map +1 -0
- package/dist/providers/assemblyai/transcribe.js +92 -0
- package/dist/providers/assemblyai/transcribe.js.map +1 -0
- package/dist/providers/assemblyai/types.d.ts +18 -0
- package/dist/providers/assemblyai/types.d.ts.map +1 -0
- package/dist/providers/assemblyai/types.js +2 -0
- package/dist/providers/assemblyai/types.js.map +1 -0
- package/dist/providers/azure/batch-transcribe.d.ts +3 -0
- package/dist/providers/azure/batch-transcribe.d.ts.map +1 -0
- package/dist/providers/azure/batch-transcribe.js +118 -0
- package/dist/providers/azure/batch-transcribe.js.map +1 -0
- package/dist/providers/azure/detect-languages.d.ts +3 -0
- package/dist/providers/azure/detect-languages.d.ts.map +1 -0
- package/dist/providers/azure/detect-languages.js +15 -0
- package/dist/providers/azure/detect-languages.js.map +1 -0
- package/dist/providers/azure/fetch-voices.d.ts +3 -0
- package/dist/providers/azure/fetch-voices.d.ts.map +1 -0
- package/dist/providers/azure/fetch-voices.js +22 -0
- package/dist/providers/azure/fetch-voices.js.map +1 -0
- package/dist/providers/azure/helpers.d.ts +2 -0
- package/dist/providers/azure/helpers.d.ts.map +1 -0
- package/dist/providers/azure/helpers.js +9 -0
- package/dist/providers/azure/helpers.js.map +1 -0
- package/dist/providers/azure/index.d.ts +5 -0
- package/dist/providers/azure/index.d.ts.map +1 -0
- package/dist/providers/azure/index.js +5 -0
- package/dist/providers/azure/index.js.map +1 -0
- package/dist/providers/azure/synthesize.d.ts +3 -0
- package/dist/providers/azure/synthesize.d.ts.map +1 -0
- package/dist/providers/azure/synthesize.js +57 -0
- package/dist/providers/azure/synthesize.js.map +1 -0
- package/dist/providers/azure/transcribe.d.ts +5 -0
- package/dist/providers/azure/transcribe.d.ts.map +1 -0
- package/dist/providers/azure/transcribe.js +75 -0
- package/dist/providers/azure/transcribe.js.map +1 -0
- package/dist/providers/azure/types.d.ts +48 -0
- package/dist/providers/azure/types.d.ts.map +1 -0
- package/dist/providers/azure/types.js +2 -0
- package/dist/providers/azure/types.js.map +1 -0
- package/dist/providers/cartesia/fetch-voices.d.ts +3 -0
- package/dist/providers/cartesia/fetch-voices.d.ts.map +1 -0
- package/dist/providers/cartesia/fetch-voices.js +37 -0
- package/dist/providers/cartesia/fetch-voices.js.map +1 -0
- package/dist/providers/cartesia/index.d.ts +3 -0
- package/dist/providers/cartesia/index.d.ts.map +1 -0
- package/dist/providers/cartesia/index.js +3 -0
- package/dist/providers/cartesia/index.js.map +1 -0
- package/dist/providers/cartesia/synthesize.d.ts +3 -0
- package/dist/providers/cartesia/synthesize.d.ts.map +1 -0
- package/dist/providers/cartesia/synthesize.js +54 -0
- package/dist/providers/cartesia/synthesize.js.map +1 -0
- package/dist/providers/cartesia/types.d.ts +14 -0
- package/dist/providers/cartesia/types.d.ts.map +1 -0
- package/dist/providers/cartesia/types.js +3 -0
- package/dist/providers/cartesia/types.js.map +1 -0
- package/dist/providers/deepgram/fetch-voices.d.ts +3 -0
- package/dist/providers/deepgram/fetch-voices.d.ts.map +1 -0
- package/dist/providers/deepgram/fetch-voices.js +27 -0
- package/dist/providers/deepgram/fetch-voices.js.map +1 -0
- package/dist/providers/deepgram/index.d.ts +4 -0
- package/dist/providers/deepgram/index.d.ts.map +1 -0
- package/dist/providers/deepgram/index.js +4 -0
- package/dist/providers/deepgram/index.js.map +1 -0
- package/dist/providers/deepgram/synthesize.d.ts +3 -0
- package/dist/providers/deepgram/synthesize.d.ts.map +1 -0
- package/dist/providers/deepgram/synthesize.js +31 -0
- package/dist/providers/deepgram/synthesize.js.map +1 -0
- package/dist/providers/deepgram/transcribe.d.ts +3 -0
- package/dist/providers/deepgram/transcribe.d.ts.map +1 -0
- package/dist/providers/deepgram/transcribe.js +53 -0
- package/dist/providers/deepgram/transcribe.js.map +1 -0
- package/dist/providers/deepgram/types.d.ts +39 -0
- package/dist/providers/deepgram/types.d.ts.map +1 -0
- package/dist/providers/deepgram/types.js +2 -0
- package/dist/providers/deepgram/types.js.map +1 -0
- package/dist/providers/elevenlabs/fetch-voices.d.ts +3 -0
- package/dist/providers/elevenlabs/fetch-voices.d.ts.map +1 -0
- package/dist/providers/elevenlabs/fetch-voices.js +27 -0
- package/dist/providers/elevenlabs/fetch-voices.js.map +1 -0
- package/dist/providers/elevenlabs/index.d.ts +4 -0
- package/dist/providers/elevenlabs/index.d.ts.map +1 -0
- package/dist/providers/elevenlabs/index.js +4 -0
- package/dist/providers/elevenlabs/index.js.map +1 -0
- package/dist/providers/elevenlabs/synthesize.d.ts +3 -0
- package/dist/providers/elevenlabs/synthesize.d.ts.map +1 -0
- package/dist/providers/elevenlabs/synthesize.js +43 -0
- package/dist/providers/elevenlabs/synthesize.js.map +1 -0
- package/dist/providers/elevenlabs/transcribe.d.ts +3 -0
- package/dist/providers/elevenlabs/transcribe.d.ts.map +1 -0
- package/dist/providers/elevenlabs/transcribe.js +50 -0
- package/dist/providers/elevenlabs/transcribe.js.map +1 -0
- package/dist/providers/elevenlabs/types.d.ts +24 -0
- package/dist/providers/elevenlabs/types.d.ts.map +1 -0
- package/dist/providers/elevenlabs/types.js +2 -0
- package/dist/providers/elevenlabs/types.js.map +1 -0
- package/dist/providers/google/fetch-voices.d.ts +3 -0
- package/dist/providers/google/fetch-voices.d.ts.map +1 -0
- package/dist/providers/google/fetch-voices.js +28 -0
- package/dist/providers/google/fetch-voices.js.map +1 -0
- package/dist/providers/google/helpers.d.ts +10 -0
- package/dist/providers/google/helpers.d.ts.map +1 -0
- package/dist/providers/google/helpers.js +15 -0
- package/dist/providers/google/helpers.js.map +1 -0
- package/dist/providers/google/index.d.ts +4 -0
- package/dist/providers/google/index.d.ts.map +1 -0
- package/dist/providers/google/index.js +4 -0
- package/dist/providers/google/index.js.map +1 -0
- package/dist/providers/google/synthesize.d.ts +3 -0
- package/dist/providers/google/synthesize.d.ts.map +1 -0
- package/dist/providers/google/synthesize.js +35 -0
- package/dist/providers/google/synthesize.js.map +1 -0
- package/dist/providers/google/transcribe.d.ts +3 -0
- package/dist/providers/google/transcribe.d.ts.map +1 -0
- package/dist/providers/google/transcribe.js +117 -0
- package/dist/providers/google/transcribe.js.map +1 -0
- package/dist/providers/google/types.d.ts +43 -0
- package/dist/providers/google/types.d.ts.map +1 -0
- package/dist/providers/google/types.js +3 -0
- package/dist/providers/google/types.js.map +1 -0
- package/dist/providers/openai/fetch-voices.d.ts +3 -0
- package/dist/providers/openai/fetch-voices.d.ts.map +1 -0
- package/dist/providers/openai/fetch-voices.js +14 -0
- package/dist/providers/openai/fetch-voices.js.map +1 -0
- package/dist/providers/openai/index.d.ts +4 -0
- package/dist/providers/openai/index.d.ts.map +1 -0
- package/dist/providers/openai/index.js +4 -0
- package/dist/providers/openai/index.js.map +1 -0
- package/dist/providers/openai/synthesize.d.ts +3 -0
- package/dist/providers/openai/synthesize.d.ts.map +1 -0
- package/dist/providers/openai/synthesize.js +37 -0
- package/dist/providers/openai/synthesize.js.map +1 -0
- package/dist/providers/openai/transcribe.d.ts +3 -0
- package/dist/providers/openai/transcribe.d.ts.map +1 -0
- package/dist/providers/openai/transcribe.js +58 -0
- package/dist/providers/openai/transcribe.js.map +1 -0
- package/dist/providers/openai/types.d.ts +18 -0
- package/dist/providers/openai/types.d.ts.map +1 -0
- package/dist/providers/openai/types.js +2 -0
- package/dist/providers/openai/types.js.map +1 -0
- package/dist/providers/playht/fetch-voices.d.ts +3 -0
- package/dist/providers/playht/fetch-voices.d.ts.map +1 -0
- package/dist/providers/playht/fetch-voices.js +25 -0
- package/dist/providers/playht/fetch-voices.js.map +1 -0
- package/dist/providers/playht/index.d.ts +3 -0
- package/dist/providers/playht/index.d.ts.map +1 -0
- package/dist/providers/playht/index.js +3 -0
- package/dist/providers/playht/index.js.map +1 -0
- package/dist/providers/playht/synthesize.d.ts +3 -0
- package/dist/providers/playht/synthesize.d.ts.map +1 -0
- package/dist/providers/playht/synthesize.js +41 -0
- package/dist/providers/playht/synthesize.js.map +1 -0
- package/dist/providers/playht/types.d.ts +11 -0
- package/dist/providers/playht/types.d.ts.map +1 -0
- package/dist/providers/playht/types.js +2 -0
- package/dist/providers/playht/types.js.map +1 -0
- package/dist/providers/revai/index.d.ts +2 -0
- package/dist/providers/revai/index.d.ts.map +1 -0
- package/dist/providers/revai/index.js +2 -0
- package/dist/providers/revai/index.js.map +1 -0
- package/dist/providers/revai/transcribe.d.ts +3 -0
- package/dist/providers/revai/transcribe.d.ts.map +1 -0
- package/dist/providers/revai/transcribe.js +97 -0
- package/dist/providers/revai/transcribe.js.map +1 -0
- package/dist/providers/revai/types.d.ts +23 -0
- package/dist/providers/revai/types.d.ts.map +1 -0
- package/dist/providers/revai/types.js +2 -0
- package/dist/providers/revai/types.js.map +1 -0
- package/dist/providers/speechmatics/detect-languages.d.ts +3 -0
- package/dist/providers/speechmatics/detect-languages.d.ts.map +1 -0
- package/dist/providers/speechmatics/detect-languages.js +24 -0
- package/dist/providers/speechmatics/detect-languages.js.map +1 -0
- package/dist/providers/speechmatics/helpers.d.ts +4 -0
- package/dist/providers/speechmatics/helpers.d.ts.map +1 -0
- package/dist/providers/speechmatics/helpers.js +57 -0
- package/dist/providers/speechmatics/helpers.js.map +1 -0
- package/dist/providers/speechmatics/index.d.ts +3 -0
- package/dist/providers/speechmatics/index.d.ts.map +1 -0
- package/dist/providers/speechmatics/index.js +3 -0
- package/dist/providers/speechmatics/index.js.map +1 -0
- package/dist/providers/speechmatics/transcribe.d.ts +3 -0
- package/dist/providers/speechmatics/transcribe.d.ts.map +1 -0
- package/dist/providers/speechmatics/transcribe.js +61 -0
- package/dist/providers/speechmatics/transcribe.js.map +1 -0
- package/dist/providers/speechmatics/types.d.ts +27 -0
- package/dist/providers/speechmatics/types.d.ts.map +1 -0
- package/dist/providers/speechmatics/types.js +2 -0
- package/dist/providers/speechmatics/types.js.map +1 -0
- package/dist/synthesize.d.ts +4 -0
- package/dist/synthesize.d.ts.map +1 -0
- package/dist/synthesize.js +73 -0
- package/dist/synthesize.js.map +1 -0
- package/dist/transcribe.d.ts +3 -0
- package/dist/transcribe.d.ts.map +1 -0
- package/dist/transcribe.js +55 -0
- package/dist/transcribe.js.map +1 -0
- package/dist/types.d.ts +361 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +3 -0
- package/dist/types.js.map +1 -0
- package/dist/utils.d.ts +19 -0
- package/dist/utils.d.ts.map +1 -0
- package/dist/utils.js +101 -0
- package/dist/utils.js.map +1 -0
- package/dist/voice-cache.d.ts +9 -0
- package/dist/voice-cache.d.ts.map +1 -0
- package/dist/voice-cache.js +21 -0
- package/dist/voice-cache.js.map +1 -0
- package/dist/voice-resolver.d.ts +7 -0
- package/dist/voice-resolver.d.ts.map +1 -0
- package/dist/voice-resolver.js +82 -0
- package/dist/voice-resolver.js.map +1 -0
- package/package.json +100 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"synthesize.d.ts","sourceRoot":"","sources":["../../../src/providers/playht/synthesize.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,uBAAuB,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAK9F,wBAAsB,UAAU,CAC5B,MAAM,EAAE,YAAY,EACpB,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,MAAM,GAAG,SAAS,EAC5B,OAAO,GAAE,uBAA4B,GACtC,OAAO,CAAC,gBAAgB,CAAC,CAiD3B"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { SpeechServiceError } from "../../errors.js";
|
|
2
|
+
import { detectFormatFromString } from "../../utils.js";
|
|
3
|
+
import { BASE_URL } from "./types.js";
|
|
4
|
+
export async function synthesize(config, text, voice, language, options = {}) {
|
|
5
|
+
const { voiceEngine = "Play3.0-mini", outputFormat = "mp3", speed, sampleRate, quality, } = options;
|
|
6
|
+
const body = {
|
|
7
|
+
text,
|
|
8
|
+
voice,
|
|
9
|
+
voice_engine: voiceEngine,
|
|
10
|
+
output_format: outputFormat,
|
|
11
|
+
};
|
|
12
|
+
if (speed !== undefined)
|
|
13
|
+
body.speed = speed;
|
|
14
|
+
if (sampleRate !== undefined)
|
|
15
|
+
body.sample_rate = sampleRate;
|
|
16
|
+
if (quality)
|
|
17
|
+
body.quality = quality;
|
|
18
|
+
if (language)
|
|
19
|
+
body.language = language.toLowerCase();
|
|
20
|
+
const response = await fetch(`${BASE_URL}/tts/stream`, {
|
|
21
|
+
method: "POST",
|
|
22
|
+
headers: {
|
|
23
|
+
"X-USER-ID": config.userId,
|
|
24
|
+
AUTHORIZATION: config.apiKey,
|
|
25
|
+
Accept: "audio/mpeg",
|
|
26
|
+
"Content-Type": "application/json",
|
|
27
|
+
},
|
|
28
|
+
body: JSON.stringify(body),
|
|
29
|
+
});
|
|
30
|
+
if (!response.ok) {
|
|
31
|
+
const errorText = await response.text();
|
|
32
|
+
throw new SpeechServiceError(`PlayHT TTS failed: ${errorText}`, "API_ERROR", "playht", response.status);
|
|
33
|
+
}
|
|
34
|
+
const arrayBuffer = await response.arrayBuffer();
|
|
35
|
+
return {
|
|
36
|
+
audio: Buffer.from(arrayBuffer),
|
|
37
|
+
format: detectFormatFromString(outputFormat),
|
|
38
|
+
voice,
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=synthesize.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"synthesize.js","sourceRoot":"","sources":["../../../src/providers/playht/synthesize.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AACrD,OAAO,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AACxD,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAEtC,MAAM,CAAC,KAAK,UAAU,UAAU,CAC5B,MAAoB,EACpB,IAAY,EACZ,KAAa,EACb,QAA4B,EAC5B,UAAmC,EAAE;IAErC,MAAM,EACF,WAAW,GAAG,cAAc,EAC5B,YAAY,GAAG,KAAK,EACpB,KAAK,EACL,UAAU,EACV,OAAO,GACV,GAAG,OAAO,CAAC;IAEZ,MAAM,IAAI,GAA4B;QAClC,IAAI;QACJ,KAAK;QACL,YAAY,EAAE,WAAW;QACzB,aAAa,EAAE,YAAY;KAC9B,CAAC;IAEF,IAAI,KAAK,KAAK,SAAS;QAAE,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IAC5C,IAAI,UAAU,KAAK,SAAS;QAAE,IAAI,CAAC,WAAW,GAAG,UAAU,CAAC;IAC5D,IAAI,OAAO;QAAE,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACpC,IAAI,QAAQ;QAAE,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC,WAAW,EAAE,CAAC;IAErD,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,QAAQ,aAAa,EAAE;QACnD,MAAM,EAAE,MAAM;QACd,OAAO,EAAE;YACL,WAAW,EAAE,MAAM,CAAC,MAAM;YAC1B,aAAa,EAAE,MAAM,CAAC,MAAM;YAC5B,MAAM,EAAE,YAAY;YACpB,cAAc,EAAE,kBAAkB;SACrC;QACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;KAC7B,CAAC,CAAC;IAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACf,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;QACxC,MAAM,IAAI,kBAAkB,CACxB,sBAAsB,SAAS,EAAE,EACjC,WAAW,EACX,QAAQ,EACR,QAAQ,CAAC,MAAM,CAClB,CAAC;IACN,CAAC;IAED,MAAM,WAAW,GAAG,MAAM,QAAQ,CAAC,WAAW,EAAE,CAAC;IAEjD,OAAO;QACH,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC;QAC/B,MAAM,EAAE,sBAAsB,CAAC,YAAY,CAAC;QAC5C,KAAK;KACR,CAAC;AACN,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export declare const BASE_URL = "https://api.play.ht/api/v2";
|
|
2
|
+
export interface PlayHTVoice {
|
|
3
|
+
id: string;
|
|
4
|
+
name: string;
|
|
5
|
+
language?: string;
|
|
6
|
+
language_code?: string;
|
|
7
|
+
gender?: string;
|
|
8
|
+
accent?: string;
|
|
9
|
+
sample?: string;
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/providers/playht/types.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,QAAQ,+BAA+B,CAAC;AAErD,MAAM,WAAW,WAAW;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;CACnB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/providers/playht/types.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,QAAQ,GAAG,4BAA4B,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/providers/revai/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/providers/revai/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import type { RevAIConfig, RevAITranscribeOptions, TranscribeResult } from "../../types.js";
|
|
2
|
+
export declare function transcribe(config: RevAIConfig, audio: Buffer | string, languages: string[] | undefined, options?: RevAITranscribeOptions): Promise<TranscribeResult>;
|
|
3
|
+
//# sourceMappingURL=transcribe.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transcribe.d.ts","sourceRoot":"","sources":["../../../src/providers/revai/transcribe.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACR,WAAW,EACX,sBAAsB,EACtB,gBAAgB,EAEnB,MAAM,gBAAgB,CAAC;AAMxB,wBAAsB,UAAU,CAC5B,MAAM,EAAE,WAAW,EACnB,KAAK,EAAE,MAAM,GAAG,MAAM,EACtB,SAAS,EAAE,MAAM,EAAE,GAAG,SAAS,EAC/B,OAAO,GAAE,sBAA2B,GACrC,OAAO,CAAC,gBAAgB,CAAC,CA4I3B"}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import { SpeechServiceError } from "../../errors.js";
|
|
2
|
+
import { isUrl, poll } from "../../utils.js";
|
|
3
|
+
import { BASE_URL } from "./types.js";
|
|
4
|
+
export async function transcribe(config, audio, languages, options = {}) {
|
|
5
|
+
const { skipDiarization = false, skipPunctuation = false, filterProfanity = false, pollInterval = 5000, timeout = 300_000, } = options;
|
|
6
|
+
const language = languages?.[0] ?? "en";
|
|
7
|
+
const jobOptions = {
|
|
8
|
+
language,
|
|
9
|
+
skip_diarization: skipDiarization,
|
|
10
|
+
skip_punctuation: skipPunctuation,
|
|
11
|
+
filter_profanity: filterProfanity,
|
|
12
|
+
};
|
|
13
|
+
// Step 1: Submit job
|
|
14
|
+
let submitResponse;
|
|
15
|
+
if (typeof audio === "string" && isUrl(audio)) {
|
|
16
|
+
// URL input: JSON body
|
|
17
|
+
submitResponse = await fetch(`${BASE_URL}/jobs`, {
|
|
18
|
+
method: "POST",
|
|
19
|
+
headers: {
|
|
20
|
+
Authorization: `Bearer ${config.apiKey}`,
|
|
21
|
+
"Content-Type": "application/json",
|
|
22
|
+
},
|
|
23
|
+
body: JSON.stringify({
|
|
24
|
+
source_config: { url: audio },
|
|
25
|
+
...jobOptions,
|
|
26
|
+
}),
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
else if (Buffer.isBuffer(audio)) {
|
|
30
|
+
// Buffer input: multipart with media + options
|
|
31
|
+
const formData = new FormData();
|
|
32
|
+
formData.append("media", new Blob([new Uint8Array(audio)]), "audio.mp3");
|
|
33
|
+
formData.append("options", JSON.stringify(jobOptions));
|
|
34
|
+
submitResponse = await fetch(`${BASE_URL}/jobs`, {
|
|
35
|
+
method: "POST",
|
|
36
|
+
headers: { Authorization: `Bearer ${config.apiKey}` },
|
|
37
|
+
body: formData,
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
else {
|
|
41
|
+
throw new SpeechServiceError("audio must be a Buffer or a URL string", "INVALID_INPUT", "revai");
|
|
42
|
+
}
|
|
43
|
+
if (!submitResponse.ok) {
|
|
44
|
+
const errorText = await submitResponse.text();
|
|
45
|
+
throw new SpeechServiceError(`Rev.ai job submission failed: ${errorText}`, "API_ERROR", "revai", submitResponse.status);
|
|
46
|
+
}
|
|
47
|
+
const job = (await submitResponse.json());
|
|
48
|
+
// Step 2: Poll until complete
|
|
49
|
+
const finalJob = await poll(async () => {
|
|
50
|
+
const res = await fetch(`${BASE_URL}/jobs/${job.id}`, {
|
|
51
|
+
headers: { Authorization: `Bearer ${config.apiKey}` },
|
|
52
|
+
});
|
|
53
|
+
if (!res.ok) {
|
|
54
|
+
throw new SpeechServiceError(`Rev.ai polling failed: ${res.status}`, "API_ERROR", "revai", res.status);
|
|
55
|
+
}
|
|
56
|
+
return res.json();
|
|
57
|
+
}, (result) => result.status === "transcribed" || result.status === "failed", pollInterval, timeout, "revai");
|
|
58
|
+
if (finalJob.status === "failed") {
|
|
59
|
+
throw new SpeechServiceError(`Rev.ai transcription failed: ${finalJob.failure ?? finalJob.failure_detail ?? "Unknown error"}`, "TRANSCRIPTION_FAILED", "revai");
|
|
60
|
+
}
|
|
61
|
+
// Step 3: Fetch transcript
|
|
62
|
+
const transcriptResponse = await fetch(`${BASE_URL}/jobs/${job.id}/transcript`, {
|
|
63
|
+
headers: {
|
|
64
|
+
Authorization: `Bearer ${config.apiKey}`,
|
|
65
|
+
Accept: "application/vnd.rev.transcript.v1.0+json",
|
|
66
|
+
},
|
|
67
|
+
});
|
|
68
|
+
if (!transcriptResponse.ok) {
|
|
69
|
+
const errorText = await transcriptResponse.text();
|
|
70
|
+
throw new SpeechServiceError(`Rev.ai transcript fetch failed: ${errorText}`, "API_ERROR", "revai", transcriptResponse.status);
|
|
71
|
+
}
|
|
72
|
+
const transcript = (await transcriptResponse.json());
|
|
73
|
+
// Step 4: Normalize
|
|
74
|
+
const words = [];
|
|
75
|
+
const textParts = [];
|
|
76
|
+
for (const monologue of transcript.monologues ?? []) {
|
|
77
|
+
for (const element of monologue.elements) {
|
|
78
|
+
if (element.type === "text") {
|
|
79
|
+
words.push({
|
|
80
|
+
text: element.value,
|
|
81
|
+
startTime: element.ts ?? 0,
|
|
82
|
+
endTime: element.end_ts ?? 0,
|
|
83
|
+
confidence: element.confidence,
|
|
84
|
+
speaker: String(monologue.speaker),
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
textParts.push(element.value);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
return {
|
|
91
|
+
text: textParts.join("").trim(),
|
|
92
|
+
words,
|
|
93
|
+
language: finalJob.language ?? language,
|
|
94
|
+
duration: finalJob.duration_seconds ?? 0,
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
//# sourceMappingURL=transcribe.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transcribe.js","sourceRoot":"","sources":["../../../src/providers/revai/transcribe.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
export declare const BASE_URL = "https://api.rev.ai/speechtotext/v1";
|
|
2
|
+
export interface RevAIJob {
|
|
3
|
+
id: string;
|
|
4
|
+
status: "in_progress" | "transcribed" | "failed";
|
|
5
|
+
language?: string;
|
|
6
|
+
duration_seconds?: number;
|
|
7
|
+
failure?: string;
|
|
8
|
+
failure_detail?: string;
|
|
9
|
+
}
|
|
10
|
+
export interface RevAITranscript {
|
|
11
|
+
monologues?: Array<{
|
|
12
|
+
speaker: number;
|
|
13
|
+
elements: RevAIElement[];
|
|
14
|
+
}>;
|
|
15
|
+
}
|
|
16
|
+
export interface RevAIElement {
|
|
17
|
+
type: "text" | "punct" | "unknown";
|
|
18
|
+
value: string;
|
|
19
|
+
ts?: number;
|
|
20
|
+
end_ts?: number;
|
|
21
|
+
confidence?: number;
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/providers/revai/types.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,QAAQ,uCAAuC,CAAC;AAE7D,MAAM,WAAW,QAAQ;IACrB,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,aAAa,GAAG,aAAa,GAAG,QAAQ,CAAC;IACjD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,cAAc,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,eAAe;IAC5B,UAAU,CAAC,EAAE,KAAK,CAAC;QACf,OAAO,EAAE,MAAM,CAAC;QAChB,QAAQ,EAAE,YAAY,EAAE,CAAC;KAC5B,CAAC,CAAC;CACN;AAED,MAAM,WAAW,YAAY;IACzB,IAAI,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS,CAAC;IACnC,KAAK,EAAE,MAAM,CAAC;IACd,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;CACvB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/providers/revai/types.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,QAAQ,GAAG,oCAAoC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"detect-languages.d.ts","sourceRoot":"","sources":["../../../src/providers/speechmatics/detect-languages.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAIzD,wBAAsB,eAAe,CACjC,MAAM,EAAE,kBAAkB,EAC1B,KAAK,EAAE,MAAM,GAAG,MAAM,GACvB,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAuB9B"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { getBaseLanguage } from "../../utils.js";
|
|
2
|
+
import { runTranscriptionJob } from "./helpers.js";
|
|
3
|
+
export async function detectLanguages(config, audio) {
|
|
4
|
+
const jobConfig = {
|
|
5
|
+
type: "transcription",
|
|
6
|
+
transcription_config: {
|
|
7
|
+
language: "auto",
|
|
8
|
+
operating_point: "standard",
|
|
9
|
+
},
|
|
10
|
+
};
|
|
11
|
+
const transcript = await runTranscriptionJob(config, audio, jobConfig, 5000, 300_000);
|
|
12
|
+
const counts = new Map();
|
|
13
|
+
for (const result of transcript.results ?? []) {
|
|
14
|
+
if (result.type === "word") {
|
|
15
|
+
const lang = result.alternatives?.[0]?.language;
|
|
16
|
+
if (lang) {
|
|
17
|
+
const base = getBaseLanguage(lang);
|
|
18
|
+
counts.set(base, (counts.get(base) ?? 0) + 1);
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
return counts;
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=detect-languages.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"detect-languages.js","sourceRoot":"","sources":["../../../src/providers/speechmatics/detect-languages.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AAEnD,MAAM,CAAC,KAAK,UAAU,eAAe,CACjC,MAA0B,EAC1B,KAAsB;IAEtB,MAAM,SAAS,GAA4B;QACvC,IAAI,EAAE,eAAe;QACrB,oBAAoB,EAAE;YAClB,QAAQ,EAAE,MAAM;YAChB,eAAe,EAAE,UAAU;SAC9B;KACJ,CAAC;IAEF,MAAM,UAAU,GAAG,MAAM,mBAAmB,CAAC,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;IAEtF,MAAM,MAAM,GAAG,IAAI,GAAG,EAAkB,CAAC;IACzC,KAAK,MAAM,MAAM,IAAI,UAAU,CAAC,OAAO,IAAI,EAAE,EAAE,CAAC;QAC5C,IAAI,MAAM,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;YACzB,MAAM,IAAI,GAAG,MAAM,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC;YAChD,IAAI,IAAI,EAAE,CAAC;gBACP,MAAM,IAAI,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC;gBACnC,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YAClD,CAAC;QACL,CAAC;IACL,CAAC;IAED,OAAO,MAAM,CAAC;AAClB,CAAC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { SpeechmaticsConfig } from "../../types.js";
|
|
2
|
+
import type { SpeechmaticsTranscript } from "./types.js";
|
|
3
|
+
export declare function runTranscriptionJob(config: SpeechmaticsConfig, audio: Buffer | string, jobConfig: Record<string, unknown>, pollInterval: number, timeout: number): Promise<SpeechmaticsTranscript>;
|
|
4
|
+
//# sourceMappingURL=helpers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../../src/providers/speechmatics/helpers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAGzD,OAAO,KAAK,EAA2B,sBAAsB,EAAE,MAAM,YAAY,CAAC;AAOlF,wBAAsB,mBAAmB,CACrC,MAAM,EAAE,kBAAkB,EAC1B,KAAK,EAAE,MAAM,GAAG,MAAM,EACtB,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAClC,YAAY,EAAE,MAAM,EACpB,OAAO,EAAE,MAAM,GAChB,OAAO,CAAC,sBAAsB,CAAC,CAwFjC"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { SpeechServiceError } from "../../errors.js";
|
|
2
|
+
import { poll } from "../../utils.js";
|
|
3
|
+
function getBaseUrl(config) {
|
|
4
|
+
const region = config.region ?? "eu1";
|
|
5
|
+
return `https://${region}.asr.api.speechmatics.com/v2`;
|
|
6
|
+
}
|
|
7
|
+
export async function runTranscriptionJob(config, audio, jobConfig, pollInterval, timeout) {
|
|
8
|
+
const baseUrl = getBaseUrl(config);
|
|
9
|
+
// Step 1: Submit job
|
|
10
|
+
const formData = new FormData();
|
|
11
|
+
formData.append("config", JSON.stringify(jobConfig));
|
|
12
|
+
if (Buffer.isBuffer(audio)) {
|
|
13
|
+
formData.append("data_file", new Blob([new Uint8Array(audio)]), "audio.mp3");
|
|
14
|
+
}
|
|
15
|
+
else if (typeof audio === "string") {
|
|
16
|
+
// For URLs, use fetch_data in config instead of form data
|
|
17
|
+
jobConfig.fetch_data = { url: audio };
|
|
18
|
+
formData.set("config", JSON.stringify(jobConfig));
|
|
19
|
+
}
|
|
20
|
+
const submitResponse = await fetch(`${baseUrl}/jobs/`, {
|
|
21
|
+
method: "POST",
|
|
22
|
+
headers: { Authorization: `Bearer ${config.apiKey}` },
|
|
23
|
+
body: formData,
|
|
24
|
+
});
|
|
25
|
+
if (!submitResponse.ok) {
|
|
26
|
+
const errorText = await submitResponse.text();
|
|
27
|
+
throw new SpeechServiceError(`Speechmatics job submission failed: ${errorText}`, "API_ERROR", "speechmatics", submitResponse.status);
|
|
28
|
+
}
|
|
29
|
+
const jobResponse = (await submitResponse.json());
|
|
30
|
+
const jobId = jobResponse.job?.id;
|
|
31
|
+
if (!jobId) {
|
|
32
|
+
throw new SpeechServiceError("Speechmatics returned no job ID", "API_ERROR", "speechmatics");
|
|
33
|
+
}
|
|
34
|
+
// Step 2: Poll until complete
|
|
35
|
+
const finalJob = await poll(async () => {
|
|
36
|
+
const res = await fetch(`${baseUrl}/jobs/${jobId}`, {
|
|
37
|
+
headers: { Authorization: `Bearer ${config.apiKey}` },
|
|
38
|
+
});
|
|
39
|
+
if (!res.ok) {
|
|
40
|
+
throw new SpeechServiceError(`Speechmatics polling failed: ${res.status}`, "API_ERROR", "speechmatics", res.status);
|
|
41
|
+
}
|
|
42
|
+
return res.json();
|
|
43
|
+
}, (result) => result.job?.status === "done" || result.job?.status === "rejected", pollInterval, timeout, "speechmatics");
|
|
44
|
+
if (finalJob.job?.status === "rejected") {
|
|
45
|
+
throw new SpeechServiceError("Speechmatics transcription was rejected", "TRANSCRIPTION_FAILED", "speechmatics");
|
|
46
|
+
}
|
|
47
|
+
// Step 3: Fetch transcript
|
|
48
|
+
const transcriptResponse = await fetch(`${baseUrl}/jobs/${jobId}/transcript?format=json-v2`, {
|
|
49
|
+
headers: { Authorization: `Bearer ${config.apiKey}` },
|
|
50
|
+
});
|
|
51
|
+
if (!transcriptResponse.ok) {
|
|
52
|
+
const errorText = await transcriptResponse.text();
|
|
53
|
+
throw new SpeechServiceError(`Speechmatics transcript fetch failed: ${errorText}`, "API_ERROR", "speechmatics", transcriptResponse.status);
|
|
54
|
+
}
|
|
55
|
+
return (await transcriptResponse.json());
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=helpers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"helpers.js","sourceRoot":"","sources":["../../../src/providers/speechmatics/helpers.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AACrD,OAAO,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AAGtC,SAAS,UAAU,CAAC,MAA0B;IAC1C,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,IAAI,KAAK,CAAC;IACtC,OAAO,WAAW,MAAM,8BAA8B,CAAC;AAC3D,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACrC,MAA0B,EAC1B,KAAsB,EACtB,SAAkC,EAClC,YAAoB,EACpB,OAAe;IAEf,MAAM,OAAO,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC;IAEnC,qBAAqB;IACrB,MAAM,QAAQ,GAAG,IAAI,QAAQ,EAAE,CAAC;IAChC,QAAQ,CAAC,MAAM,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,CAAC;IAErD,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QACzB,QAAQ,CAAC,MAAM,CAAC,WAAW,EAAE,IAAI,IAAI,CAAC,CAAC,IAAI,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC;IACjF,CAAC;SAAM,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QACnC,0DAA0D;QACzD,SAAqC,CAAC,UAAU,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC;QACnE,QAAQ,CAAC,GAAG,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,CAAC;IACtD,CAAC;IAED,MAAM,cAAc,GAAG,MAAM,KAAK,CAAC,GAAG,OAAO,QAAQ,EAAE;QACnD,MAAM,EAAE,MAAM;QACd,OAAO,EAAE,EAAE,aAAa,EAAE,UAAU,MAAM,CAAC,MAAM,EAAE,EAAE;QACrD,IAAI,EAAE,QAAQ;KACjB,CAAC,CAAC;IAEH,IAAI,CAAC,cAAc,CAAC,EAAE,EAAE,CAAC;QACrB,MAAM,SAAS,GAAG,MAAM,cAAc,CAAC,IAAI,EAAE,CAAC;QAC9C,MAAM,IAAI,kBAAkB,CACxB,uCAAuC,SAAS,EAAE,EAClD,WAAW,EACX,cAAc,EACd,cAAc,CAAC,MAAM,CACxB,CAAC;IACN,CAAC;IAED,MAAM,WAAW,GAAG,CAAC,MAAM,cAAc,CAAC,IAAI,EAAE,CAA4B,CAAC;IAC7E,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE,EAAE,CAAC;IAElC,IAAI,CAAC,KAAK,EAAE,CAAC;QACT,MAAM,IAAI,kBAAkB,CACxB,iCAAiC,EACjC,WAAW,EACX,cAAc,CACjB,CAAC;IACN,CAAC;IAED,8BAA8B;IAC9B,MAAM,QAAQ,GAAG,MAAM,IAAI,CACvB,KAAK,IAAI,EAAE;QACP,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,OAAO,SAAS,KAAK,EAAE,EAAE;YAChD,OAAO,EAAE,EAAE,aAAa,EAAE,UAAU,MAAM,CAAC,MAAM,EAAE,EAAE;SACxD,CAAC,CAAC;QACH,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;YACV,MAAM,IAAI,kBAAkB,CACxB,gCAAgC,GAAG,CAAC,MAAM,EAAE,EAC5C,WAAW,EACX,cAAc,EACd,GAAG,CAAC,MAAM,CACb,CAAC;QACN,CAAC;QACD,OAAO,GAAG,CAAC,IAAI,EAAsC,CAAC;IAC1D,CAAC,EACD,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,IAAI,MAAM,CAAC,GAAG,EAAE,MAAM,KAAK,UAAU,EAC9E,YAAY,EACZ,OAAO,EACP,cAAc,CACjB,CAAC;IAEF,IAAI,QAAQ,CAAC,GAAG,EAAE,MAAM,KAAK,UAAU,EAAE,CAAC;QACtC,MAAM,IAAI,kBAAkB,CACxB,yCAAyC,EACzC,sBAAsB,EACtB,cAAc,CACjB,CAAC;IACN,CAAC;IAED,2BAA2B;IAC3B,MAAM,kBAAkB,GAAG,MAAM,KAAK,CAAC,GAAG,OAAO,SAAS,KAAK,4BAA4B,EAAE;QACzF,OAAO,EAAE,EAAE,aAAa,EAAE,UAAU,MAAM,CAAC,MAAM,EAAE,EAAE;KACxD,CAAC,CAAC;IAEH,IAAI,CAAC,kBAAkB,CAAC,EAAE,EAAE,CAAC;QACzB,MAAM,SAAS,GAAG,MAAM,kBAAkB,CAAC,IAAI,EAAE,CAAC;QAClD,MAAM,IAAI,kBAAkB,CACxB,yCAAyC,SAAS,EAAE,EACpD,WAAW,EACX,cAAc,EACd,kBAAkB,CAAC,MAAM,CAC5B,CAAC;IACN,CAAC;IAED,OAAO,CAAC,MAAM,kBAAkB,CAAC,IAAI,EAAE,CAA2B,CAAC;AACvE,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/providers/speechmatics/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/providers/speechmatics/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import type { SpeechmaticsConfig, SpeechmaticsTranscribeOptions, TranscribeResult } from "../../types.js";
|
|
2
|
+
export declare function transcribe(config: SpeechmaticsConfig, audio: Buffer | string, languages: string[] | undefined, options?: SpeechmaticsTranscribeOptions): Promise<TranscribeResult>;
|
|
3
|
+
//# sourceMappingURL=transcribe.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transcribe.d.ts","sourceRoot":"","sources":["../../../src/providers/speechmatics/transcribe.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACR,kBAAkB,EAClB,6BAA6B,EAC7B,gBAAgB,EAEnB,MAAM,gBAAgB,CAAC;AAGxB,wBAAsB,UAAU,CAC5B,MAAM,EAAE,kBAAkB,EAC1B,KAAK,EAAE,MAAM,GAAG,MAAM,EACtB,SAAS,EAAE,MAAM,EAAE,GAAG,SAAS,EAC/B,OAAO,GAAE,6BAAkC,GAC5C,OAAO,CAAC,gBAAgB,CAAC,CAkE3B"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { runTranscriptionJob } from "./helpers.js";
|
|
2
|
+
export async function transcribe(config, audio, languages, options = {}) {
|
|
3
|
+
const { operatingPoint = "enhanced", diarization = "none", pollInterval = 5000, timeout = 300_000, } = options;
|
|
4
|
+
const language = languages?.[0] ?? "en";
|
|
5
|
+
const jobConfig = {
|
|
6
|
+
type: "transcription",
|
|
7
|
+
transcription_config: {
|
|
8
|
+
language,
|
|
9
|
+
operating_point: operatingPoint,
|
|
10
|
+
...(diarization !== "none" ? { diarization: diarization } : {}),
|
|
11
|
+
},
|
|
12
|
+
};
|
|
13
|
+
const transcript = await runTranscriptionJob(config, audio, jobConfig, pollInterval, timeout);
|
|
14
|
+
// Normalize: build text and word list
|
|
15
|
+
const words = [];
|
|
16
|
+
const textParts = [];
|
|
17
|
+
let detectedLanguage = language;
|
|
18
|
+
let lastEndTime = 0;
|
|
19
|
+
for (const result of transcript.results ?? []) {
|
|
20
|
+
const alt = result.alternatives?.[0];
|
|
21
|
+
if (!alt)
|
|
22
|
+
continue;
|
|
23
|
+
if (result.type === "word") {
|
|
24
|
+
words.push({
|
|
25
|
+
text: alt.content,
|
|
26
|
+
startTime: result.start_time,
|
|
27
|
+
endTime: result.end_time,
|
|
28
|
+
confidence: alt.confidence,
|
|
29
|
+
speaker: alt.speaker ?? result.speaker ?? undefined,
|
|
30
|
+
});
|
|
31
|
+
textParts.push(alt.content);
|
|
32
|
+
if (alt.language)
|
|
33
|
+
detectedLanguage = alt.language;
|
|
34
|
+
if (result.end_time > lastEndTime)
|
|
35
|
+
lastEndTime = result.end_time;
|
|
36
|
+
}
|
|
37
|
+
else if (result.type === "punctuation") {
|
|
38
|
+
textParts.push(alt.content);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
// Build text: words separated by spaces, punctuation appended directly
|
|
42
|
+
let text = "";
|
|
43
|
+
for (const result of transcript.results ?? []) {
|
|
44
|
+
const content = result.alternatives?.[0]?.content;
|
|
45
|
+
if (!content)
|
|
46
|
+
continue;
|
|
47
|
+
if (result.type === "word") {
|
|
48
|
+
text += (text.length > 0 ? " " : "") + content;
|
|
49
|
+
}
|
|
50
|
+
else if (result.type === "punctuation") {
|
|
51
|
+
text += content;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
return {
|
|
55
|
+
text,
|
|
56
|
+
words,
|
|
57
|
+
language: detectedLanguage,
|
|
58
|
+
duration: transcript.job?.duration ?? lastEndTime,
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=transcribe.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transcribe.js","sourceRoot":"","sources":["../../../src/providers/speechmatics/transcribe.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AAEnD,MAAM,CAAC,KAAK,UAAU,UAAU,CAC5B,MAA0B,EAC1B,KAAsB,EACtB,SAA+B,EAC/B,UAAyC,EAAE;IAE3C,MAAM,EACF,cAAc,GAAG,UAAU,EAC3B,WAAW,GAAG,MAAM,EACpB,YAAY,GAAG,IAAI,EACnB,OAAO,GAAG,OAAO,GACpB,GAAG,OAAO,CAAC;IAEZ,MAAM,QAAQ,GAAG,SAAS,EAAE,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC;IAExC,MAAM,SAAS,GAA4B;QACvC,IAAI,EAAE,eAAe;QACrB,oBAAoB,EAAE;YAClB,QAAQ;YACR,eAAe,EAAE,cAAc;YAC/B,GAAG,CAAC,WAAW,KAAK,MAAM,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAClE;KACJ,CAAC;IAEF,MAAM,UAAU,GAAG,MAAM,mBAAmB,CAAC,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,YAAY,EAAE,OAAO,CAAC,CAAC;IAE9F,sCAAsC;IACtC,MAAM,KAAK,GAAsB,EAAE,CAAC;IACpC,MAAM,SAAS,GAAa,EAAE,CAAC;IAC/B,IAAI,gBAAgB,GAAG,QAAQ,CAAC;IAChC,IAAI,WAAW,GAAG,CAAC,CAAC;IAEpB,KAAK,MAAM,MAAM,IAAI,UAAU,CAAC,OAAO,IAAI,EAAE,EAAE,CAAC;QAC5C,MAAM,GAAG,GAAG,MAAM,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,CAAC;QACrC,IAAI,CAAC,GAAG;YAAE,SAAS;QAEnB,IAAI,MAAM,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;YACzB,KAAK,CAAC,IAAI,CAAC;gBACP,IAAI,EAAE,GAAG,CAAC,OAAO;gBACjB,SAAS,EAAE,MAAM,CAAC,UAAU;gBAC5B,OAAO,EAAE,MAAM,CAAC,QAAQ;gBACxB,UAAU,EAAE,GAAG,CAAC,UAAU;gBAC1B,OAAO,EAAE,GAAG,CAAC,OAAO,IAAI,MAAM,CAAC,OAAO,IAAI,SAAS;aACtD,CAAC,CAAC;YACH,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YAE5B,IAAI,GAAG,CAAC,QAAQ;gBAAE,gBAAgB,GAAG,GAAG,CAAC,QAAQ,CAAC;YAClD,IAAI,MAAM,CAAC,QAAQ,GAAG,WAAW;gBAAE,WAAW,GAAG,MAAM,CAAC,QAAQ,CAAC;QACrE,CAAC;aAAM,IAAI,MAAM,CAAC,IAAI,KAAK,aAAa,EAAE,CAAC;YACvC,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAChC,CAAC;IACL,CAAC;IAED,uEAAuE;IACvE,IAAI,IAAI,GAAG,EAAE,CAAC;IACd,KAAK,MAAM,MAAM,IAAI,UAAU,CAAC,OAAO,IAAI,EAAE,EAAE,CAAC;QAC5C,MAAM,OAAO,GAAG,MAAM,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC;QAClD,IAAI,CAAC,OAAO;YAAE,SAAS;QACvB,IAAI,MAAM,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;YACzB,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC;QACnD,CAAC;aAAM,IAAI,MAAM,CAAC,IAAI,KAAK,aAAa,EAAE,CAAC;YACvC,IAAI,IAAI,OAAO,CAAC;QACpB,CAAC;IACL,CAAC;IAED,OAAO;QACH,IAAI;QACJ,KAAK;QACL,QAAQ,EAAE,gBAAgB;QAC1B,QAAQ,EAAE,UAAU,CAAC,GAAG,EAAE,QAAQ,IAAI,WAAW;KACpD,CAAC;AACN,CAAC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
export interface SpeechmaticsJobResponse {
|
|
2
|
+
job?: {
|
|
3
|
+
id: string;
|
|
4
|
+
status: "running" | "done" | "rejected";
|
|
5
|
+
duration?: number;
|
|
6
|
+
};
|
|
7
|
+
}
|
|
8
|
+
export interface SpeechmaticsTranscript {
|
|
9
|
+
results?: SpeechmaticsResult[];
|
|
10
|
+
job?: {
|
|
11
|
+
duration?: number;
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
export interface SpeechmaticsResult {
|
|
15
|
+
type: "word" | "punctuation" | "entity";
|
|
16
|
+
start_time: number;
|
|
17
|
+
end_time: number;
|
|
18
|
+
channel?: string;
|
|
19
|
+
speaker?: string;
|
|
20
|
+
alternatives?: Array<{
|
|
21
|
+
content: string;
|
|
22
|
+
confidence: number;
|
|
23
|
+
language?: string;
|
|
24
|
+
speaker?: string;
|
|
25
|
+
}>;
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/providers/speechmatics/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,uBAAuB;IACpC,GAAG,CAAC,EAAE;QACF,EAAE,EAAE,MAAM,CAAC;QACX,MAAM,EAAE,SAAS,GAAG,MAAM,GAAG,UAAU,CAAC;QACxC,QAAQ,CAAC,EAAE,MAAM,CAAC;KACrB,CAAC;CACL;AAED,MAAM,WAAW,sBAAsB;IACnC,OAAO,CAAC,EAAE,kBAAkB,EAAE,CAAC;IAC/B,GAAG,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CAC/B;AAED,MAAM,WAAW,kBAAkB;IAC/B,IAAI,EAAE,MAAM,GAAG,aAAa,GAAG,QAAQ,CAAC;IACxC,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,YAAY,CAAC,EAAE,KAAK,CAAC;QACjB,OAAO,EAAE,MAAM,CAAC;QAChB,UAAU,EAAE,MAAM,CAAC;QACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,OAAO,CAAC,EAAE,MAAM,CAAC;KACpB,CAAC,CAAC;CACN"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/providers/speechmatics/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { ClientConfig, SynthesizeParams, SynthesizeResult } from "./types.js";
|
|
2
|
+
import { VoiceCache } from "./voice-cache.js";
|
|
3
|
+
export declare function synthesize(config: ClientConfig, params: SynthesizeParams, voiceCache?: VoiceCache): Promise<SynthesizeResult>;
|
|
4
|
+
//# sourceMappingURL=synthesize.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"synthesize.d.ts","sourceRoot":"","sources":["../src/synthesize.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,gBAAgB,EAAE,gBAAgB,EAAa,MAAM,YAAY,CAAC;AAE9F,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAU9C,wBAAsB,UAAU,CAC5B,MAAM,EAAE,YAAY,EACpB,MAAM,EAAE,gBAAgB,EACxB,UAAU,CAAC,EAAE,UAAU,GACxB,OAAO,CAAC,gBAAgB,CAAC,CA2D3B"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import { SpeechServiceError } from "./errors.js";
|
|
2
|
+
import { VoiceCache } from "./voice-cache.js";
|
|
3
|
+
import { resolveVoice } from "./voice-resolver.js";
|
|
4
|
+
import * as azure from "./providers/azure/index.js";
|
|
5
|
+
import * as cartesia from "./providers/cartesia/index.js";
|
|
6
|
+
import * as deepgram from "./providers/deepgram/index.js";
|
|
7
|
+
import * as elevenlabs from "./providers/elevenlabs/index.js";
|
|
8
|
+
import * as google from "./providers/google/index.js";
|
|
9
|
+
import * as openai from "./providers/openai/index.js";
|
|
10
|
+
import * as playht from "./providers/playht/index.js";
|
|
11
|
+
export async function synthesize(config, params, voiceCache) {
|
|
12
|
+
const cache = voiceCache ?? new VoiceCache();
|
|
13
|
+
switch (params.provider) {
|
|
14
|
+
case "azure": {
|
|
15
|
+
const cfg = requireConfig(config, "azure", "Azure");
|
|
16
|
+
const resolvedVoice = await resolveVoiceForProvider(cache, () => azure.fetchVoices(cfg), `azure:${cfg.region}`, params);
|
|
17
|
+
return azure.synthesize(cfg, params.text, resolvedVoice, params.languages?.[0], params.providerOptions);
|
|
18
|
+
}
|
|
19
|
+
case "cartesia": {
|
|
20
|
+
const cfg = requireConfig(config, "cartesia", "Cartesia");
|
|
21
|
+
const resolvedVoice = await resolveVoiceForProvider(cache, () => cartesia.fetchVoices(cfg), "cartesia", params);
|
|
22
|
+
return cartesia.synthesize(cfg, params.text, resolvedVoice, params.languages?.[0], params.providerOptions);
|
|
23
|
+
}
|
|
24
|
+
case "deepgram": {
|
|
25
|
+
const cfg = requireConfig(config, "deepgram", "Deepgram");
|
|
26
|
+
const resolvedVoice = await resolveVoiceForProvider(cache, () => deepgram.fetchVoices(cfg), "deepgram", params);
|
|
27
|
+
return deepgram.synthesize(cfg, params.text, resolvedVoice, params.languages?.[0], params.providerOptions);
|
|
28
|
+
}
|
|
29
|
+
case "elevenlabs": {
|
|
30
|
+
const cfg = requireConfig(config, "elevenlabs", "ElevenLabs");
|
|
31
|
+
const resolvedVoice = await resolveVoiceForProvider(cache, () => elevenlabs.fetchVoices(cfg), "elevenlabs", params);
|
|
32
|
+
return elevenlabs.synthesize(cfg, params.text, resolvedVoice, params.languages?.[0], params.providerOptions);
|
|
33
|
+
}
|
|
34
|
+
case "google": {
|
|
35
|
+
const cfg = requireConfig(config, "google", "Google");
|
|
36
|
+
const resolvedVoice = await resolveVoiceForProvider(cache, () => google.fetchVoices(cfg), "google", params);
|
|
37
|
+
return google.synthesize(cfg, params.text, resolvedVoice, params.languages?.[0], params.providerOptions);
|
|
38
|
+
}
|
|
39
|
+
case "openai": {
|
|
40
|
+
const cfg = requireConfig(config, "openai", "OpenAI");
|
|
41
|
+
const resolvedVoice = await resolveVoiceForProvider(cache, () => openai.fetchVoices(cfg), "openai", params);
|
|
42
|
+
return openai.synthesize(cfg, params.text, resolvedVoice, params.languages?.[0], params.providerOptions);
|
|
43
|
+
}
|
|
44
|
+
case "playht": {
|
|
45
|
+
const cfg = requireConfig(config, "playht", "PlayHT");
|
|
46
|
+
const resolvedVoice = await resolveVoiceForProvider(cache, () => playht.fetchVoices(cfg), "playht", params);
|
|
47
|
+
return playht.synthesize(cfg, params.text, resolvedVoice, params.languages?.[0], params.providerOptions);
|
|
48
|
+
}
|
|
49
|
+
default:
|
|
50
|
+
throw new SpeechServiceError(`Unknown TTS provider: ${params.provider}`, "UNKNOWN_PROVIDER");
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
function requireConfig(config, provider, displayName) {
|
|
54
|
+
const providerConfig = config[provider];
|
|
55
|
+
if (!providerConfig) {
|
|
56
|
+
throw new SpeechServiceError(`${displayName} is not configured. Add "${provider}" to your config.`, "NOT_CONFIGURED", provider);
|
|
57
|
+
}
|
|
58
|
+
return providerConfig;
|
|
59
|
+
}
|
|
60
|
+
async function resolveVoiceForProvider(cache, fetchFn, cacheKey, params) {
|
|
61
|
+
let voices = cache.get(cacheKey);
|
|
62
|
+
if (!voices) {
|
|
63
|
+
voices = await fetchFn();
|
|
64
|
+
cache.set(cacheKey, voices);
|
|
65
|
+
}
|
|
66
|
+
const resolved = resolveVoice(voices, {
|
|
67
|
+
voice: params.voice,
|
|
68
|
+
language: params.languages?.[0],
|
|
69
|
+
gender: params.gender,
|
|
70
|
+
});
|
|
71
|
+
return resolved.id;
|
|
72
|
+
}
|
|
73
|
+
//# sourceMappingURL=synthesize.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"synthesize.js","sourceRoot":"","sources":["../src/synthesize.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transcribe.d.ts","sourceRoot":"","sources":["../src/transcribe.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAWnF,wBAAsB,UAAU,CAAC,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAwC1G"}
|