@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":"fetch-voices.d.ts","sourceRoot":"","sources":["../../../src/providers/google/fetch-voices.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAK9D,wBAAsB,WAAW,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC,CAmC5E"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { SpeechServiceError } from "../../errors.js";
|
|
2
|
+
import { TTS_BASE_URL } from "./types.js";
|
|
3
|
+
export async function fetchVoices(config) {
|
|
4
|
+
const response = await fetch(`${TTS_BASE_URL}/voices?key=${config.apiKey}`);
|
|
5
|
+
if (!response.ok) {
|
|
6
|
+
const errorText = await response.text();
|
|
7
|
+
throw new SpeechServiceError(`Google voice listing failed: ${errorText}`, "API_ERROR", "google", response.status);
|
|
8
|
+
}
|
|
9
|
+
const result = (await response.json());
|
|
10
|
+
// Google voices can have multiple languageCodes — create one entry per locale
|
|
11
|
+
const voices = [];
|
|
12
|
+
for (const v of result.voices ?? []) {
|
|
13
|
+
const gender = v.ssmlGender?.toLowerCase() === "male" ? "male"
|
|
14
|
+
: v.ssmlGender?.toLowerCase() === "female" ? "female"
|
|
15
|
+
: undefined;
|
|
16
|
+
for (const locale of v.languageCodes ?? []) {
|
|
17
|
+
voices.push({
|
|
18
|
+
id: v.name,
|
|
19
|
+
name: v.name,
|
|
20
|
+
gender,
|
|
21
|
+
locale,
|
|
22
|
+
provider: "google",
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
return voices;
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=fetch-voices.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fetch-voices.js","sourceRoot":"","sources":["../../../src/providers/google/fetch-voices.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAG1C,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,MAAoB;IAClD,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,YAAY,eAAe,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;IAE5E,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACf,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;QACxC,MAAM,IAAI,kBAAkB,CACxB,gCAAgC,SAAS,EAAE,EAC3C,WAAW,EACX,QAAQ,EACR,QAAQ,CAAC,MAAM,CAClB,CAAC;IACN,CAAC;IAED,MAAM,MAAM,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAmC,CAAC;IAEzE,8EAA8E;IAC9E,MAAM,MAAM,GAAgB,EAAE,CAAC;IAE/B,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,MAAM,IAAI,EAAE,EAAE,CAAC;QAClC,MAAM,MAAM,GAAG,CAAC,CAAC,UAAU,EAAE,WAAW,EAAE,KAAK,MAAM,CAAC,CAAC,CAAC,MAAe;YACnE,CAAC,CAAC,CAAC,CAAC,UAAU,EAAE,WAAW,EAAE,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAiB;gBAC9D,CAAC,CAAC,SAAS,CAAC;QAEhB,KAAK,MAAM,MAAM,IAAI,CAAC,CAAC,aAAa,IAAI,EAAE,EAAE,CAAC;YACzC,MAAM,CAAC,IAAI,CAAC;gBACR,EAAE,EAAE,CAAC,CAAC,IAAI;gBACV,IAAI,EAAE,CAAC,CAAC,IAAI;gBACZ,MAAM;gBACN,MAAM;gBACN,QAAQ,EAAE,QAAiB;aAC9B,CAAC,CAAC;QACP,CAAC;IACL,CAAC;IAED,OAAO,MAAM,CAAC;AAClB,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Parses Google Cloud duration values which can be either:
|
|
3
|
+
* - A string like "1.5s"
|
|
4
|
+
* - An object like { seconds: "1", nanos: 500000000 }
|
|
5
|
+
*/
|
|
6
|
+
export declare function parseGoogleDuration(duration: string | {
|
|
7
|
+
seconds?: string | number;
|
|
8
|
+
nanos?: number;
|
|
9
|
+
} | undefined): number;
|
|
10
|
+
//# sourceMappingURL=helpers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../../src/providers/google/helpers.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,wBAAgB,mBAAmB,CAC/B,QAAQ,EAAE,MAAM,GAAG;IAAE,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,SAAS,GAC7E,MAAM,CAQR"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Parses Google Cloud duration values which can be either:
|
|
3
|
+
* - A string like "1.5s"
|
|
4
|
+
* - An object like { seconds: "1", nanos: 500000000 }
|
|
5
|
+
*/
|
|
6
|
+
export function parseGoogleDuration(duration) {
|
|
7
|
+
if (typeof duration === "string") {
|
|
8
|
+
return parseFloat(duration.replace("s", "")) || 0;
|
|
9
|
+
}
|
|
10
|
+
if (typeof duration === "object" && duration !== null) {
|
|
11
|
+
return Number(duration.seconds ?? 0) + Number(duration.nanos ?? 0) / 1_000_000_000;
|
|
12
|
+
}
|
|
13
|
+
return 0;
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=helpers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"helpers.js","sourceRoot":"","sources":["../../../src/providers/google/helpers.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,MAAM,UAAU,mBAAmB,CAC/B,QAA4E;IAE5E,IAAI,OAAO,QAAQ,KAAK,QAAQ,EAAE,CAAC;QAC/B,OAAO,UAAU,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;IACtD,CAAC;IACD,IAAI,OAAO,QAAQ,KAAK,QAAQ,IAAI,QAAQ,KAAK,IAAI,EAAE,CAAC;QACpD,OAAO,MAAM,CAAC,QAAQ,CAAC,OAAO,IAAI,CAAC,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAC,KAAK,IAAI,CAAC,CAAC,GAAG,aAAa,CAAC;IACvF,CAAC;IACD,OAAO,CAAC,CAAC;AACb,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/providers/google/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/providers/google/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import type { GoogleConfig, GoogleSynthesizeOptions, SynthesizeResult } from "../../types.js";
|
|
2
|
+
export declare function synthesize(config: GoogleConfig, text: string, voice: string, language: string | undefined, options?: GoogleSynthesizeOptions): Promise<SynthesizeResult>;
|
|
3
|
+
//# sourceMappingURL=synthesize.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"synthesize.d.ts","sourceRoot":"","sources":["../../../src/providers/google/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,CAwC3B"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { SpeechServiceError } from "../../errors.js";
|
|
2
|
+
import { detectFormatFromString } from "../../utils.js";
|
|
3
|
+
import { TTS_BASE_URL } from "./types.js";
|
|
4
|
+
export async function synthesize(config, text, voice, language, options = {}) {
|
|
5
|
+
const { audioEncoding = "MP3", speakingRate, pitch } = options;
|
|
6
|
+
// Infer language from voice name if not provided (e.g., "en-US-Neural2-A" → "en-US")
|
|
7
|
+
const lang = language ?? voice.split("-").slice(0, 2).join("-");
|
|
8
|
+
const audioConfig = { audioEncoding };
|
|
9
|
+
if (speakingRate !== undefined)
|
|
10
|
+
audioConfig.speakingRate = speakingRate;
|
|
11
|
+
if (pitch !== undefined)
|
|
12
|
+
audioConfig.pitch = pitch;
|
|
13
|
+
const body = {
|
|
14
|
+
input: { text },
|
|
15
|
+
voice: { languageCode: lang, name: voice },
|
|
16
|
+
audioConfig,
|
|
17
|
+
};
|
|
18
|
+
const response = await fetch(`${TTS_BASE_URL}/text:synthesize?key=${config.apiKey}`, {
|
|
19
|
+
method: "POST",
|
|
20
|
+
headers: { "Content-Type": "application/json" },
|
|
21
|
+
body: JSON.stringify(body),
|
|
22
|
+
});
|
|
23
|
+
if (!response.ok) {
|
|
24
|
+
const errorText = await response.text();
|
|
25
|
+
throw new SpeechServiceError(`Google TTS failed: ${errorText}`, "API_ERROR", "google", response.status);
|
|
26
|
+
}
|
|
27
|
+
const result = (await response.json());
|
|
28
|
+
const audioBuffer = Buffer.from(result.audioContent, "base64");
|
|
29
|
+
return {
|
|
30
|
+
audio: audioBuffer,
|
|
31
|
+
format: detectFormatFromString(audioEncoding),
|
|
32
|
+
voice,
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=synthesize.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"synthesize.js","sourceRoot":"","sources":["../../../src/providers/google/synthesize.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AACrD,OAAO,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AACxD,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE1C,MAAM,CAAC,KAAK,UAAU,UAAU,CAC5B,MAAoB,EACpB,IAAY,EACZ,KAAa,EACb,QAA4B,EAC5B,UAAmC,EAAE;IAErC,MAAM,EAAE,aAAa,GAAG,KAAK,EAAE,YAAY,EAAE,KAAK,EAAE,GAAG,OAAO,CAAC;IAE/D,qFAAqF;IACrF,MAAM,IAAI,GAAG,QAAQ,IAAI,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAEhE,MAAM,WAAW,GAA4B,EAAE,aAAa,EAAE,CAAC;IAC/D,IAAI,YAAY,KAAK,SAAS;QAAE,WAAW,CAAC,YAAY,GAAG,YAAY,CAAC;IACxE,IAAI,KAAK,KAAK,SAAS;QAAE,WAAW,CAAC,KAAK,GAAG,KAAK,CAAC;IAEnD,MAAM,IAAI,GAAG;QACT,KAAK,EAAE,EAAE,IAAI,EAAE;QACf,KAAK,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE;QAC1C,WAAW;KACd,CAAC;IAEF,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,YAAY,wBAAwB,MAAM,CAAC,MAAM,EAAE,EAAE;QACjF,MAAM,EAAE,MAAM;QACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;QAC/C,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,MAAM,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAA6B,CAAC;IACnE,MAAM,WAAW,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAC;IAE/D,OAAO;QACH,KAAK,EAAE,WAAW;QAClB,MAAM,EAAE,sBAAsB,CAAC,aAAa,CAAC;QAC7C,KAAK;KACR,CAAC;AACN,CAAC"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import type { GoogleConfig, GoogleTranscribeOptions, TranscribeResult } from "../../types.js";
|
|
2
|
+
export declare function transcribe(config: GoogleConfig, audio: Buffer | string, languages: string[] | undefined, options?: GoogleTranscribeOptions): Promise<TranscribeResult>;
|
|
3
|
+
//# sourceMappingURL=transcribe.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transcribe.d.ts","sourceRoot":"","sources":["../../../src/providers/google/transcribe.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACR,YAAY,EACZ,uBAAuB,EACvB,gBAAgB,EAEnB,MAAM,gBAAgB,CAAC;AAOxB,wBAAsB,UAAU,CAC5B,MAAM,EAAE,YAAY,EACpB,KAAK,EAAE,MAAM,GAAG,MAAM,EACtB,SAAS,EAAE,MAAM,EAAE,GAAG,SAAS,EAC/B,OAAO,GAAE,uBAA4B,GACtC,OAAO,CAAC,gBAAgB,CAAC,CA8D3B"}
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
import { SpeechServiceError } from "../../errors.js";
|
|
2
|
+
import { isUrl, downloadAudio, poll } from "../../utils.js";
|
|
3
|
+
import { STT_BASE_URL } from "./types.js";
|
|
4
|
+
import { parseGoogleDuration } from "./helpers.js";
|
|
5
|
+
export async function transcribe(config, audio, languages, options = {}) {
|
|
6
|
+
const { model = "latest_long", encoding, sampleRateHertz } = options;
|
|
7
|
+
const primaryLanguage = languages?.[0] ?? "en-US";
|
|
8
|
+
const altLanguages = languages?.slice(1, 4) ?? [];
|
|
9
|
+
const recognitionConfig = {
|
|
10
|
+
languageCode: primaryLanguage,
|
|
11
|
+
model,
|
|
12
|
+
enableWordTimeOffsets: true,
|
|
13
|
+
enableWordConfidence: true,
|
|
14
|
+
enableAutomaticPunctuation: true,
|
|
15
|
+
};
|
|
16
|
+
if (altLanguages.length > 0) {
|
|
17
|
+
recognitionConfig.alternativeLanguageCodes = altLanguages;
|
|
18
|
+
}
|
|
19
|
+
if (encoding)
|
|
20
|
+
recognitionConfig.encoding = encoding;
|
|
21
|
+
if (sampleRateHertz)
|
|
22
|
+
recognitionConfig.sampleRateHertz = sampleRateHertz;
|
|
23
|
+
// Determine if we should use async mode (GCS URIs)
|
|
24
|
+
if (typeof audio === "string" && audio.startsWith("gs://")) {
|
|
25
|
+
return transcribeAsync(config, audio, recognitionConfig);
|
|
26
|
+
}
|
|
27
|
+
// Sync mode: Buffer or HTTP URL
|
|
28
|
+
let audioBuffer;
|
|
29
|
+
if (Buffer.isBuffer(audio)) {
|
|
30
|
+
audioBuffer = audio;
|
|
31
|
+
}
|
|
32
|
+
else if (typeof audio === "string" && isUrl(audio)) {
|
|
33
|
+
audioBuffer = await downloadAudio(audio);
|
|
34
|
+
}
|
|
35
|
+
else {
|
|
36
|
+
throw new SpeechServiceError("audio must be a Buffer, HTTP URL, or gs:// URI", "INVALID_INPUT", "google");
|
|
37
|
+
}
|
|
38
|
+
const body = {
|
|
39
|
+
config: recognitionConfig,
|
|
40
|
+
audio: { content: audioBuffer.toString("base64") },
|
|
41
|
+
};
|
|
42
|
+
const response = await fetch(`${STT_BASE_URL}/speech:recognize?key=${config.apiKey}`, {
|
|
43
|
+
method: "POST",
|
|
44
|
+
headers: { "Content-Type": "application/json" },
|
|
45
|
+
body: JSON.stringify(body),
|
|
46
|
+
});
|
|
47
|
+
if (!response.ok) {
|
|
48
|
+
const errorText = await response.text();
|
|
49
|
+
throw new SpeechServiceError(`Google STT failed: ${errorText}`, "API_ERROR", "google", response.status);
|
|
50
|
+
}
|
|
51
|
+
const result = (await response.json());
|
|
52
|
+
return normalizeResponse(result, primaryLanguage);
|
|
53
|
+
}
|
|
54
|
+
async function transcribeAsync(config, gcsUri, recognitionConfig) {
|
|
55
|
+
const body = {
|
|
56
|
+
config: recognitionConfig,
|
|
57
|
+
audio: { uri: gcsUri },
|
|
58
|
+
};
|
|
59
|
+
const response = await fetch(`${STT_BASE_URL}/speech:longrunningrecognize?key=${config.apiKey}`, {
|
|
60
|
+
method: "POST",
|
|
61
|
+
headers: { "Content-Type": "application/json" },
|
|
62
|
+
body: JSON.stringify(body),
|
|
63
|
+
});
|
|
64
|
+
if (!response.ok) {
|
|
65
|
+
const errorText = await response.text();
|
|
66
|
+
throw new SpeechServiceError(`Google async STT failed: ${errorText}`, "API_ERROR", "google", response.status);
|
|
67
|
+
}
|
|
68
|
+
const operation = (await response.json());
|
|
69
|
+
const finalOp = await poll(async () => {
|
|
70
|
+
const res = await fetch(`${STT_BASE_URL}/operations/${operation.name}?key=${config.apiKey}`);
|
|
71
|
+
if (!res.ok) {
|
|
72
|
+
throw new SpeechServiceError(`Google STT polling failed: ${res.status}`, "API_ERROR", "google", res.status);
|
|
73
|
+
}
|
|
74
|
+
return res.json();
|
|
75
|
+
}, (op) => op.done === true, 5000, 300_000, "google");
|
|
76
|
+
if (finalOp.error) {
|
|
77
|
+
throw new SpeechServiceError(`Google STT failed: ${finalOp.error.message}`, "TRANSCRIPTION_FAILED", "google");
|
|
78
|
+
}
|
|
79
|
+
const primaryLanguage = recognitionConfig.languageCode ?? "en-US";
|
|
80
|
+
return normalizeResponse(finalOp.response ?? {}, primaryLanguage);
|
|
81
|
+
}
|
|
82
|
+
function normalizeResponse(result, primaryLanguage) {
|
|
83
|
+
const words = [];
|
|
84
|
+
const textParts = [];
|
|
85
|
+
let detectedLanguage = primaryLanguage;
|
|
86
|
+
let lastEndTime = 0;
|
|
87
|
+
for (const sttResult of result.results ?? []) {
|
|
88
|
+
if (sttResult.languageCode) {
|
|
89
|
+
detectedLanguage = sttResult.languageCode;
|
|
90
|
+
}
|
|
91
|
+
const alt = sttResult.alternatives?.[0];
|
|
92
|
+
if (!alt)
|
|
93
|
+
continue;
|
|
94
|
+
if (alt.transcript)
|
|
95
|
+
textParts.push(alt.transcript);
|
|
96
|
+
for (const w of alt.words ?? []) {
|
|
97
|
+
const startTime = parseGoogleDuration(w.startTime ?? w.startOffset);
|
|
98
|
+
const endTime = parseGoogleDuration(w.endTime ?? w.endOffset);
|
|
99
|
+
words.push({
|
|
100
|
+
text: w.word,
|
|
101
|
+
startTime,
|
|
102
|
+
endTime,
|
|
103
|
+
confidence: w.confidence,
|
|
104
|
+
speaker: w.speakerLabel ?? (w.speakerTag ? String(w.speakerTag) : undefined),
|
|
105
|
+
});
|
|
106
|
+
if (endTime > lastEndTime)
|
|
107
|
+
lastEndTime = endTime;
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
return {
|
|
111
|
+
text: textParts.join(" "),
|
|
112
|
+
words,
|
|
113
|
+
language: detectedLanguage,
|
|
114
|
+
duration: lastEndTime,
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
//# sourceMappingURL=transcribe.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transcribe.js","sourceRoot":"","sources":["../../../src/providers/google/transcribe.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AACrD,OAAO,EAAE,KAAK,EAAE,aAAa,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AAC5D,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE1C,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AAEnD,MAAM,CAAC,KAAK,UAAU,UAAU,CAC5B,MAAoB,EACpB,KAAsB,EACtB,SAA+B,EAC/B,UAAmC,EAAE;IAErC,MAAM,EAAE,KAAK,GAAG,aAAa,EAAE,QAAQ,EAAE,eAAe,EAAE,GAAG,OAAO,CAAC;IAErE,MAAM,eAAe,GAAG,SAAS,EAAE,CAAC,CAAC,CAAC,IAAI,OAAO,CAAC;IAClD,MAAM,YAAY,GAAG,SAAS,EAAE,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IAElD,MAAM,iBAAiB,GAA4B;QAC/C,YAAY,EAAE,eAAe;QAC7B,KAAK;QACL,qBAAqB,EAAE,IAAI;QAC3B,oBAAoB,EAAE,IAAI;QAC1B,0BAA0B,EAAE,IAAI;KACnC,CAAC;IAEF,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC1B,iBAAiB,CAAC,wBAAwB,GAAG,YAAY,CAAC;IAC9D,CAAC;IACD,IAAI,QAAQ;QAAE,iBAAiB,CAAC,QAAQ,GAAG,QAAQ,CAAC;IACpD,IAAI,eAAe;QAAE,iBAAiB,CAAC,eAAe,GAAG,eAAe,CAAC;IAEzE,mDAAmD;IACnD,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QACzD,OAAO,eAAe,CAAC,MAAM,EAAE,KAAK,EAAE,iBAAiB,CAAC,CAAC;IAC7D,CAAC;IAED,gCAAgC;IAChC,IAAI,WAAmB,CAAC;IACxB,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QACzB,WAAW,GAAG,KAAK,CAAC;IACxB,CAAC;SAAM,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC;QACnD,WAAW,GAAG,MAAM,aAAa,CAAC,KAAK,CAAC,CAAC;IAC7C,CAAC;SAAM,CAAC;QACJ,MAAM,IAAI,kBAAkB,CACxB,gDAAgD,EAChD,eAAe,EACf,QAAQ,CACX,CAAC;IACN,CAAC;IAED,MAAM,IAAI,GAAG;QACT,MAAM,EAAE,iBAAiB;QACzB,KAAK,EAAE,EAAE,OAAO,EAAE,WAAW,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE;KACrD,CAAC;IAEF,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,YAAY,yBAAyB,MAAM,CAAC,MAAM,EAAE,EAAE;QAClF,MAAM,EAAE,MAAM;QACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;QAC/C,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,MAAM,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAA4B,CAAC;IAClE,OAAO,iBAAiB,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;AACtD,CAAC;AAED,KAAK,UAAU,eAAe,CAC1B,MAAoB,EACpB,MAAc,EACd,iBAA0C;IAE1C,MAAM,IAAI,GAAG;QACT,MAAM,EAAE,iBAAiB;QACzB,KAAK,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE;KACzB,CAAC;IAEF,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,YAAY,oCAAoC,MAAM,CAAC,MAAM,EAAE,EAAE;QAC7F,MAAM,EAAE,MAAM;QACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;QAC/C,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,4BAA4B,SAAS,EAAE,EACvC,WAAW,EACX,QAAQ,EACR,QAAQ,CAAC,MAAM,CAClB,CAAC;IACN,CAAC;IAED,MAAM,SAAS,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAA+B,CAAC;IAExE,MAAM,OAAO,GAAG,MAAM,IAAI,CACtB,KAAK,IAAI,EAAE;QACP,MAAM,GAAG,GAAG,MAAM,KAAK,CACnB,GAAG,YAAY,eAAe,SAAS,CAAC,IAAI,QAAQ,MAAM,CAAC,MAAM,EAAE,CACtE,CAAC;QACF,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;YACV,MAAM,IAAI,kBAAkB,CACxB,8BAA8B,GAAG,CAAC,MAAM,EAAE,EAC1C,WAAW,EACX,QAAQ,EACR,GAAG,CAAC,MAAM,CACb,CAAC;QACN,CAAC;QACD,OAAO,GAAG,CAAC,IAAI,EAAyC,CAAC;IAC7D,CAAC,EACD,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,IAAI,KAAK,IAAI,EACxB,IAAI,EACJ,OAAO,EACP,QAAQ,CACX,CAAC;IAEF,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;QAChB,MAAM,IAAI,kBAAkB,CACxB,sBAAsB,OAAO,CAAC,KAAK,CAAC,OAAO,EAAE,EAC7C,sBAAsB,EACtB,QAAQ,CACX,CAAC;IACN,CAAC;IAED,MAAM,eAAe,GAAI,iBAAiB,CAAC,YAAuB,IAAI,OAAO,CAAC;IAC9E,OAAO,iBAAiB,CAAC,OAAO,CAAC,QAAQ,IAAI,EAAE,EAAE,eAAe,CAAC,CAAC;AACtE,CAAC;AAED,SAAS,iBAAiB,CACtB,MAA+B,EAC/B,eAAuB;IAEvB,MAAM,KAAK,GAAsB,EAAE,CAAC;IACpC,MAAM,SAAS,GAAa,EAAE,CAAC;IAC/B,IAAI,gBAAgB,GAAG,eAAe,CAAC;IACvC,IAAI,WAAW,GAAG,CAAC,CAAC;IAEpB,KAAK,MAAM,SAAS,IAAI,MAAM,CAAC,OAAO,IAAI,EAAE,EAAE,CAAC;QAC3C,IAAI,SAAS,CAAC,YAAY,EAAE,CAAC;YACzB,gBAAgB,GAAG,SAAS,CAAC,YAAY,CAAC;QAC9C,CAAC;QACD,MAAM,GAAG,GAAG,SAAS,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,CAAC;QACxC,IAAI,CAAC,GAAG;YAAE,SAAS;QAEnB,IAAI,GAAG,CAAC,UAAU;YAAE,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QAEnD,KAAK,MAAM,CAAC,IAAI,GAAG,CAAC,KAAK,IAAI,EAAE,EAAE,CAAC;YAC9B,MAAM,SAAS,GAAG,mBAAmB,CAAC,CAAC,CAAC,SAAS,IAAI,CAAC,CAAC,WAAW,CAAC,CAAC;YACpE,MAAM,OAAO,GAAG,mBAAmB,CAAC,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,SAAS,CAAC,CAAC;YAC9D,KAAK,CAAC,IAAI,CAAC;gBACP,IAAI,EAAE,CAAC,CAAC,IAAI;gBACZ,SAAS;gBACT,OAAO;gBACP,UAAU,EAAE,CAAC,CAAC,UAAU;gBACxB,OAAO,EAAE,CAAC,CAAC,YAAY,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;aAC/E,CAAC,CAAC;YACH,IAAI,OAAO,GAAG,WAAW;gBAAE,WAAW,GAAG,OAAO,CAAC;QACrD,CAAC;IACL,CAAC;IAED,OAAO;QACH,IAAI,EAAE,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC;QACzB,KAAK;QACL,QAAQ,EAAE,gBAAgB;QAC1B,QAAQ,EAAE,WAAW;KACxB,CAAC;AACN,CAAC"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
export declare const STT_BASE_URL = "https://speech.googleapis.com/v1";
|
|
2
|
+
export declare const TTS_BASE_URL = "https://texttospeech.googleapis.com/v1";
|
|
3
|
+
export interface GoogleRecognizeResponse {
|
|
4
|
+
results?: GoogleSttResult[];
|
|
5
|
+
totalBilledTime?: string;
|
|
6
|
+
}
|
|
7
|
+
export interface GoogleSttResult {
|
|
8
|
+
alternatives?: GoogleSttAlternative[];
|
|
9
|
+
channelTag?: number;
|
|
10
|
+
resultEndTime?: string;
|
|
11
|
+
languageCode?: string;
|
|
12
|
+
}
|
|
13
|
+
export interface GoogleSttAlternative {
|
|
14
|
+
transcript?: string;
|
|
15
|
+
confidence?: number;
|
|
16
|
+
words?: GoogleWordInfo[];
|
|
17
|
+
}
|
|
18
|
+
export interface GoogleWordInfo {
|
|
19
|
+
word: string;
|
|
20
|
+
startTime?: string;
|
|
21
|
+
endTime?: string;
|
|
22
|
+
startOffset?: string;
|
|
23
|
+
endOffset?: string;
|
|
24
|
+
confidence?: number;
|
|
25
|
+
speakerLabel?: string;
|
|
26
|
+
speakerTag?: number;
|
|
27
|
+
}
|
|
28
|
+
export interface GoogleVoiceEntry {
|
|
29
|
+
name: string;
|
|
30
|
+
languageCodes?: string[];
|
|
31
|
+
ssmlGender?: string;
|
|
32
|
+
naturalSampleRateHertz?: number;
|
|
33
|
+
}
|
|
34
|
+
export interface GoogleLongRunningOperation {
|
|
35
|
+
name: string;
|
|
36
|
+
done?: boolean;
|
|
37
|
+
error?: {
|
|
38
|
+
code: number;
|
|
39
|
+
message: string;
|
|
40
|
+
};
|
|
41
|
+
response?: GoogleRecognizeResponse;
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/providers/google/types.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,YAAY,qCAAqC,CAAC;AAC/D,eAAO,MAAM,YAAY,2CAA2C,CAAC;AAErE,MAAM,WAAW,uBAAuB;IACpC,OAAO,CAAC,EAAE,eAAe,EAAE,CAAC;IAC5B,eAAe,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED,MAAM,WAAW,eAAe;IAC5B,YAAY,CAAC,EAAE,oBAAoB,EAAE,CAAC;IACtC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,YAAY,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,oBAAoB;IACjC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,cAAc,EAAE,CAAC;CAC5B;AAED,MAAM,WAAW,cAAc;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,gBAAgB;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,sBAAsB,CAAC,EAAE,MAAM,CAAC;CACnC;AAED,MAAM,WAAW,0BAA0B;IACvC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,KAAK,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;IAC1C,QAAQ,CAAC,EAAE,uBAAuB,CAAC;CACtC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/providers/google/types.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,YAAY,GAAG,kCAAkC,CAAC;AAC/D,MAAM,CAAC,MAAM,YAAY,GAAG,wCAAwC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fetch-voices.d.ts","sourceRoot":"","sources":["../../../src/providers/openai/fetch-voices.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAa9D,wBAAsB,WAAW,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC,CAE7E"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
// OpenAI has no voice listing API — voices are hardcoded
|
|
2
|
+
const OPENAI_VOICES = [
|
|
3
|
+
"alloy", "ash", "ballad", "coral", "echo", "fable",
|
|
4
|
+
"marin", "nova", "onyx", "sage", "shimmer", "verse", "cedar",
|
|
5
|
+
].map((name) => ({
|
|
6
|
+
id: name,
|
|
7
|
+
name,
|
|
8
|
+
locale: "en",
|
|
9
|
+
provider: "openai",
|
|
10
|
+
}));
|
|
11
|
+
export async function fetchVoices(_config) {
|
|
12
|
+
return OPENAI_VOICES;
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=fetch-voices.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fetch-voices.js","sourceRoot":"","sources":["../../../src/providers/openai/fetch-voices.ts"],"names":[],"mappings":"AAEA,yDAAyD;AACzD,MAAM,aAAa,GAAgB;IAC/B,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO;IAClD,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,OAAO;CAC/D,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IACb,EAAE,EAAE,IAAI;IACR,IAAI;IACJ,MAAM,EAAE,IAAI;IACZ,QAAQ,EAAE,QAAiB;CAC9B,CAAC,CAAC,CAAC;AAEJ,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,OAAqB;IACnD,OAAO,aAAa,CAAC;AACzB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/providers/openai/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/providers/openai/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import type { OpenAIConfig, OpenAISynthesizeOptions, SynthesizeResult } from "../../types.js";
|
|
2
|
+
export declare function synthesize(config: OpenAIConfig, text: string, voice: string, _language: string | undefined, options?: OpenAISynthesizeOptions): Promise<SynthesizeResult>;
|
|
3
|
+
//# sourceMappingURL=synthesize.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"synthesize.d.ts","sourceRoot":"","sources":["../../../src/providers/openai/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,SAAS,EAAE,MAAM,GAAG,SAAS,EAC7B,OAAO,GAAE,uBAA4B,GACtC,OAAO,CAAC,gBAAgB,CAAC,CA+C3B"}
|
|
@@ -0,0 +1,37 @@
|
|
|
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 { model = "tts-1", responseFormat = "mp3", speed, instructions, } = options;
|
|
6
|
+
const body = {
|
|
7
|
+
model,
|
|
8
|
+
input: text,
|
|
9
|
+
voice,
|
|
10
|
+
response_format: responseFormat,
|
|
11
|
+
};
|
|
12
|
+
if (speed !== undefined)
|
|
13
|
+
body.speed = speed;
|
|
14
|
+
// instructions only works with gpt-4o-mini-tts
|
|
15
|
+
if (instructions && model.includes("gpt-4o-mini-tts")) {
|
|
16
|
+
body.instructions = instructions;
|
|
17
|
+
}
|
|
18
|
+
const response = await fetch(`${BASE_URL}/audio/speech`, {
|
|
19
|
+
method: "POST",
|
|
20
|
+
headers: {
|
|
21
|
+
Authorization: `Bearer ${config.apiKey}`,
|
|
22
|
+
"Content-Type": "application/json",
|
|
23
|
+
},
|
|
24
|
+
body: JSON.stringify(body),
|
|
25
|
+
});
|
|
26
|
+
if (!response.ok) {
|
|
27
|
+
const errorText = await response.text();
|
|
28
|
+
throw new SpeechServiceError(`OpenAI TTS failed: ${errorText}`, "API_ERROR", "openai", response.status);
|
|
29
|
+
}
|
|
30
|
+
const arrayBuffer = await response.arrayBuffer();
|
|
31
|
+
return {
|
|
32
|
+
audio: Buffer.from(arrayBuffer),
|
|
33
|
+
format: detectFormatFromString(responseFormat),
|
|
34
|
+
voice,
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=synthesize.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"synthesize.js","sourceRoot":"","sources":["../../../src/providers/openai/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,SAA6B,EAC7B,UAAmC,EAAE;IAErC,MAAM,EACF,KAAK,GAAG,OAAO,EACf,cAAc,GAAG,KAAK,EACtB,KAAK,EACL,YAAY,GACf,GAAG,OAAO,CAAC;IAEZ,MAAM,IAAI,GAA4B;QAClC,KAAK;QACL,KAAK,EAAE,IAAI;QACX,KAAK;QACL,eAAe,EAAE,cAAc;KAClC,CAAC;IAEF,IAAI,KAAK,KAAK,SAAS;QAAE,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IAC5C,+CAA+C;IAC/C,IAAI,YAAY,IAAI,KAAK,CAAC,QAAQ,CAAC,iBAAiB,CAAC,EAAE,CAAC;QACpD,IAAI,CAAC,YAAY,GAAG,YAAY,CAAC;IACrC,CAAC;IAED,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,QAAQ,eAAe,EAAE;QACrD,MAAM,EAAE,MAAM;QACd,OAAO,EAAE;YACL,aAAa,EAAE,UAAU,MAAM,CAAC,MAAM,EAAE;YACxC,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,cAAc,CAAC;QAC9C,KAAK;KACR,CAAC;AACN,CAAC"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import type { OpenAIConfig, OpenAITranscribeOptions, TranscribeResult } from "../../types.js";
|
|
2
|
+
export declare function transcribe(config: OpenAIConfig, audio: Buffer | string, languages: string[] | undefined, options?: OpenAITranscribeOptions): Promise<TranscribeResult>;
|
|
3
|
+
//# sourceMappingURL=transcribe.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transcribe.d.ts","sourceRoot":"","sources":["../../../src/providers/openai/transcribe.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACR,YAAY,EACZ,uBAAuB,EACvB,gBAAgB,EAEnB,MAAM,gBAAgB,CAAC;AAKxB,wBAAsB,UAAU,CAC5B,MAAM,EAAE,YAAY,EACpB,KAAK,EAAE,MAAM,GAAG,MAAM,EACtB,SAAS,EAAE,MAAM,EAAE,GAAG,SAAS,EAC/B,OAAO,GAAE,uBAA4B,GACtC,OAAO,CAAC,gBAAgB,CAAC,CAwE3B"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { SpeechServiceError } from "../../errors.js";
|
|
2
|
+
import { BASE_URL } from "./types.js";
|
|
3
|
+
export async function transcribe(config, audio, languages, options = {}) {
|
|
4
|
+
const { model = "whisper-1", prompt, temperature } = options;
|
|
5
|
+
// OpenAI STT requires a file upload via multipart/form-data
|
|
6
|
+
let audioBuffer;
|
|
7
|
+
if (Buffer.isBuffer(audio)) {
|
|
8
|
+
audioBuffer = audio;
|
|
9
|
+
}
|
|
10
|
+
else if (typeof audio === "string") {
|
|
11
|
+
// Download the URL first — OpenAI only accepts file uploads
|
|
12
|
+
const res = await fetch(audio);
|
|
13
|
+
if (!res.ok) {
|
|
14
|
+
throw new SpeechServiceError(`Failed to download audio from ${audio}: ${res.status}`, "DOWNLOAD_FAILED", "openai");
|
|
15
|
+
}
|
|
16
|
+
audioBuffer = Buffer.from(await res.arrayBuffer());
|
|
17
|
+
}
|
|
18
|
+
else {
|
|
19
|
+
throw new SpeechServiceError("audio must be a Buffer or a URL string", "INVALID_INPUT", "openai");
|
|
20
|
+
}
|
|
21
|
+
const formData = new FormData();
|
|
22
|
+
formData.append("file", new Blob([new Uint8Array(audioBuffer)]), "audio.mp3");
|
|
23
|
+
formData.append("model", model);
|
|
24
|
+
formData.append("response_format", "verbose_json");
|
|
25
|
+
// Word-level timestamps only available with whisper-1
|
|
26
|
+
if (model === "whisper-1") {
|
|
27
|
+
formData.append("timestamp_granularities[]", "word");
|
|
28
|
+
}
|
|
29
|
+
if (languages?.[0]) {
|
|
30
|
+
formData.append("language", languages[0].split("-")[0].toLowerCase());
|
|
31
|
+
}
|
|
32
|
+
if (prompt)
|
|
33
|
+
formData.append("prompt", prompt);
|
|
34
|
+
if (temperature !== undefined)
|
|
35
|
+
formData.append("temperature", String(temperature));
|
|
36
|
+
const response = await fetch(`${BASE_URL}/audio/transcriptions`, {
|
|
37
|
+
method: "POST",
|
|
38
|
+
headers: { Authorization: `Bearer ${config.apiKey}` },
|
|
39
|
+
body: formData,
|
|
40
|
+
});
|
|
41
|
+
if (!response.ok) {
|
|
42
|
+
const errorText = await response.text();
|
|
43
|
+
throw new SpeechServiceError(`OpenAI transcription failed: ${errorText}`, "API_ERROR", "openai", response.status);
|
|
44
|
+
}
|
|
45
|
+
const result = (await response.json());
|
|
46
|
+
const words = (result.words ?? []).map((w) => ({
|
|
47
|
+
text: w.word,
|
|
48
|
+
startTime: w.start,
|
|
49
|
+
endTime: w.end,
|
|
50
|
+
}));
|
|
51
|
+
return {
|
|
52
|
+
text: result.text ?? "",
|
|
53
|
+
words,
|
|
54
|
+
language: result.language ?? languages?.[0] ?? "",
|
|
55
|
+
duration: result.duration ?? 0,
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=transcribe.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transcribe.js","sourceRoot":"","sources":["../../../src/providers/openai/transcribe.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export declare const BASE_URL = "https://api.openai.com/v1";
|
|
2
|
+
export interface OpenAITranscriptionResponse {
|
|
3
|
+
text?: string;
|
|
4
|
+
language?: string;
|
|
5
|
+
duration?: number;
|
|
6
|
+
words?: Array<{
|
|
7
|
+
word: string;
|
|
8
|
+
start: number;
|
|
9
|
+
end: number;
|
|
10
|
+
}>;
|
|
11
|
+
segments?: Array<{
|
|
12
|
+
id: number;
|
|
13
|
+
start: number;
|
|
14
|
+
end: number;
|
|
15
|
+
text: string;
|
|
16
|
+
}>;
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/providers/openai/types.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,QAAQ,8BAA8B,CAAC;AAEpD,MAAM,WAAW,2BAA2B;IACxC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,KAAK,CAAC;QACV,IAAI,EAAE,MAAM,CAAC;QACb,KAAK,EAAE,MAAM,CAAC;QACd,GAAG,EAAE,MAAM,CAAC;KACf,CAAC,CAAC;IACH,QAAQ,CAAC,EAAE,KAAK,CAAC;QACb,EAAE,EAAE,MAAM,CAAC;QACX,KAAK,EAAE,MAAM,CAAC;QACd,GAAG,EAAE,MAAM,CAAC;QACZ,IAAI,EAAE,MAAM,CAAC;KAChB,CAAC,CAAC;CACN"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/providers/openai/types.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,QAAQ,GAAG,2BAA2B,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fetch-voices.d.ts","sourceRoot":"","sources":["../../../src/providers/playht/fetch-voices.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAK9D,wBAAsB,WAAW,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC,CA6B5E"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { SpeechServiceError } from "../../errors.js";
|
|
2
|
+
import { BASE_URL } from "./types.js";
|
|
3
|
+
export async function fetchVoices(config) {
|
|
4
|
+
const response = await fetch(`${BASE_URL}/voices`, {
|
|
5
|
+
headers: {
|
|
6
|
+
"X-USER-ID": config.userId,
|
|
7
|
+
AUTHORIZATION: config.apiKey,
|
|
8
|
+
},
|
|
9
|
+
});
|
|
10
|
+
if (!response.ok) {
|
|
11
|
+
const errorText = await response.text();
|
|
12
|
+
throw new SpeechServiceError(`PlayHT voice listing failed: ${errorText}`, "API_ERROR", "playht", response.status);
|
|
13
|
+
}
|
|
14
|
+
const voices = (await response.json());
|
|
15
|
+
return voices.map((v) => ({
|
|
16
|
+
id: v.id,
|
|
17
|
+
name: v.name,
|
|
18
|
+
gender: v.gender?.toLowerCase() === "male" ? "male"
|
|
19
|
+
: v.gender?.toLowerCase() === "female" ? "female"
|
|
20
|
+
: undefined,
|
|
21
|
+
locale: v.language_code ?? v.language ?? "en",
|
|
22
|
+
provider: "playht",
|
|
23
|
+
}));
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=fetch-voices.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fetch-voices.js","sourceRoot":"","sources":["../../../src/providers/playht/fetch-voices.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AACrD,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAGtC,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,MAAoB;IAClD,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,QAAQ,SAAS,EAAE;QAC/C,OAAO,EAAE;YACL,WAAW,EAAE,MAAM,CAAC,MAAM;YAC1B,aAAa,EAAE,MAAM,CAAC,MAAM;SAC/B;KACJ,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,gCAAgC,SAAS,EAAE,EAC3C,WAAW,EACX,QAAQ,EACR,QAAQ,CAAC,MAAM,CAClB,CAAC;IACN,CAAC;IAED,MAAM,MAAM,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAkB,CAAC;IAExD,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACtB,EAAE,EAAE,CAAC,CAAC,EAAE;QACR,IAAI,EAAE,CAAC,CAAC,IAAI;QACZ,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,WAAW,EAAE,KAAK,MAAM,CAAC,CAAC,CAAC,MAAe;YACxD,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,WAAW,EAAE,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAiB;gBAC1D,CAAC,CAAC,SAAS;QACf,MAAM,EAAE,CAAC,CAAC,aAAa,IAAI,CAAC,CAAC,QAAQ,IAAI,IAAI;QAC7C,QAAQ,EAAE,QAAiB;KAC9B,CAAC,CAAC,CAAC;AACR,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/providers/playht/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/providers/playht/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import type { PlayHTConfig, PlayHTSynthesizeOptions, SynthesizeResult } from "../../types.js";
|
|
2
|
+
export declare function synthesize(config: PlayHTConfig, text: string, voice: string, language: string | undefined, options?: PlayHTSynthesizeOptions): Promise<SynthesizeResult>;
|
|
3
|
+
//# sourceMappingURL=synthesize.d.ts.map
|