@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.
Files changed (242) hide show
  1. package/README.md +177 -0
  2. package/dist/audio-sampler.d.ts +9 -0
  3. package/dist/audio-sampler.d.ts.map +1 -0
  4. package/dist/audio-sampler.js +135 -0
  5. package/dist/audio-sampler.js.map +1 -0
  6. package/dist/client.d.ts +3 -0
  7. package/dist/client.d.ts.map +1 -0
  8. package/dist/client.js +23 -0
  9. package/dist/client.js.map +1 -0
  10. package/dist/detect-locale.d.ts +3 -0
  11. package/dist/detect-locale.d.ts.map +1 -0
  12. package/dist/detect-locale.js +73 -0
  13. package/dist/detect-locale.js.map +1 -0
  14. package/dist/errors.d.ts +7 -0
  15. package/dist/errors.d.ts.map +1 -0
  16. package/dist/errors.js +13 -0
  17. package/dist/errors.js.map +1 -0
  18. package/dist/fetch-voices.d.ts +3 -0
  19. package/dist/fetch-voices.d.ts.map +1 -0
  20. package/dist/fetch-voices.js +50 -0
  21. package/dist/fetch-voices.js.map +1 -0
  22. package/dist/index.d.ts +10 -0
  23. package/dist/index.d.ts.map +1 -0
  24. package/dist/index.js +12 -0
  25. package/dist/index.js.map +1 -0
  26. package/dist/providers/assemblyai/index.d.ts +2 -0
  27. package/dist/providers/assemblyai/index.d.ts.map +1 -0
  28. package/dist/providers/assemblyai/index.js +2 -0
  29. package/dist/providers/assemblyai/index.js.map +1 -0
  30. package/dist/providers/assemblyai/transcribe.d.ts +3 -0
  31. package/dist/providers/assemblyai/transcribe.d.ts.map +1 -0
  32. package/dist/providers/assemblyai/transcribe.js +92 -0
  33. package/dist/providers/assemblyai/transcribe.js.map +1 -0
  34. package/dist/providers/assemblyai/types.d.ts +18 -0
  35. package/dist/providers/assemblyai/types.d.ts.map +1 -0
  36. package/dist/providers/assemblyai/types.js +2 -0
  37. package/dist/providers/assemblyai/types.js.map +1 -0
  38. package/dist/providers/azure/batch-transcribe.d.ts +3 -0
  39. package/dist/providers/azure/batch-transcribe.d.ts.map +1 -0
  40. package/dist/providers/azure/batch-transcribe.js +118 -0
  41. package/dist/providers/azure/batch-transcribe.js.map +1 -0
  42. package/dist/providers/azure/detect-languages.d.ts +3 -0
  43. package/dist/providers/azure/detect-languages.d.ts.map +1 -0
  44. package/dist/providers/azure/detect-languages.js +15 -0
  45. package/dist/providers/azure/detect-languages.js.map +1 -0
  46. package/dist/providers/azure/fetch-voices.d.ts +3 -0
  47. package/dist/providers/azure/fetch-voices.d.ts.map +1 -0
  48. package/dist/providers/azure/fetch-voices.js +22 -0
  49. package/dist/providers/azure/fetch-voices.js.map +1 -0
  50. package/dist/providers/azure/helpers.d.ts +2 -0
  51. package/dist/providers/azure/helpers.d.ts.map +1 -0
  52. package/dist/providers/azure/helpers.js +9 -0
  53. package/dist/providers/azure/helpers.js.map +1 -0
  54. package/dist/providers/azure/index.d.ts +5 -0
  55. package/dist/providers/azure/index.d.ts.map +1 -0
  56. package/dist/providers/azure/index.js +5 -0
  57. package/dist/providers/azure/index.js.map +1 -0
  58. package/dist/providers/azure/synthesize.d.ts +3 -0
  59. package/dist/providers/azure/synthesize.d.ts.map +1 -0
  60. package/dist/providers/azure/synthesize.js +57 -0
  61. package/dist/providers/azure/synthesize.js.map +1 -0
  62. package/dist/providers/azure/transcribe.d.ts +5 -0
  63. package/dist/providers/azure/transcribe.d.ts.map +1 -0
  64. package/dist/providers/azure/transcribe.js +75 -0
  65. package/dist/providers/azure/transcribe.js.map +1 -0
  66. package/dist/providers/azure/types.d.ts +48 -0
  67. package/dist/providers/azure/types.d.ts.map +1 -0
  68. package/dist/providers/azure/types.js +2 -0
  69. package/dist/providers/azure/types.js.map +1 -0
  70. package/dist/providers/cartesia/fetch-voices.d.ts +3 -0
  71. package/dist/providers/cartesia/fetch-voices.d.ts.map +1 -0
  72. package/dist/providers/cartesia/fetch-voices.js +37 -0
  73. package/dist/providers/cartesia/fetch-voices.js.map +1 -0
  74. package/dist/providers/cartesia/index.d.ts +3 -0
  75. package/dist/providers/cartesia/index.d.ts.map +1 -0
  76. package/dist/providers/cartesia/index.js +3 -0
  77. package/dist/providers/cartesia/index.js.map +1 -0
  78. package/dist/providers/cartesia/synthesize.d.ts +3 -0
  79. package/dist/providers/cartesia/synthesize.d.ts.map +1 -0
  80. package/dist/providers/cartesia/synthesize.js +54 -0
  81. package/dist/providers/cartesia/synthesize.js.map +1 -0
  82. package/dist/providers/cartesia/types.d.ts +14 -0
  83. package/dist/providers/cartesia/types.d.ts.map +1 -0
  84. package/dist/providers/cartesia/types.js +3 -0
  85. package/dist/providers/cartesia/types.js.map +1 -0
  86. package/dist/providers/deepgram/fetch-voices.d.ts +3 -0
  87. package/dist/providers/deepgram/fetch-voices.d.ts.map +1 -0
  88. package/dist/providers/deepgram/fetch-voices.js +27 -0
  89. package/dist/providers/deepgram/fetch-voices.js.map +1 -0
  90. package/dist/providers/deepgram/index.d.ts +4 -0
  91. package/dist/providers/deepgram/index.d.ts.map +1 -0
  92. package/dist/providers/deepgram/index.js +4 -0
  93. package/dist/providers/deepgram/index.js.map +1 -0
  94. package/dist/providers/deepgram/synthesize.d.ts +3 -0
  95. package/dist/providers/deepgram/synthesize.d.ts.map +1 -0
  96. package/dist/providers/deepgram/synthesize.js +31 -0
  97. package/dist/providers/deepgram/synthesize.js.map +1 -0
  98. package/dist/providers/deepgram/transcribe.d.ts +3 -0
  99. package/dist/providers/deepgram/transcribe.d.ts.map +1 -0
  100. package/dist/providers/deepgram/transcribe.js +53 -0
  101. package/dist/providers/deepgram/transcribe.js.map +1 -0
  102. package/dist/providers/deepgram/types.d.ts +39 -0
  103. package/dist/providers/deepgram/types.d.ts.map +1 -0
  104. package/dist/providers/deepgram/types.js +2 -0
  105. package/dist/providers/deepgram/types.js.map +1 -0
  106. package/dist/providers/elevenlabs/fetch-voices.d.ts +3 -0
  107. package/dist/providers/elevenlabs/fetch-voices.d.ts.map +1 -0
  108. package/dist/providers/elevenlabs/fetch-voices.js +27 -0
  109. package/dist/providers/elevenlabs/fetch-voices.js.map +1 -0
  110. package/dist/providers/elevenlabs/index.d.ts +4 -0
  111. package/dist/providers/elevenlabs/index.d.ts.map +1 -0
  112. package/dist/providers/elevenlabs/index.js +4 -0
  113. package/dist/providers/elevenlabs/index.js.map +1 -0
  114. package/dist/providers/elevenlabs/synthesize.d.ts +3 -0
  115. package/dist/providers/elevenlabs/synthesize.d.ts.map +1 -0
  116. package/dist/providers/elevenlabs/synthesize.js +43 -0
  117. package/dist/providers/elevenlabs/synthesize.js.map +1 -0
  118. package/dist/providers/elevenlabs/transcribe.d.ts +3 -0
  119. package/dist/providers/elevenlabs/transcribe.d.ts.map +1 -0
  120. package/dist/providers/elevenlabs/transcribe.js +50 -0
  121. package/dist/providers/elevenlabs/transcribe.js.map +1 -0
  122. package/dist/providers/elevenlabs/types.d.ts +24 -0
  123. package/dist/providers/elevenlabs/types.d.ts.map +1 -0
  124. package/dist/providers/elevenlabs/types.js +2 -0
  125. package/dist/providers/elevenlabs/types.js.map +1 -0
  126. package/dist/providers/google/fetch-voices.d.ts +3 -0
  127. package/dist/providers/google/fetch-voices.d.ts.map +1 -0
  128. package/dist/providers/google/fetch-voices.js +28 -0
  129. package/dist/providers/google/fetch-voices.js.map +1 -0
  130. package/dist/providers/google/helpers.d.ts +10 -0
  131. package/dist/providers/google/helpers.d.ts.map +1 -0
  132. package/dist/providers/google/helpers.js +15 -0
  133. package/dist/providers/google/helpers.js.map +1 -0
  134. package/dist/providers/google/index.d.ts +4 -0
  135. package/dist/providers/google/index.d.ts.map +1 -0
  136. package/dist/providers/google/index.js +4 -0
  137. package/dist/providers/google/index.js.map +1 -0
  138. package/dist/providers/google/synthesize.d.ts +3 -0
  139. package/dist/providers/google/synthesize.d.ts.map +1 -0
  140. package/dist/providers/google/synthesize.js +35 -0
  141. package/dist/providers/google/synthesize.js.map +1 -0
  142. package/dist/providers/google/transcribe.d.ts +3 -0
  143. package/dist/providers/google/transcribe.d.ts.map +1 -0
  144. package/dist/providers/google/transcribe.js +117 -0
  145. package/dist/providers/google/transcribe.js.map +1 -0
  146. package/dist/providers/google/types.d.ts +43 -0
  147. package/dist/providers/google/types.d.ts.map +1 -0
  148. package/dist/providers/google/types.js +3 -0
  149. package/dist/providers/google/types.js.map +1 -0
  150. package/dist/providers/openai/fetch-voices.d.ts +3 -0
  151. package/dist/providers/openai/fetch-voices.d.ts.map +1 -0
  152. package/dist/providers/openai/fetch-voices.js +14 -0
  153. package/dist/providers/openai/fetch-voices.js.map +1 -0
  154. package/dist/providers/openai/index.d.ts +4 -0
  155. package/dist/providers/openai/index.d.ts.map +1 -0
  156. package/dist/providers/openai/index.js +4 -0
  157. package/dist/providers/openai/index.js.map +1 -0
  158. package/dist/providers/openai/synthesize.d.ts +3 -0
  159. package/dist/providers/openai/synthesize.d.ts.map +1 -0
  160. package/dist/providers/openai/synthesize.js +37 -0
  161. package/dist/providers/openai/synthesize.js.map +1 -0
  162. package/dist/providers/openai/transcribe.d.ts +3 -0
  163. package/dist/providers/openai/transcribe.d.ts.map +1 -0
  164. package/dist/providers/openai/transcribe.js +58 -0
  165. package/dist/providers/openai/transcribe.js.map +1 -0
  166. package/dist/providers/openai/types.d.ts +18 -0
  167. package/dist/providers/openai/types.d.ts.map +1 -0
  168. package/dist/providers/openai/types.js +2 -0
  169. package/dist/providers/openai/types.js.map +1 -0
  170. package/dist/providers/playht/fetch-voices.d.ts +3 -0
  171. package/dist/providers/playht/fetch-voices.d.ts.map +1 -0
  172. package/dist/providers/playht/fetch-voices.js +25 -0
  173. package/dist/providers/playht/fetch-voices.js.map +1 -0
  174. package/dist/providers/playht/index.d.ts +3 -0
  175. package/dist/providers/playht/index.d.ts.map +1 -0
  176. package/dist/providers/playht/index.js +3 -0
  177. package/dist/providers/playht/index.js.map +1 -0
  178. package/dist/providers/playht/synthesize.d.ts +3 -0
  179. package/dist/providers/playht/synthesize.d.ts.map +1 -0
  180. package/dist/providers/playht/synthesize.js +41 -0
  181. package/dist/providers/playht/synthesize.js.map +1 -0
  182. package/dist/providers/playht/types.d.ts +11 -0
  183. package/dist/providers/playht/types.d.ts.map +1 -0
  184. package/dist/providers/playht/types.js +2 -0
  185. package/dist/providers/playht/types.js.map +1 -0
  186. package/dist/providers/revai/index.d.ts +2 -0
  187. package/dist/providers/revai/index.d.ts.map +1 -0
  188. package/dist/providers/revai/index.js +2 -0
  189. package/dist/providers/revai/index.js.map +1 -0
  190. package/dist/providers/revai/transcribe.d.ts +3 -0
  191. package/dist/providers/revai/transcribe.d.ts.map +1 -0
  192. package/dist/providers/revai/transcribe.js +97 -0
  193. package/dist/providers/revai/transcribe.js.map +1 -0
  194. package/dist/providers/revai/types.d.ts +23 -0
  195. package/dist/providers/revai/types.d.ts.map +1 -0
  196. package/dist/providers/revai/types.js +2 -0
  197. package/dist/providers/revai/types.js.map +1 -0
  198. package/dist/providers/speechmatics/detect-languages.d.ts +3 -0
  199. package/dist/providers/speechmatics/detect-languages.d.ts.map +1 -0
  200. package/dist/providers/speechmatics/detect-languages.js +24 -0
  201. package/dist/providers/speechmatics/detect-languages.js.map +1 -0
  202. package/dist/providers/speechmatics/helpers.d.ts +4 -0
  203. package/dist/providers/speechmatics/helpers.d.ts.map +1 -0
  204. package/dist/providers/speechmatics/helpers.js +57 -0
  205. package/dist/providers/speechmatics/helpers.js.map +1 -0
  206. package/dist/providers/speechmatics/index.d.ts +3 -0
  207. package/dist/providers/speechmatics/index.d.ts.map +1 -0
  208. package/dist/providers/speechmatics/index.js +3 -0
  209. package/dist/providers/speechmatics/index.js.map +1 -0
  210. package/dist/providers/speechmatics/transcribe.d.ts +3 -0
  211. package/dist/providers/speechmatics/transcribe.d.ts.map +1 -0
  212. package/dist/providers/speechmatics/transcribe.js +61 -0
  213. package/dist/providers/speechmatics/transcribe.js.map +1 -0
  214. package/dist/providers/speechmatics/types.d.ts +27 -0
  215. package/dist/providers/speechmatics/types.d.ts.map +1 -0
  216. package/dist/providers/speechmatics/types.js +2 -0
  217. package/dist/providers/speechmatics/types.js.map +1 -0
  218. package/dist/synthesize.d.ts +4 -0
  219. package/dist/synthesize.d.ts.map +1 -0
  220. package/dist/synthesize.js +73 -0
  221. package/dist/synthesize.js.map +1 -0
  222. package/dist/transcribe.d.ts +3 -0
  223. package/dist/transcribe.d.ts.map +1 -0
  224. package/dist/transcribe.js +55 -0
  225. package/dist/transcribe.js.map +1 -0
  226. package/dist/types.d.ts +361 -0
  227. package/dist/types.d.ts.map +1 -0
  228. package/dist/types.js +3 -0
  229. package/dist/types.js.map +1 -0
  230. package/dist/utils.d.ts +19 -0
  231. package/dist/utils.d.ts.map +1 -0
  232. package/dist/utils.js +101 -0
  233. package/dist/utils.js.map +1 -0
  234. package/dist/voice-cache.d.ts +9 -0
  235. package/dist/voice-cache.d.ts.map +1 -0
  236. package/dist/voice-cache.js +21 -0
  237. package/dist/voice-cache.js.map +1 -0
  238. package/dist/voice-resolver.d.ts +7 -0
  239. package/dist/voice-resolver.d.ts.map +1 -0
  240. package/dist/voice-resolver.js +82 -0
  241. package/dist/voice-resolver.js.map +1 -0
  242. package/package.json +100 -0
@@ -0,0 +1,3 @@
1
+ import type { GoogleConfig, VoiceInfo } from "../../types.js";
2
+ export declare function fetchVoices(config: GoogleConfig): Promise<VoiceInfo[]>;
3
+ //# sourceMappingURL=fetch-voices.d.ts.map
@@ -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,4 @@
1
+ export { transcribe } from "./transcribe.js";
2
+ export { synthesize } from "./synthesize.js";
3
+ export { fetchVoices } from "./fetch-voices.js";
4
+ //# sourceMappingURL=index.d.ts.map
@@ -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,4 @@
1
+ export { transcribe } from "./transcribe.js";
2
+ export { synthesize } from "./synthesize.js";
3
+ export { fetchVoices } from "./fetch-voices.js";
4
+ //# sourceMappingURL=index.js.map
@@ -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":"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"}
@@ -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,3 @@
1
+ export const STT_BASE_URL = "https://speech.googleapis.com/v1";
2
+ export const TTS_BASE_URL = "https://texttospeech.googleapis.com/v1";
3
+ //# sourceMappingURL=types.js.map
@@ -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,3 @@
1
+ import type { OpenAIConfig, VoiceInfo } from "../../types.js";
2
+ export declare function fetchVoices(_config: OpenAIConfig): Promise<VoiceInfo[]>;
3
+ //# sourceMappingURL=fetch-voices.d.ts.map
@@ -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,4 @@
1
+ export { transcribe } from "./transcribe.js";
2
+ export { synthesize } from "./synthesize.js";
3
+ export { fetchVoices } from "./fetch-voices.js";
4
+ //# sourceMappingURL=index.d.ts.map
@@ -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,4 @@
1
+ export { transcribe } from "./transcribe.js";
2
+ export { synthesize } from "./synthesize.js";
3
+ export { fetchVoices } from "./fetch-voices.js";
4
+ //# sourceMappingURL=index.js.map
@@ -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,2 @@
1
+ export const BASE_URL = "https://api.openai.com/v1";
2
+ //# sourceMappingURL=types.js.map
@@ -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,3 @@
1
+ import type { PlayHTConfig, VoiceInfo } from "../../types.js";
2
+ export declare function fetchVoices(config: PlayHTConfig): Promise<VoiceInfo[]>;
3
+ //# sourceMappingURL=fetch-voices.d.ts.map
@@ -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,3 @@
1
+ export { synthesize } from "./synthesize.js";
2
+ export { fetchVoices } from "./fetch-voices.js";
3
+ //# sourceMappingURL=index.d.ts.map
@@ -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,3 @@
1
+ export { synthesize } from "./synthesize.js";
2
+ export { fetchVoices } from "./fetch-voices.js";
3
+ //# sourceMappingURL=index.js.map
@@ -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