@livekit/agents 0.0.0-20260120144724

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 (987) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +17 -0
  3. package/dist/_exceptions.cjs +109 -0
  4. package/dist/_exceptions.cjs.map +1 -0
  5. package/dist/_exceptions.d.cts +64 -0
  6. package/dist/_exceptions.d.ts +64 -0
  7. package/dist/_exceptions.d.ts.map +1 -0
  8. package/dist/_exceptions.js +80 -0
  9. package/dist/_exceptions.js.map +1 -0
  10. package/dist/audio.cjs +170 -0
  11. package/dist/audio.cjs.map +1 -0
  12. package/dist/audio.d.cts +46 -0
  13. package/dist/audio.d.ts +46 -0
  14. package/dist/audio.d.ts.map +1 -0
  15. package/dist/audio.js +133 -0
  16. package/dist/audio.js.map +1 -0
  17. package/dist/cli.cjs +171 -0
  18. package/dist/cli.cjs.map +1 -0
  19. package/dist/cli.d.cts +14 -0
  20. package/dist/cli.d.ts +14 -0
  21. package/dist/cli.d.ts.map +1 -0
  22. package/dist/cli.js +145 -0
  23. package/dist/cli.js.map +1 -0
  24. package/dist/connection_pool.cjs +242 -0
  25. package/dist/connection_pool.cjs.map +1 -0
  26. package/dist/connection_pool.d.cts +123 -0
  27. package/dist/connection_pool.d.ts +123 -0
  28. package/dist/connection_pool.d.ts.map +1 -0
  29. package/dist/connection_pool.js +218 -0
  30. package/dist/connection_pool.js.map +1 -0
  31. package/dist/connection_pool.test.cjs +256 -0
  32. package/dist/connection_pool.test.cjs.map +1 -0
  33. package/dist/connection_pool.test.js +255 -0
  34. package/dist/connection_pool.test.js.map +1 -0
  35. package/dist/constants.cjs +44 -0
  36. package/dist/constants.cjs.map +1 -0
  37. package/dist/constants.d.cts +7 -0
  38. package/dist/constants.d.ts +7 -0
  39. package/dist/constants.d.ts.map +1 -0
  40. package/dist/constants.js +15 -0
  41. package/dist/constants.js.map +1 -0
  42. package/dist/generator.cjs +36 -0
  43. package/dist/generator.cjs.map +1 -0
  44. package/dist/generator.d.cts +23 -0
  45. package/dist/generator.d.ts +23 -0
  46. package/dist/generator.d.ts.map +1 -0
  47. package/dist/generator.js +11 -0
  48. package/dist/generator.js.map +1 -0
  49. package/dist/http_server.cjs +75 -0
  50. package/dist/http_server.cjs.map +1 -0
  51. package/dist/http_server.d.cts +20 -0
  52. package/dist/http_server.d.ts +20 -0
  53. package/dist/http_server.d.ts.map +1 -0
  54. package/dist/http_server.js +51 -0
  55. package/dist/http_server.js.map +1 -0
  56. package/dist/index.cjs +100 -0
  57. package/dist/index.cjs.map +1 -0
  58. package/dist/index.d.cts +35 -0
  59. package/dist/index.d.ts +35 -0
  60. package/dist/index.d.ts.map +1 -0
  61. package/dist/index.js +40 -0
  62. package/dist/index.js.map +1 -0
  63. package/dist/inference/api_protos.cjs +104 -0
  64. package/dist/inference/api_protos.cjs.map +1 -0
  65. package/dist/inference/api_protos.d.cts +222 -0
  66. package/dist/inference/api_protos.d.ts +222 -0
  67. package/dist/inference/api_protos.d.ts.map +1 -0
  68. package/dist/inference/api_protos.js +70 -0
  69. package/dist/inference/api_protos.js.map +1 -0
  70. package/dist/inference/index.cjs +56 -0
  71. package/dist/inference/index.cjs.map +1 -0
  72. package/dist/inference/index.d.cts +8 -0
  73. package/dist/inference/index.d.ts +8 -0
  74. package/dist/inference/index.d.ts.map +1 -0
  75. package/dist/inference/index.js +23 -0
  76. package/dist/inference/index.js.map +1 -0
  77. package/dist/inference/interruption/AdaptiveInterruptionDetector.cjs +152 -0
  78. package/dist/inference/interruption/AdaptiveInterruptionDetector.cjs.map +1 -0
  79. package/dist/inference/interruption/AdaptiveInterruptionDetector.d.cts +50 -0
  80. package/dist/inference/interruption/AdaptiveInterruptionDetector.d.ts +50 -0
  81. package/dist/inference/interruption/AdaptiveInterruptionDetector.d.ts.map +1 -0
  82. package/dist/inference/interruption/AdaptiveInterruptionDetector.js +125 -0
  83. package/dist/inference/interruption/AdaptiveInterruptionDetector.js.map +1 -0
  84. package/dist/inference/interruption/InterruptionStream.cjs +310 -0
  85. package/dist/inference/interruption/InterruptionStream.cjs.map +1 -0
  86. package/dist/inference/interruption/InterruptionStream.d.cts +57 -0
  87. package/dist/inference/interruption/InterruptionStream.d.ts +57 -0
  88. package/dist/inference/interruption/InterruptionStream.d.ts.map +1 -0
  89. package/dist/inference/interruption/InterruptionStream.js +288 -0
  90. package/dist/inference/interruption/InterruptionStream.js.map +1 -0
  91. package/dist/inference/interruption/defaults.cjs +76 -0
  92. package/dist/inference/interruption/defaults.cjs.map +1 -0
  93. package/dist/inference/interruption/defaults.d.cts +14 -0
  94. package/dist/inference/interruption/defaults.d.ts +14 -0
  95. package/dist/inference/interruption/defaults.d.ts.map +1 -0
  96. package/dist/inference/interruption/defaults.js +42 -0
  97. package/dist/inference/interruption/defaults.js.map +1 -0
  98. package/dist/inference/interruption/errors.cjs +2 -0
  99. package/dist/inference/interruption/errors.cjs.map +1 -0
  100. package/dist/inference/interruption/errors.d.cts +2 -0
  101. package/dist/inference/interruption/errors.d.ts +2 -0
  102. package/dist/inference/interruption/errors.d.ts.map +1 -0
  103. package/dist/inference/interruption/errors.js +1 -0
  104. package/dist/inference/interruption/errors.js.map +1 -0
  105. package/dist/inference/interruption/http_transport.cjs +57 -0
  106. package/dist/inference/interruption/http_transport.cjs.map +1 -0
  107. package/dist/inference/interruption/http_transport.d.cts +23 -0
  108. package/dist/inference/interruption/http_transport.d.ts +23 -0
  109. package/dist/inference/interruption/http_transport.d.ts.map +1 -0
  110. package/dist/inference/interruption/http_transport.js +33 -0
  111. package/dist/inference/interruption/http_transport.js.map +1 -0
  112. package/dist/inference/interruption/index.cjs +34 -0
  113. package/dist/inference/interruption/index.cjs.map +1 -0
  114. package/dist/inference/interruption/index.d.cts +5 -0
  115. package/dist/inference/interruption/index.d.ts +5 -0
  116. package/dist/inference/interruption/index.d.ts.map +1 -0
  117. package/dist/inference/interruption/index.js +7 -0
  118. package/dist/inference/interruption/index.js.map +1 -0
  119. package/dist/inference/interruption/interruption.cjs +85 -0
  120. package/dist/inference/interruption/interruption.cjs.map +1 -0
  121. package/dist/inference/interruption/interruption.d.cts +48 -0
  122. package/dist/inference/interruption/interruption.d.ts +48 -0
  123. package/dist/inference/interruption/interruption.d.ts.map +1 -0
  124. package/dist/inference/interruption/interruption.js +59 -0
  125. package/dist/inference/interruption/interruption.js.map +1 -0
  126. package/dist/inference/llm.cjs +347 -0
  127. package/dist/inference/llm.cjs.map +1 -0
  128. package/dist/inference/llm.d.cts +114 -0
  129. package/dist/inference/llm.d.ts +114 -0
  130. package/dist/inference/llm.d.ts.map +1 -0
  131. package/dist/inference/llm.js +318 -0
  132. package/dist/inference/llm.js.map +1 -0
  133. package/dist/inference/stt.cjs +371 -0
  134. package/dist/inference/stt.cjs.map +1 -0
  135. package/dist/inference/stt.d.cts +91 -0
  136. package/dist/inference/stt.d.ts +91 -0
  137. package/dist/inference/stt.d.ts.map +1 -0
  138. package/dist/inference/stt.js +350 -0
  139. package/dist/inference/stt.js.map +1 -0
  140. package/dist/inference/tts.cjs +439 -0
  141. package/dist/inference/tts.cjs.map +1 -0
  142. package/dist/inference/tts.d.cts +80 -0
  143. package/dist/inference/tts.d.ts +80 -0
  144. package/dist/inference/tts.d.ts.map +1 -0
  145. package/dist/inference/tts.js +417 -0
  146. package/dist/inference/tts.js.map +1 -0
  147. package/dist/inference/utils.cjs +89 -0
  148. package/dist/inference/utils.cjs.map +1 -0
  149. package/dist/inference/utils.d.cts +6 -0
  150. package/dist/inference/utils.d.ts +6 -0
  151. package/dist/inference/utils.d.ts.map +1 -0
  152. package/dist/inference/utils.js +63 -0
  153. package/dist/inference/utils.js.map +1 -0
  154. package/dist/inference/utils.test.cjs +20 -0
  155. package/dist/inference/utils.test.cjs.map +1 -0
  156. package/dist/inference/utils.test.js +19 -0
  157. package/dist/inference/utils.test.js.map +1 -0
  158. package/dist/inference_runner.cjs +37 -0
  159. package/dist/inference_runner.cjs.map +1 -0
  160. package/dist/inference_runner.d.cts +11 -0
  161. package/dist/inference_runner.d.ts +11 -0
  162. package/dist/inference_runner.d.ts.map +1 -0
  163. package/dist/inference_runner.js +13 -0
  164. package/dist/inference_runner.js.map +1 -0
  165. package/dist/ipc/index.cjs +23 -0
  166. package/dist/ipc/index.cjs.map +1 -0
  167. package/dist/ipc/index.d.cts +2 -0
  168. package/dist/ipc/index.d.ts +2 -0
  169. package/dist/ipc/index.d.ts.map +1 -0
  170. package/dist/ipc/index.js +2 -0
  171. package/dist/ipc/index.js.map +1 -0
  172. package/dist/ipc/inference_executor.cjs +17 -0
  173. package/dist/ipc/inference_executor.cjs.map +1 -0
  174. package/dist/ipc/inference_executor.d.cts +4 -0
  175. package/dist/ipc/inference_executor.d.ts +4 -0
  176. package/dist/ipc/inference_executor.d.ts.map +1 -0
  177. package/dist/ipc/inference_executor.js +1 -0
  178. package/dist/ipc/inference_executor.js.map +1 -0
  179. package/dist/ipc/inference_proc_executor.cjs +101 -0
  180. package/dist/ipc/inference_proc_executor.cjs.map +1 -0
  181. package/dist/ipc/inference_proc_executor.d.cts +23 -0
  182. package/dist/ipc/inference_proc_executor.d.ts +23 -0
  183. package/dist/ipc/inference_proc_executor.d.ts.map +1 -0
  184. package/dist/ipc/inference_proc_executor.js +75 -0
  185. package/dist/ipc/inference_proc_executor.js.map +1 -0
  186. package/dist/ipc/inference_proc_lazy_main.cjs +86 -0
  187. package/dist/ipc/inference_proc_lazy_main.cjs.map +1 -0
  188. package/dist/ipc/inference_proc_lazy_main.d.cts +2 -0
  189. package/dist/ipc/inference_proc_lazy_main.d.ts +2 -0
  190. package/dist/ipc/inference_proc_lazy_main.d.ts.map +1 -0
  191. package/dist/ipc/inference_proc_lazy_main.js +85 -0
  192. package/dist/ipc/inference_proc_lazy_main.js.map +1 -0
  193. package/dist/ipc/job_executor.cjs +34 -0
  194. package/dist/ipc/job_executor.cjs.map +1 -0
  195. package/dist/ipc/job_executor.d.cts +18 -0
  196. package/dist/ipc/job_executor.d.ts +18 -0
  197. package/dist/ipc/job_executor.d.ts.map +1 -0
  198. package/dist/ipc/job_executor.js +10 -0
  199. package/dist/ipc/job_executor.js.map +1 -0
  200. package/dist/ipc/job_proc_executor.cjs +115 -0
  201. package/dist/ipc/job_proc_executor.cjs.map +1 -0
  202. package/dist/ipc/job_proc_executor.d.cts +19 -0
  203. package/dist/ipc/job_proc_executor.d.ts +19 -0
  204. package/dist/ipc/job_proc_executor.d.ts.map +1 -0
  205. package/dist/ipc/job_proc_executor.js +89 -0
  206. package/dist/ipc/job_proc_executor.js.map +1 -0
  207. package/dist/ipc/job_proc_lazy_main.cjs +210 -0
  208. package/dist/ipc/job_proc_lazy_main.cjs.map +1 -0
  209. package/dist/ipc/job_proc_lazy_main.d.cts +2 -0
  210. package/dist/ipc/job_proc_lazy_main.d.ts +2 -0
  211. package/dist/ipc/job_proc_lazy_main.d.ts.map +1 -0
  212. package/dist/ipc/job_proc_lazy_main.js +187 -0
  213. package/dist/ipc/job_proc_lazy_main.js.map +1 -0
  214. package/dist/ipc/message.cjs +17 -0
  215. package/dist/ipc/message.cjs.map +1 -0
  216. package/dist/ipc/message.d.cts +58 -0
  217. package/dist/ipc/message.d.ts +58 -0
  218. package/dist/ipc/message.d.ts.map +1 -0
  219. package/dist/ipc/message.js +1 -0
  220. package/dist/ipc/message.js.map +1 -0
  221. package/dist/ipc/proc_pool.cjs +164 -0
  222. package/dist/ipc/proc_pool.cjs.map +1 -0
  223. package/dist/ipc/proc_pool.d.cts +31 -0
  224. package/dist/ipc/proc_pool.d.ts +31 -0
  225. package/dist/ipc/proc_pool.d.ts.map +1 -0
  226. package/dist/ipc/proc_pool.js +140 -0
  227. package/dist/ipc/proc_pool.js.map +1 -0
  228. package/dist/ipc/supervised_proc.cjs +229 -0
  229. package/dist/ipc/supervised_proc.cjs.map +1 -0
  230. package/dist/ipc/supervised_proc.d.cts +32 -0
  231. package/dist/ipc/supervised_proc.d.ts +32 -0
  232. package/dist/ipc/supervised_proc.d.ts.map +1 -0
  233. package/dist/ipc/supervised_proc.js +195 -0
  234. package/dist/ipc/supervised_proc.js.map +1 -0
  235. package/dist/ipc/supervised_proc.test.cjs +145 -0
  236. package/dist/ipc/supervised_proc.test.cjs.map +1 -0
  237. package/dist/ipc/supervised_proc.test.js +122 -0
  238. package/dist/ipc/supervised_proc.test.js.map +1 -0
  239. package/dist/job.cjs +373 -0
  240. package/dist/job.cjs.map +1 -0
  241. package/dist/job.d.cts +141 -0
  242. package/dist/job.d.ts +141 -0
  243. package/dist/job.d.ts.map +1 -0
  244. package/dist/job.js +332 -0
  245. package/dist/job.js.map +1 -0
  246. package/dist/llm/chat_context.cjs +527 -0
  247. package/dist/llm/chat_context.cjs.map +1 -0
  248. package/dist/llm/chat_context.d.cts +223 -0
  249. package/dist/llm/chat_context.d.ts +223 -0
  250. package/dist/llm/chat_context.d.ts.map +1 -0
  251. package/dist/llm/chat_context.js +496 -0
  252. package/dist/llm/chat_context.js.map +1 -0
  253. package/dist/llm/chat_context.test.cjs +911 -0
  254. package/dist/llm/chat_context.test.cjs.map +1 -0
  255. package/dist/llm/chat_context.test.js +916 -0
  256. package/dist/llm/chat_context.test.js.map +1 -0
  257. package/dist/llm/fallback_adapter.cjs +278 -0
  258. package/dist/llm/fallback_adapter.cjs.map +1 -0
  259. package/dist/llm/fallback_adapter.d.cts +73 -0
  260. package/dist/llm/fallback_adapter.d.ts +73 -0
  261. package/dist/llm/fallback_adapter.d.ts.map +1 -0
  262. package/dist/llm/fallback_adapter.js +254 -0
  263. package/dist/llm/fallback_adapter.js.map +1 -0
  264. package/dist/llm/fallback_adapter.test.cjs +176 -0
  265. package/dist/llm/fallback_adapter.test.cjs.map +1 -0
  266. package/dist/llm/fallback_adapter.test.js +175 -0
  267. package/dist/llm/fallback_adapter.test.js.map +1 -0
  268. package/dist/llm/index.cjs +79 -0
  269. package/dist/llm/index.cjs.map +1 -0
  270. package/dist/llm/index.d.cts +9 -0
  271. package/dist/llm/index.d.ts +9 -0
  272. package/dist/llm/index.d.ts.map +1 -0
  273. package/dist/llm/index.js +61 -0
  274. package/dist/llm/index.js.map +1 -0
  275. package/dist/llm/llm.cjs +226 -0
  276. package/dist/llm/llm.cjs.map +1 -0
  277. package/dist/llm/llm.d.cts +94 -0
  278. package/dist/llm/llm.d.ts +94 -0
  279. package/dist/llm/llm.d.ts.map +1 -0
  280. package/dist/llm/llm.js +201 -0
  281. package/dist/llm/llm.js.map +1 -0
  282. package/dist/llm/provider_format/google.cjs +132 -0
  283. package/dist/llm/provider_format/google.cjs.map +1 -0
  284. package/dist/llm/provider_format/google.d.cts +6 -0
  285. package/dist/llm/provider_format/google.d.ts +6 -0
  286. package/dist/llm/provider_format/google.d.ts.map +1 -0
  287. package/dist/llm/provider_format/google.js +108 -0
  288. package/dist/llm/provider_format/google.js.map +1 -0
  289. package/dist/llm/provider_format/google.test.cjs +724 -0
  290. package/dist/llm/provider_format/google.test.cjs.map +1 -0
  291. package/dist/llm/provider_format/google.test.js +728 -0
  292. package/dist/llm/provider_format/google.test.js.map +1 -0
  293. package/dist/llm/provider_format/index.cjs +40 -0
  294. package/dist/llm/provider_format/index.cjs.map +1 -0
  295. package/dist/llm/provider_format/index.d.cts +4 -0
  296. package/dist/llm/provider_format/index.d.ts +4 -0
  297. package/dist/llm/provider_format/index.d.ts.map +1 -0
  298. package/dist/llm/provider_format/index.js +16 -0
  299. package/dist/llm/provider_format/index.js.map +1 -0
  300. package/dist/llm/provider_format/openai.cjs +138 -0
  301. package/dist/llm/provider_format/openai.cjs.map +1 -0
  302. package/dist/llm/provider_format/openai.d.cts +3 -0
  303. package/dist/llm/provider_format/openai.d.ts +3 -0
  304. package/dist/llm/provider_format/openai.d.ts.map +1 -0
  305. package/dist/llm/provider_format/openai.js +114 -0
  306. package/dist/llm/provider_format/openai.js.map +1 -0
  307. package/dist/llm/provider_format/openai.test.cjs +557 -0
  308. package/dist/llm/provider_format/openai.test.cjs.map +1 -0
  309. package/dist/llm/provider_format/openai.test.js +561 -0
  310. package/dist/llm/provider_format/openai.test.js.map +1 -0
  311. package/dist/llm/provider_format/utils.cjs +146 -0
  312. package/dist/llm/provider_format/utils.cjs.map +1 -0
  313. package/dist/llm/provider_format/utils.d.cts +38 -0
  314. package/dist/llm/provider_format/utils.d.ts +38 -0
  315. package/dist/llm/provider_format/utils.d.ts.map +1 -0
  316. package/dist/llm/provider_format/utils.js +122 -0
  317. package/dist/llm/provider_format/utils.js.map +1 -0
  318. package/dist/llm/realtime.cjs +77 -0
  319. package/dist/llm/realtime.cjs.map +1 -0
  320. package/dist/llm/realtime.d.cts +106 -0
  321. package/dist/llm/realtime.d.ts +106 -0
  322. package/dist/llm/realtime.d.ts.map +1 -0
  323. package/dist/llm/realtime.js +52 -0
  324. package/dist/llm/realtime.js.map +1 -0
  325. package/dist/llm/remote_chat_context.cjs +112 -0
  326. package/dist/llm/remote_chat_context.cjs.map +1 -0
  327. package/dist/llm/remote_chat_context.d.cts +25 -0
  328. package/dist/llm/remote_chat_context.d.ts +25 -0
  329. package/dist/llm/remote_chat_context.d.ts.map +1 -0
  330. package/dist/llm/remote_chat_context.js +88 -0
  331. package/dist/llm/remote_chat_context.js.map +1 -0
  332. package/dist/llm/remote_chat_context.test.cjs +225 -0
  333. package/dist/llm/remote_chat_context.test.cjs.map +1 -0
  334. package/dist/llm/remote_chat_context.test.js +224 -0
  335. package/dist/llm/remote_chat_context.test.js.map +1 -0
  336. package/dist/llm/tool_context.cjs +152 -0
  337. package/dist/llm/tool_context.cjs.map +1 -0
  338. package/dist/llm/tool_context.d.cts +153 -0
  339. package/dist/llm/tool_context.d.ts +153 -0
  340. package/dist/llm/tool_context.d.ts.map +1 -0
  341. package/dist/llm/tool_context.js +119 -0
  342. package/dist/llm/tool_context.js.map +1 -0
  343. package/dist/llm/tool_context.test.cjs +359 -0
  344. package/dist/llm/tool_context.test.cjs.map +1 -0
  345. package/dist/llm/tool_context.test.js +336 -0
  346. package/dist/llm/tool_context.test.js.map +1 -0
  347. package/dist/llm/tool_context.type.test.cjs +92 -0
  348. package/dist/llm/tool_context.type.test.cjs.map +1 -0
  349. package/dist/llm/tool_context.type.test.js +91 -0
  350. package/dist/llm/tool_context.type.test.js.map +1 -0
  351. package/dist/llm/utils.cjs +267 -0
  352. package/dist/llm/utils.cjs.map +1 -0
  353. package/dist/llm/utils.d.cts +41 -0
  354. package/dist/llm/utils.d.ts +41 -0
  355. package/dist/llm/utils.d.ts.map +1 -0
  356. package/dist/llm/utils.js +230 -0
  357. package/dist/llm/utils.js.map +1 -0
  358. package/dist/llm/utils.test.cjs +513 -0
  359. package/dist/llm/utils.test.cjs.map +1 -0
  360. package/dist/llm/utils.test.js +490 -0
  361. package/dist/llm/utils.test.js.map +1 -0
  362. package/dist/llm/zod-utils.cjs +102 -0
  363. package/dist/llm/zod-utils.cjs.map +1 -0
  364. package/dist/llm/zod-utils.d.cts +65 -0
  365. package/dist/llm/zod-utils.d.ts +65 -0
  366. package/dist/llm/zod-utils.d.ts.map +1 -0
  367. package/dist/llm/zod-utils.js +64 -0
  368. package/dist/llm/zod-utils.js.map +1 -0
  369. package/dist/llm/zod-utils.test.cjs +472 -0
  370. package/dist/llm/zod-utils.test.cjs.map +1 -0
  371. package/dist/llm/zod-utils.test.js +455 -0
  372. package/dist/llm/zod-utils.test.js.map +1 -0
  373. package/dist/log.cjs +81 -0
  374. package/dist/log.cjs.map +1 -0
  375. package/dist/log.d.cts +20 -0
  376. package/dist/log.d.ts +20 -0
  377. package/dist/log.d.ts.map +1 -0
  378. package/dist/log.js +54 -0
  379. package/dist/log.js.map +1 -0
  380. package/dist/metrics/base.cjs +17 -0
  381. package/dist/metrics/base.cjs.map +1 -0
  382. package/dist/metrics/base.d.cts +150 -0
  383. package/dist/metrics/base.d.ts +150 -0
  384. package/dist/metrics/base.d.ts.map +1 -0
  385. package/dist/metrics/base.js +1 -0
  386. package/dist/metrics/base.js.map +1 -0
  387. package/dist/metrics/index.cjs +32 -0
  388. package/dist/metrics/index.cjs.map +1 -0
  389. package/dist/metrics/index.d.cts +4 -0
  390. package/dist/metrics/index.d.ts +4 -0
  391. package/dist/metrics/index.d.ts.map +1 -0
  392. package/dist/metrics/index.js +7 -0
  393. package/dist/metrics/index.js.map +1 -0
  394. package/dist/metrics/usage_collector.cjs +58 -0
  395. package/dist/metrics/usage_collector.cjs.map +1 -0
  396. package/dist/metrics/usage_collector.d.cts +15 -0
  397. package/dist/metrics/usage_collector.d.ts +15 -0
  398. package/dist/metrics/usage_collector.d.ts.map +1 -0
  399. package/dist/metrics/usage_collector.js +34 -0
  400. package/dist/metrics/usage_collector.js.map +1 -0
  401. package/dist/metrics/utils.cjs +74 -0
  402. package/dist/metrics/utils.cjs.map +1 -0
  403. package/dist/metrics/utils.d.cts +3 -0
  404. package/dist/metrics/utils.d.ts +3 -0
  405. package/dist/metrics/utils.d.ts.map +1 -0
  406. package/dist/metrics/utils.js +50 -0
  407. package/dist/metrics/utils.js.map +1 -0
  408. package/dist/plugin.cjs +62 -0
  409. package/dist/plugin.cjs.map +1 -0
  410. package/dist/plugin.d.cts +24 -0
  411. package/dist/plugin.d.ts +24 -0
  412. package/dist/plugin.d.ts.map +1 -0
  413. package/dist/plugin.js +37 -0
  414. package/dist/plugin.js.map +1 -0
  415. package/dist/stream/deferred_stream.cjs +106 -0
  416. package/dist/stream/deferred_stream.cjs.map +1 -0
  417. package/dist/stream/deferred_stream.d.cts +32 -0
  418. package/dist/stream/deferred_stream.d.ts +32 -0
  419. package/dist/stream/deferred_stream.d.ts.map +1 -0
  420. package/dist/stream/deferred_stream.js +81 -0
  421. package/dist/stream/deferred_stream.js.map +1 -0
  422. package/dist/stream/deferred_stream.test.cjs +527 -0
  423. package/dist/stream/deferred_stream.test.cjs.map +1 -0
  424. package/dist/stream/deferred_stream.test.js +526 -0
  425. package/dist/stream/deferred_stream.test.js.map +1 -0
  426. package/dist/stream/identity_transform.cjs +42 -0
  427. package/dist/stream/identity_transform.cjs.map +1 -0
  428. package/dist/stream/identity_transform.d.cts +6 -0
  429. package/dist/stream/identity_transform.d.ts +6 -0
  430. package/dist/stream/identity_transform.d.ts.map +1 -0
  431. package/dist/stream/identity_transform.js +18 -0
  432. package/dist/stream/identity_transform.js.map +1 -0
  433. package/dist/stream/identity_transform.test.cjs +125 -0
  434. package/dist/stream/identity_transform.test.cjs.map +1 -0
  435. package/dist/stream/identity_transform.test.js +124 -0
  436. package/dist/stream/identity_transform.test.js.map +1 -0
  437. package/dist/stream/index.cjs +38 -0
  438. package/dist/stream/index.cjs.map +1 -0
  439. package/dist/stream/index.d.cts +5 -0
  440. package/dist/stream/index.d.ts +5 -0
  441. package/dist/stream/index.d.ts.map +1 -0
  442. package/dist/stream/index.js +11 -0
  443. package/dist/stream/index.js.map +1 -0
  444. package/dist/stream/merge_readable_streams.cjs +59 -0
  445. package/dist/stream/merge_readable_streams.cjs.map +1 -0
  446. package/dist/stream/merge_readable_streams.d.cts +4 -0
  447. package/dist/stream/merge_readable_streams.d.ts +4 -0
  448. package/dist/stream/merge_readable_streams.d.ts.map +1 -0
  449. package/dist/stream/merge_readable_streams.js +35 -0
  450. package/dist/stream/merge_readable_streams.js.map +1 -0
  451. package/dist/stream/stream_channel.cjs +57 -0
  452. package/dist/stream/stream_channel.cjs.map +1 -0
  453. package/dist/stream/stream_channel.d.cts +11 -0
  454. package/dist/stream/stream_channel.d.ts +11 -0
  455. package/dist/stream/stream_channel.d.ts.map +1 -0
  456. package/dist/stream/stream_channel.js +33 -0
  457. package/dist/stream/stream_channel.js.map +1 -0
  458. package/dist/stream/stream_channel.test.cjs +124 -0
  459. package/dist/stream/stream_channel.test.cjs.map +1 -0
  460. package/dist/stream/stream_channel.test.js +123 -0
  461. package/dist/stream/stream_channel.test.js.map +1 -0
  462. package/dist/stt/index.cjs +38 -0
  463. package/dist/stt/index.cjs.map +1 -0
  464. package/dist/stt/index.d.cts +3 -0
  465. package/dist/stt/index.d.ts +3 -0
  466. package/dist/stt/index.d.ts.map +1 -0
  467. package/dist/stt/index.js +14 -0
  468. package/dist/stt/index.js.map +1 -0
  469. package/dist/stt/stream_adapter.cjs +115 -0
  470. package/dist/stt/stream_adapter.cjs.map +1 -0
  471. package/dist/stt/stream_adapter.d.cts +23 -0
  472. package/dist/stt/stream_adapter.d.ts +23 -0
  473. package/dist/stt/stream_adapter.d.ts.map +1 -0
  474. package/dist/stt/stream_adapter.js +90 -0
  475. package/dist/stt/stream_adapter.js.map +1 -0
  476. package/dist/stt/stt.cjs +253 -0
  477. package/dist/stt/stt.cjs.map +1 -0
  478. package/dist/stt/stt.d.cts +158 -0
  479. package/dist/stt/stt.d.ts +158 -0
  480. package/dist/stt/stt.d.ts.map +1 -0
  481. package/dist/stt/stt.js +227 -0
  482. package/dist/stt/stt.js.map +1 -0
  483. package/dist/telemetry/index.cjs +72 -0
  484. package/dist/telemetry/index.cjs.map +1 -0
  485. package/dist/telemetry/index.d.cts +7 -0
  486. package/dist/telemetry/index.d.ts +7 -0
  487. package/dist/telemetry/index.d.ts.map +1 -0
  488. package/dist/telemetry/index.js +37 -0
  489. package/dist/telemetry/index.js.map +1 -0
  490. package/dist/telemetry/logging.cjs +65 -0
  491. package/dist/telemetry/logging.cjs.map +1 -0
  492. package/dist/telemetry/logging.d.cts +21 -0
  493. package/dist/telemetry/logging.d.ts +21 -0
  494. package/dist/telemetry/logging.d.ts.map +1 -0
  495. package/dist/telemetry/logging.js +40 -0
  496. package/dist/telemetry/logging.js.map +1 -0
  497. package/dist/telemetry/otel_http_exporter.cjs +147 -0
  498. package/dist/telemetry/otel_http_exporter.cjs.map +1 -0
  499. package/dist/telemetry/otel_http_exporter.d.cts +62 -0
  500. package/dist/telemetry/otel_http_exporter.d.ts +62 -0
  501. package/dist/telemetry/otel_http_exporter.d.ts.map +1 -0
  502. package/dist/telemetry/otel_http_exporter.js +123 -0
  503. package/dist/telemetry/otel_http_exporter.js.map +1 -0
  504. package/dist/telemetry/pino_otel_transport.cjs +217 -0
  505. package/dist/telemetry/pino_otel_transport.cjs.map +1 -0
  506. package/dist/telemetry/pino_otel_transport.d.cts +58 -0
  507. package/dist/telemetry/pino_otel_transport.d.ts +58 -0
  508. package/dist/telemetry/pino_otel_transport.d.ts.map +1 -0
  509. package/dist/telemetry/pino_otel_transport.js +189 -0
  510. package/dist/telemetry/pino_otel_transport.js.map +1 -0
  511. package/dist/telemetry/trace_types.cjs +206 -0
  512. package/dist/telemetry/trace_types.cjs.map +1 -0
  513. package/dist/telemetry/trace_types.d.cts +61 -0
  514. package/dist/telemetry/trace_types.d.ts +61 -0
  515. package/dist/telemetry/trace_types.d.ts.map +1 -0
  516. package/dist/telemetry/trace_types.js +123 -0
  517. package/dist/telemetry/trace_types.js.map +1 -0
  518. package/dist/telemetry/traces.cjs +444 -0
  519. package/dist/telemetry/traces.cjs.map +1 -0
  520. package/dist/telemetry/traces.d.cts +114 -0
  521. package/dist/telemetry/traces.d.ts +114 -0
  522. package/dist/telemetry/traces.d.ts.map +1 -0
  523. package/dist/telemetry/traces.js +409 -0
  524. package/dist/telemetry/traces.js.map +1 -0
  525. package/dist/telemetry/utils.cjs +86 -0
  526. package/dist/telemetry/utils.cjs.map +1 -0
  527. package/dist/telemetry/utils.d.cts +5 -0
  528. package/dist/telemetry/utils.d.ts +5 -0
  529. package/dist/telemetry/utils.d.ts.map +1 -0
  530. package/dist/telemetry/utils.js +51 -0
  531. package/dist/telemetry/utils.js.map +1 -0
  532. package/dist/tokenize/basic/basic.cjs +105 -0
  533. package/dist/tokenize/basic/basic.cjs.map +1 -0
  534. package/dist/tokenize/basic/basic.d.cts +24 -0
  535. package/dist/tokenize/basic/basic.d.ts +24 -0
  536. package/dist/tokenize/basic/basic.d.ts.map +1 -0
  537. package/dist/tokenize/basic/basic.js +67 -0
  538. package/dist/tokenize/basic/basic.js.map +1 -0
  539. package/dist/tokenize/basic/hyphenator.cjs +425 -0
  540. package/dist/tokenize/basic/hyphenator.cjs.map +1 -0
  541. package/dist/tokenize/basic/hyphenator.d.cts +17 -0
  542. package/dist/tokenize/basic/hyphenator.d.ts +17 -0
  543. package/dist/tokenize/basic/hyphenator.d.ts.map +1 -0
  544. package/dist/tokenize/basic/hyphenator.js +401 -0
  545. package/dist/tokenize/basic/hyphenator.js.map +1 -0
  546. package/dist/tokenize/basic/index.cjs +37 -0
  547. package/dist/tokenize/basic/index.cjs.map +1 -0
  548. package/dist/tokenize/basic/index.d.cts +2 -0
  549. package/dist/tokenize/basic/index.d.ts +2 -0
  550. package/dist/tokenize/basic/index.d.ts.map +1 -0
  551. package/dist/tokenize/basic/index.js +15 -0
  552. package/dist/tokenize/basic/index.js.map +1 -0
  553. package/dist/tokenize/basic/paragraph.cjs +57 -0
  554. package/dist/tokenize/basic/paragraph.cjs.map +1 -0
  555. package/dist/tokenize/basic/paragraph.d.cts +5 -0
  556. package/dist/tokenize/basic/paragraph.d.ts +5 -0
  557. package/dist/tokenize/basic/paragraph.d.ts.map +1 -0
  558. package/dist/tokenize/basic/paragraph.js +33 -0
  559. package/dist/tokenize/basic/paragraph.js.map +1 -0
  560. package/dist/tokenize/basic/sentence.cjs +97 -0
  561. package/dist/tokenize/basic/sentence.cjs.map +1 -0
  562. package/dist/tokenize/basic/sentence.d.cts +5 -0
  563. package/dist/tokenize/basic/sentence.d.ts +5 -0
  564. package/dist/tokenize/basic/sentence.d.ts.map +1 -0
  565. package/dist/tokenize/basic/sentence.js +73 -0
  566. package/dist/tokenize/basic/sentence.js.map +1 -0
  567. package/dist/tokenize/basic/word.cjs +44 -0
  568. package/dist/tokenize/basic/word.cjs.map +1 -0
  569. package/dist/tokenize/basic/word.d.cts +5 -0
  570. package/dist/tokenize/basic/word.d.ts +5 -0
  571. package/dist/tokenize/basic/word.d.ts.map +1 -0
  572. package/dist/tokenize/basic/word.js +20 -0
  573. package/dist/tokenize/basic/word.js.map +1 -0
  574. package/dist/tokenize/index.cjs +55 -0
  575. package/dist/tokenize/index.cjs.map +1 -0
  576. package/dist/tokenize/index.d.cts +5 -0
  577. package/dist/tokenize/index.d.ts +5 -0
  578. package/dist/tokenize/index.d.ts.map +1 -0
  579. package/dist/tokenize/index.js +19 -0
  580. package/dist/tokenize/index.js.map +1 -0
  581. package/dist/tokenize/token_stream.cjs +168 -0
  582. package/dist/tokenize/token_stream.cjs.map +1 -0
  583. package/dist/tokenize/token_stream.d.cts +40 -0
  584. package/dist/tokenize/token_stream.d.ts +40 -0
  585. package/dist/tokenize/token_stream.d.ts.map +1 -0
  586. package/dist/tokenize/token_stream.js +142 -0
  587. package/dist/tokenize/token_stream.js.map +1 -0
  588. package/dist/tokenize/tokenizer.cjs +184 -0
  589. package/dist/tokenize/tokenizer.cjs.map +1 -0
  590. package/dist/tokenize/tokenizer.d.cts +55 -0
  591. package/dist/tokenize/tokenizer.d.ts +55 -0
  592. package/dist/tokenize/tokenizer.d.ts.map +1 -0
  593. package/dist/tokenize/tokenizer.js +156 -0
  594. package/dist/tokenize/tokenizer.js.map +1 -0
  595. package/dist/tokenize/tokenizer.test.cjs +220 -0
  596. package/dist/tokenize/tokenizer.test.cjs.map +1 -0
  597. package/dist/tokenize/tokenizer.test.js +219 -0
  598. package/dist/tokenize/tokenizer.test.js.map +1 -0
  599. package/dist/transcription.cjs +247 -0
  600. package/dist/transcription.cjs.map +1 -0
  601. package/dist/transcription.d.cts +31 -0
  602. package/dist/transcription.d.ts +31 -0
  603. package/dist/transcription.d.ts.map +1 -0
  604. package/dist/transcription.js +222 -0
  605. package/dist/transcription.js.map +1 -0
  606. package/dist/tts/index.cjs +38 -0
  607. package/dist/tts/index.cjs.map +1 -0
  608. package/dist/tts/index.d.cts +3 -0
  609. package/dist/tts/index.d.ts +3 -0
  610. package/dist/tts/index.d.ts.map +1 -0
  611. package/dist/tts/index.js +14 -0
  612. package/dist/tts/index.js.map +1 -0
  613. package/dist/tts/stream_adapter.cjs +105 -0
  614. package/dist/tts/stream_adapter.cjs.map +1 -0
  615. package/dist/tts/stream_adapter.d.cts +20 -0
  616. package/dist/tts/stream_adapter.d.ts +20 -0
  617. package/dist/tts/stream_adapter.d.ts.map +1 -0
  618. package/dist/tts/stream_adapter.js +80 -0
  619. package/dist/tts/stream_adapter.js.map +1 -0
  620. package/dist/tts/tts.cjs +431 -0
  621. package/dist/tts/tts.cjs.map +1 -0
  622. package/dist/tts/tts.d.cts +161 -0
  623. package/dist/tts/tts.d.ts +161 -0
  624. package/dist/tts/tts.d.ts.map +1 -0
  625. package/dist/tts/tts.js +405 -0
  626. package/dist/tts/tts.js.map +1 -0
  627. package/dist/types.cjs +49 -0
  628. package/dist/types.cjs.map +1 -0
  629. package/dist/types.d.cts +44 -0
  630. package/dist/types.d.ts +44 -0
  631. package/dist/types.d.ts.map +1 -0
  632. package/dist/types.js +23 -0
  633. package/dist/types.js.map +1 -0
  634. package/dist/utils/ws_transport.cjs +51 -0
  635. package/dist/utils/ws_transport.cjs.map +1 -0
  636. package/dist/utils/ws_transport.d.cts +9 -0
  637. package/dist/utils/ws_transport.d.ts +9 -0
  638. package/dist/utils/ws_transport.d.ts.map +1 -0
  639. package/dist/utils/ws_transport.js +17 -0
  640. package/dist/utils/ws_transport.js.map +1 -0
  641. package/dist/utils/ws_transport.test.cjs +212 -0
  642. package/dist/utils/ws_transport.test.cjs.map +1 -0
  643. package/dist/utils/ws_transport.test.js +211 -0
  644. package/dist/utils/ws_transport.test.js.map +1 -0
  645. package/dist/utils.cjs +669 -0
  646. package/dist/utils.cjs.map +1 -0
  647. package/dist/utils.d.cts +244 -0
  648. package/dist/utils.d.ts +244 -0
  649. package/dist/utils.d.ts.map +1 -0
  650. package/dist/utils.js +617 -0
  651. package/dist/utils.js.map +1 -0
  652. package/dist/utils.test.cjs +492 -0
  653. package/dist/utils.test.cjs.map +1 -0
  654. package/dist/utils.test.js +491 -0
  655. package/dist/utils.test.js.map +1 -0
  656. package/dist/vad.cjs +211 -0
  657. package/dist/vad.cjs.map +1 -0
  658. package/dist/vad.d.cts +105 -0
  659. package/dist/vad.d.ts +105 -0
  660. package/dist/vad.d.ts.map +1 -0
  661. package/dist/vad.js +185 -0
  662. package/dist/vad.js.map +1 -0
  663. package/dist/version.cjs +29 -0
  664. package/dist/version.cjs.map +1 -0
  665. package/dist/version.d.cts +2 -0
  666. package/dist/version.d.ts +2 -0
  667. package/dist/version.d.ts.map +1 -0
  668. package/dist/version.js +5 -0
  669. package/dist/version.js.map +1 -0
  670. package/dist/voice/agent.cjs +308 -0
  671. package/dist/voice/agent.cjs.map +1 -0
  672. package/dist/voice/agent.d.cts +83 -0
  673. package/dist/voice/agent.d.ts +83 -0
  674. package/dist/voice/agent.d.ts.map +1 -0
  675. package/dist/voice/agent.js +287 -0
  676. package/dist/voice/agent.js.map +1 -0
  677. package/dist/voice/agent.test.cjs +61 -0
  678. package/dist/voice/agent.test.cjs.map +1 -0
  679. package/dist/voice/agent.test.js +60 -0
  680. package/dist/voice/agent.test.js.map +1 -0
  681. package/dist/voice/agent_activity.cjs +1784 -0
  682. package/dist/voice/agent_activity.cjs.map +1 -0
  683. package/dist/voice/agent_activity.d.cts +116 -0
  684. package/dist/voice/agent_activity.d.ts +116 -0
  685. package/dist/voice/agent_activity.d.ts.map +1 -0
  686. package/dist/voice/agent_activity.js +1780 -0
  687. package/dist/voice/agent_activity.js.map +1 -0
  688. package/dist/voice/agent_session.cjs +592 -0
  689. package/dist/voice/agent_session.cjs.map +1 -0
  690. package/dist/voice/agent_session.d.cts +165 -0
  691. package/dist/voice/agent_session.d.ts +165 -0
  692. package/dist/voice/agent_session.d.ts.map +1 -0
  693. package/dist/voice/agent_session.js +582 -0
  694. package/dist/voice/agent_session.js.map +1 -0
  695. package/dist/voice/audio_recognition.cjs +668 -0
  696. package/dist/voice/audio_recognition.cjs.map +1 -0
  697. package/dist/voice/audio_recognition.d.cts +127 -0
  698. package/dist/voice/audio_recognition.d.ts +127 -0
  699. package/dist/voice/audio_recognition.d.ts.map +1 -0
  700. package/dist/voice/audio_recognition.js +647 -0
  701. package/dist/voice/audio_recognition.js.map +1 -0
  702. package/dist/voice/avatar/datastream_io.cjs +204 -0
  703. package/dist/voice/avatar/datastream_io.cjs.map +1 -0
  704. package/dist/voice/avatar/datastream_io.d.cts +37 -0
  705. package/dist/voice/avatar/datastream_io.d.ts +37 -0
  706. package/dist/voice/avatar/datastream_io.d.ts.map +1 -0
  707. package/dist/voice/avatar/datastream_io.js +188 -0
  708. package/dist/voice/avatar/datastream_io.js.map +1 -0
  709. package/dist/voice/avatar/index.cjs +23 -0
  710. package/dist/voice/avatar/index.cjs.map +1 -0
  711. package/dist/voice/avatar/index.d.cts +2 -0
  712. package/dist/voice/avatar/index.d.ts +2 -0
  713. package/dist/voice/avatar/index.d.ts.map +1 -0
  714. package/dist/voice/avatar/index.js +2 -0
  715. package/dist/voice/avatar/index.js.map +1 -0
  716. package/dist/voice/background_audio.cjs +366 -0
  717. package/dist/voice/background_audio.cjs.map +1 -0
  718. package/dist/voice/background_audio.d.cts +121 -0
  719. package/dist/voice/background_audio.d.ts +121 -0
  720. package/dist/voice/background_audio.d.ts.map +1 -0
  721. package/dist/voice/background_audio.js +342 -0
  722. package/dist/voice/background_audio.js.map +1 -0
  723. package/dist/voice/events.cjs +147 -0
  724. package/dist/voice/events.cjs.map +1 -0
  725. package/dist/voice/events.d.cts +127 -0
  726. package/dist/voice/events.d.ts +127 -0
  727. package/dist/voice/events.d.ts.map +1 -0
  728. package/dist/voice/events.js +112 -0
  729. package/dist/voice/events.js.map +1 -0
  730. package/dist/voice/generation.cjs +747 -0
  731. package/dist/voice/generation.cjs.map +1 -0
  732. package/dist/voice/generation.d.cts +116 -0
  733. package/dist/voice/generation.d.ts +116 -0
  734. package/dist/voice/generation.d.ts.map +1 -0
  735. package/dist/voice/generation.js +719 -0
  736. package/dist/voice/generation.js.map +1 -0
  737. package/dist/voice/generation_tools.test.cjs +236 -0
  738. package/dist/voice/generation_tools.test.cjs.map +1 -0
  739. package/dist/voice/generation_tools.test.js +235 -0
  740. package/dist/voice/generation_tools.test.js.map +1 -0
  741. package/dist/voice/index.cjs +49 -0
  742. package/dist/voice/index.cjs.map +1 -0
  743. package/dist/voice/index.d.cts +10 -0
  744. package/dist/voice/index.d.ts +10 -0
  745. package/dist/voice/index.d.ts.map +1 -0
  746. package/dist/voice/index.js +16 -0
  747. package/dist/voice/index.js.map +1 -0
  748. package/dist/voice/interruption_detection.test.cjs +114 -0
  749. package/dist/voice/interruption_detection.test.cjs.map +1 -0
  750. package/dist/voice/interruption_detection.test.js +113 -0
  751. package/dist/voice/interruption_detection.test.js.map +1 -0
  752. package/dist/voice/io.cjs +270 -0
  753. package/dist/voice/io.cjs.map +1 -0
  754. package/dist/voice/io.d.cts +126 -0
  755. package/dist/voice/io.d.ts +126 -0
  756. package/dist/voice/io.d.ts.map +1 -0
  757. package/dist/voice/io.js +242 -0
  758. package/dist/voice/io.js.map +1 -0
  759. package/dist/voice/recorder_io/index.cjs +23 -0
  760. package/dist/voice/recorder_io/index.cjs.map +1 -0
  761. package/dist/voice/recorder_io/index.d.cts +2 -0
  762. package/dist/voice/recorder_io/index.d.ts +2 -0
  763. package/dist/voice/recorder_io/index.d.ts.map +1 -0
  764. package/dist/voice/recorder_io/index.js +2 -0
  765. package/dist/voice/recorder_io/index.js.map +1 -0
  766. package/dist/voice/recorder_io/recorder_io.cjs +542 -0
  767. package/dist/voice/recorder_io/recorder_io.cjs.map +1 -0
  768. package/dist/voice/recorder_io/recorder_io.d.cts +100 -0
  769. package/dist/voice/recorder_io/recorder_io.d.ts +100 -0
  770. package/dist/voice/recorder_io/recorder_io.d.ts.map +1 -0
  771. package/dist/voice/recorder_io/recorder_io.js +508 -0
  772. package/dist/voice/recorder_io/recorder_io.js.map +1 -0
  773. package/dist/voice/report.cjs +75 -0
  774. package/dist/voice/report.cjs.map +1 -0
  775. package/dist/voice/report.d.cts +42 -0
  776. package/dist/voice/report.d.ts +42 -0
  777. package/dist/voice/report.d.ts.map +1 -0
  778. package/dist/voice/report.js +50 -0
  779. package/dist/voice/report.js.map +1 -0
  780. package/dist/voice/room_io/_input.cjs +133 -0
  781. package/dist/voice/room_io/_input.cjs.map +1 -0
  782. package/dist/voice/room_io/_input.d.cts +24 -0
  783. package/dist/voice/room_io/_input.d.ts +24 -0
  784. package/dist/voice/room_io/_input.d.ts.map +1 -0
  785. package/dist/voice/room_io/_input.js +114 -0
  786. package/dist/voice/room_io/_input.js.map +1 -0
  787. package/dist/voice/room_io/_output.cjs +359 -0
  788. package/dist/voice/room_io/_output.cjs.map +1 -0
  789. package/dist/voice/room_io/_output.d.cts +77 -0
  790. package/dist/voice/room_io/_output.d.ts +77 -0
  791. package/dist/voice/room_io/_output.d.ts.map +1 -0
  792. package/dist/voice/room_io/_output.js +343 -0
  793. package/dist/voice/room_io/_output.js.map +1 -0
  794. package/dist/voice/room_io/index.cjs +25 -0
  795. package/dist/voice/room_io/index.cjs.map +1 -0
  796. package/dist/voice/room_io/index.d.cts +3 -0
  797. package/dist/voice/room_io/index.d.ts +3 -0
  798. package/dist/voice/room_io/index.d.ts.map +1 -0
  799. package/dist/voice/room_io/index.js +3 -0
  800. package/dist/voice/room_io/index.js.map +1 -0
  801. package/dist/voice/room_io/room_io.cjs +373 -0
  802. package/dist/voice/room_io/room_io.cjs.map +1 -0
  803. package/dist/voice/room_io/room_io.d.cts +94 -0
  804. package/dist/voice/room_io/room_io.d.ts +94 -0
  805. package/dist/voice/room_io/room_io.d.ts.map +1 -0
  806. package/dist/voice/room_io/room_io.js +364 -0
  807. package/dist/voice/room_io/room_io.js.map +1 -0
  808. package/dist/voice/run_context.cjs +51 -0
  809. package/dist/voice/run_context.cjs.map +1 -0
  810. package/dist/voice/run_context.d.cts +22 -0
  811. package/dist/voice/run_context.d.ts +22 -0
  812. package/dist/voice/run_context.d.ts.map +1 -0
  813. package/dist/voice/run_context.js +27 -0
  814. package/dist/voice/run_context.js.map +1 -0
  815. package/dist/voice/speech_handle.cjs +228 -0
  816. package/dist/voice/speech_handle.cjs.map +1 -0
  817. package/dist/voice/speech_handle.d.cts +97 -0
  818. package/dist/voice/speech_handle.d.ts +97 -0
  819. package/dist/voice/speech_handle.d.ts.map +1 -0
  820. package/dist/voice/speech_handle.js +204 -0
  821. package/dist/voice/speech_handle.js.map +1 -0
  822. package/dist/voice/transcription/_utils.cjs +45 -0
  823. package/dist/voice/transcription/_utils.cjs.map +1 -0
  824. package/dist/voice/transcription/_utils.d.cts +3 -0
  825. package/dist/voice/transcription/_utils.d.ts +3 -0
  826. package/dist/voice/transcription/_utils.d.ts.map +1 -0
  827. package/dist/voice/transcription/_utils.js +21 -0
  828. package/dist/voice/transcription/_utils.js.map +1 -0
  829. package/dist/voice/transcription/index.cjs +23 -0
  830. package/dist/voice/transcription/index.cjs.map +1 -0
  831. package/dist/voice/transcription/index.d.cts +2 -0
  832. package/dist/voice/transcription/index.d.ts +2 -0
  833. package/dist/voice/transcription/index.d.ts.map +1 -0
  834. package/dist/voice/transcription/index.js +2 -0
  835. package/dist/voice/transcription/index.js.map +1 -0
  836. package/dist/voice/transcription/synchronizer.cjs +379 -0
  837. package/dist/voice/transcription/synchronizer.cjs.map +1 -0
  838. package/dist/voice/transcription/synchronizer.d.cts +87 -0
  839. package/dist/voice/transcription/synchronizer.d.ts +87 -0
  840. package/dist/voice/transcription/synchronizer.d.ts.map +1 -0
  841. package/dist/voice/transcription/synchronizer.js +354 -0
  842. package/dist/voice/transcription/synchronizer.js.map +1 -0
  843. package/dist/worker.cjs +680 -0
  844. package/dist/worker.cjs.map +1 -0
  845. package/dist/worker.d.cts +119 -0
  846. package/dist/worker.d.ts +119 -0
  847. package/dist/worker.d.ts.map +1 -0
  848. package/dist/worker.js +645 -0
  849. package/dist/worker.js.map +1 -0
  850. package/package.json +86 -0
  851. package/resources/NOTICE +2 -0
  852. package/resources/keyboard-typing.ogg +0 -0
  853. package/resources/keyboard-typing2.ogg +0 -0
  854. package/resources/office-ambience.ogg +0 -0
  855. package/src/_exceptions.ts +137 -0
  856. package/src/audio.ts +205 -0
  857. package/src/cli.ts +224 -0
  858. package/src/connection_pool.test.ts +346 -0
  859. package/src/connection_pool.ts +307 -0
  860. package/src/constants.ts +9 -0
  861. package/src/generator.ts +38 -0
  862. package/src/http_server.ts +64 -0
  863. package/src/index.ts +41 -0
  864. package/src/inference/api_protos.ts +82 -0
  865. package/src/inference/index.ts +32 -0
  866. package/src/inference/interruption/AdaptiveInterruptionDetector.ts +166 -0
  867. package/src/inference/interruption/InterruptionStream.ts +397 -0
  868. package/src/inference/interruption/defaults.ts +33 -0
  869. package/src/inference/interruption/errors.ts +0 -0
  870. package/src/inference/interruption/http_transport.ts +61 -0
  871. package/src/inference/interruption/index.ts +4 -0
  872. package/src/inference/interruption/interruption.ts +88 -0
  873. package/src/inference/llm.ts +532 -0
  874. package/src/inference/stt.ts +524 -0
  875. package/src/inference/tts.ts +574 -0
  876. package/src/inference/utils.test.ts +31 -0
  877. package/src/inference/utils.ts +81 -0
  878. package/src/inference_runner.ts +19 -0
  879. package/src/ipc/index.ts +5 -0
  880. package/src/ipc/inference_executor.ts +7 -0
  881. package/src/ipc/inference_proc_executor.ts +101 -0
  882. package/src/ipc/inference_proc_lazy_main.ts +115 -0
  883. package/src/ipc/job_executor.ts +23 -0
  884. package/src/ipc/job_proc_executor.ts +122 -0
  885. package/src/ipc/job_proc_lazy_main.ts +247 -0
  886. package/src/ipc/message.ts +52 -0
  887. package/src/ipc/proc_pool.ts +164 -0
  888. package/src/ipc/supervised_proc.test.ts +153 -0
  889. package/src/ipc/supervised_proc.ts +242 -0
  890. package/src/job.ts +461 -0
  891. package/src/llm/__snapshots__/chat_context.test.ts.snap +527 -0
  892. package/src/llm/__snapshots__/tool_context.test.ts.snap +177 -0
  893. package/src/llm/__snapshots__/zod-utils.test.ts.snap +559 -0
  894. package/src/llm/chat_context.test.ts +1057 -0
  895. package/src/llm/chat_context.ts +759 -0
  896. package/src/llm/fallback_adapter.test.ts +238 -0
  897. package/src/llm/fallback_adapter.ts +391 -0
  898. package/src/llm/index.ts +74 -0
  899. package/src/llm/llm.ts +303 -0
  900. package/src/llm/provider_format/google.test.ts +843 -0
  901. package/src/llm/provider_format/google.ts +134 -0
  902. package/src/llm/provider_format/index.ts +23 -0
  903. package/src/llm/provider_format/openai.test.ts +675 -0
  904. package/src/llm/provider_format/openai.ts +146 -0
  905. package/src/llm/provider_format/utils.ts +187 -0
  906. package/src/llm/realtime.ts +163 -0
  907. package/src/llm/remote_chat_context.test.ts +290 -0
  908. package/src/llm/remote_chat_context.ts +114 -0
  909. package/src/llm/tool_context.test.ts +407 -0
  910. package/src/llm/tool_context.ts +343 -0
  911. package/src/llm/tool_context.type.test.ts +115 -0
  912. package/src/llm/utils.test.ts +670 -0
  913. package/src/llm/utils.ts +336 -0
  914. package/src/llm/zod-utils.test.ts +577 -0
  915. package/src/llm/zod-utils.ts +153 -0
  916. package/src/log.ts +83 -0
  917. package/src/metrics/base.ts +168 -0
  918. package/src/metrics/index.ts +15 -0
  919. package/src/metrics/usage_collector.ts +46 -0
  920. package/src/metrics/utils.ts +64 -0
  921. package/src/plugin.ts +46 -0
  922. package/src/stream/deferred_stream.test.ts +755 -0
  923. package/src/stream/deferred_stream.ts +127 -0
  924. package/src/stream/identity_transform.test.ts +179 -0
  925. package/src/stream/identity_transform.ts +18 -0
  926. package/src/stream/index.ts +7 -0
  927. package/src/stream/merge_readable_streams.ts +40 -0
  928. package/src/stream/stream_channel.test.ts +166 -0
  929. package/src/stream/stream_channel.ts +44 -0
  930. package/src/stt/index.ts +15 -0
  931. package/src/stt/stream_adapter.ts +107 -0
  932. package/src/stt/stt.ts +374 -0
  933. package/src/telemetry/index.ts +28 -0
  934. package/src/telemetry/logging.ts +55 -0
  935. package/src/telemetry/otel_http_exporter.ts +195 -0
  936. package/src/telemetry/pino_otel_transport.ts +265 -0
  937. package/src/telemetry/trace_types.ts +95 -0
  938. package/src/telemetry/traces.ts +612 -0
  939. package/src/telemetry/utils.ts +61 -0
  940. package/src/tokenize/basic/basic.ts +83 -0
  941. package/src/tokenize/basic/hyphenator.ts +434 -0
  942. package/src/tokenize/basic/index.ts +11 -0
  943. package/src/tokenize/basic/paragraph.ts +43 -0
  944. package/src/tokenize/basic/sentence.ts +89 -0
  945. package/src/tokenize/basic/word.ts +27 -0
  946. package/src/tokenize/index.ts +16 -0
  947. package/src/tokenize/token_stream.ts +180 -0
  948. package/src/tokenize/tokenizer.test.ts +255 -0
  949. package/src/tokenize/tokenizer.ts +152 -0
  950. package/src/transcription.ts +307 -0
  951. package/src/tts/index.ts +12 -0
  952. package/src/tts/stream_adapter.ts +110 -0
  953. package/src/tts/tts.ts +598 -0
  954. package/src/types.ts +66 -0
  955. package/src/utils/ws_transport.test.ts +282 -0
  956. package/src/utils/ws_transport.ts +22 -0
  957. package/src/utils.test.ts +651 -0
  958. package/src/utils.ts +871 -0
  959. package/src/vad.ts +262 -0
  960. package/src/version.ts +5 -0
  961. package/src/voice/agent.test.ts +80 -0
  962. package/src/voice/agent.ts +418 -0
  963. package/src/voice/agent_activity.ts +2375 -0
  964. package/src/voice/agent_session.ts +866 -0
  965. package/src/voice/audio_recognition.ts +877 -0
  966. package/src/voice/avatar/datastream_io.ts +247 -0
  967. package/src/voice/avatar/index.ts +4 -0
  968. package/src/voice/background_audio.ts +491 -0
  969. package/src/voice/events.ts +261 -0
  970. package/src/voice/generation.ts +946 -0
  971. package/src/voice/generation_tools.test.ts +268 -0
  972. package/src/voice/index.ts +12 -0
  973. package/src/voice/interruption_detection.test.ts +151 -0
  974. package/src/voice/io.ts +347 -0
  975. package/src/voice/recorder_io/index.ts +4 -0
  976. package/src/voice/recorder_io/recorder_io.ts +690 -0
  977. package/src/voice/report.ts +100 -0
  978. package/src/voice/room_io/_input.ts +162 -0
  979. package/src/voice/room_io/_output.ts +439 -0
  980. package/src/voice/room_io/index.ts +5 -0
  981. package/src/voice/room_io/room_io.ts +518 -0
  982. package/src/voice/run_context.ts +34 -0
  983. package/src/voice/speech_handle.ts +250 -0
  984. package/src/voice/transcription/_utils.ts +25 -0
  985. package/src/voice/transcription/index.ts +4 -0
  986. package/src/voice/transcription/synchronizer.ts +477 -0
  987. package/src/worker.ts +798 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/voice/audio_recognition.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2025 LiveKit, Inc.\n//\n// SPDX-License-Identifier: Apache-2.0\nimport { AudioFrame } from '@livekit/rtc-node';\nimport type { Context, Span } from '@opentelemetry/api';\nimport type { WritableStreamDefaultWriter } from 'node:stream/web';\nimport { ReadableStream } from 'node:stream/web';\nimport type { AdaptiveInterruptionDetector } from '../inference/interruption/AdaptiveInterruptionDetector.js';\nimport {\n InterruptionStreamBase,\n InterruptionStreamSentinel,\n} from '../inference/interruption/InterruptionStream.js';\nimport type { InterruptionEvent } from '../inference/interruption/interruption.js';\nimport { type ChatContext } from '../llm/chat_context.js';\nimport { log } from '../log.js';\nimport { DeferredReadableStream, isStreamReaderReleaseError } from '../stream/deferred_stream.js';\nimport { IdentityTransform } from '../stream/identity_transform.js';\nimport { mergeReadableStreams } from '../stream/merge_readable_streams.js';\nimport { type SpeechEvent, SpeechEventType } from '../stt/stt.js';\nimport { traceTypes, tracer } from '../telemetry/index.js';\nimport { Task, delay } from '../utils.js';\nimport { type VAD, type VADEvent, VADEventType } from '../vad.js';\nimport type { TurnDetectionMode } from './agent_session.js';\nimport type { STTNode } from './io.js';\n\nexport interface EndOfTurnInfo {\n newTranscript: string;\n transcriptConfidence: number;\n transcriptionDelay: number;\n endOfUtteranceDelay: number;\n startedSpeakingAt: number | undefined;\n stoppedSpeakingAt: number | undefined;\n}\n\nexport interface PreemptiveGenerationInfo {\n newTranscript: string;\n transcriptConfidence: number;\n}\n\nexport interface RecognitionHooks {\n onStartOfSpeech: (ev: VADEvent) => void;\n onVADInferenceDone: (ev: VADEvent) => void;\n onEndOfSpeech: (ev: VADEvent) => void;\n onInterimTranscript: (ev: SpeechEvent) => void;\n onFinalTranscript: (ev: SpeechEvent) => void;\n onEndOfTurn: (info: EndOfTurnInfo) => Promise<boolean>;\n onPreemptiveGeneration: (info: PreemptiveGenerationInfo) => void;\n onInterruption: (ev: InterruptionEvent) => void;\n\n retrieveChatCtx: () => ChatContext;\n}\n\nexport interface _TurnDetector {\n unlikelyThreshold: (language?: string) => Promise<number | undefined>;\n supportsLanguage: (language?: string) => Promise<boolean>;\n predictEndOfTurn(chatCtx: ChatContext): Promise<number>;\n}\n\nexport interface AudioRecognitionOptions {\n recognitionHooks: RecognitionHooks;\n stt?: STTNode;\n vad?: VAD;\n interruptionDetector?: AdaptiveInterruptionDetector;\n turnDetector?: _TurnDetector;\n turnDetectionMode?: Exclude<TurnDetectionMode, _TurnDetector>;\n minEndpointingDelay: number;\n maxEndpointingDelay: number;\n rootSpanContext?: Context;\n}\n\nexport class AudioRecognition {\n private hooks: RecognitionHooks;\n private stt?: STTNode;\n private vad?: VAD;\n private turnDetector?: _TurnDetector;\n private turnDetectionMode?: Exclude<TurnDetectionMode, _TurnDetector>;\n private minEndpointingDelay: number;\n private maxEndpointingDelay: number;\n private lastLanguage?: string;\n private rootSpanContext?: Context;\n\n private deferredInputStream: DeferredReadableStream<AudioFrame>;\n private logger = log();\n private lastFinalTranscriptTime = 0;\n private audioTranscript = '';\n private audioInterimTranscript = '';\n private audioPreflightTranscript = '';\n private finalTranscriptConfidence: number[] = [];\n private lastSpeakingTime: number | undefined;\n private speechStartTime: number | undefined;\n private userTurnCommitted = false;\n private speaking = false;\n private sampleRate?: number;\n\n private userTurnSpan?: Span;\n\n private vadInputStream: ReadableStream<AudioFrame>;\n private sttInputStream: ReadableStream<AudioFrame>;\n private interruptionInputStream: ReadableStream<AudioFrame>;\n private silenceAudioTransform = new IdentityTransform<AudioFrame>();\n private silenceAudioWriter: WritableStreamDefaultWriter<AudioFrame>;\n\n // all cancellable tasks\n private bounceEOUTask?: Task<void>;\n private commitUserTurnTask?: Task<void>;\n private vadTask?: Task<void>;\n private sttTask?: Task<void>;\n private interruptionTask?: Task<void>;\n\n // interruption detection\n private interruptionDetector?: AdaptiveInterruptionDetector;\n private interruptionStream?: InterruptionStreamBase;\n private interruptionEnabled = false;\n private agentSpeaking = false;\n\n constructor(opts: AudioRecognitionOptions) {\n this.hooks = opts.recognitionHooks;\n this.stt = opts.stt;\n this.vad = opts.vad;\n this.interruptionDetector = opts.interruptionDetector;\n this.turnDetector = opts.turnDetector;\n this.turnDetectionMode = opts.turnDetectionMode;\n this.minEndpointingDelay = opts.minEndpointingDelay;\n this.maxEndpointingDelay = opts.maxEndpointingDelay;\n this.lastLanguage = undefined;\n this.rootSpanContext = opts.rootSpanContext;\n\n // Interruption detection is only enabled if both detector and VAD are provided\n this.interruptionEnabled = this.interruptionDetector !== undefined && this.vad !== undefined;\n\n this.deferredInputStream = new DeferredReadableStream<AudioFrame>();\n const [vadInputStream, rest] = this.deferredInputStream.stream.tee();\n const [sttInputStream, interruptionInputStream] = rest.tee();\n this.vadInputStream = vadInputStream;\n this.sttInputStream = mergeReadableStreams(sttInputStream, this.silenceAudioTransform.readable);\n this.interruptionInputStream = interruptionInputStream;\n this.silenceAudioWriter = this.silenceAudioTransform.writable.getWriter();\n }\n\n /**\n * Current transcript of the user's speech, including interim transcript if available.\n */\n get currentTranscript(): string {\n if (this.audioInterimTranscript) {\n return `${this.audioTranscript} ${this.audioInterimTranscript}`.trim();\n }\n return this.audioTranscript;\n }\n\n async start() {\n this.vadTask = Task.from(({ signal }) => this.createVadTask(this.vad, signal));\n this.vadTask.result.catch((err) => {\n this.logger.error(`Error running VAD task: ${err}`);\n });\n\n this.sttTask = Task.from(({ signal }) => this.createSttTask(this.stt, signal));\n this.sttTask.result.catch((err) => {\n this.logger.error(`Error running STT task: ${err}`);\n });\n\n if (this.interruptionEnabled && this.interruptionDetector) {\n this.interruptionTask = Task.from(({ signal }) =>\n this.createInterruptionTask(this.interruptionDetector!, signal),\n );\n this.interruptionTask.result.catch((err) => {\n this.logger.error(`Error running interruption task: ${err}`);\n });\n }\n }\n\n private async onSTTEvent(ev: SpeechEvent) {\n if (\n this.turnDetectionMode === 'manual' &&\n this.userTurnCommitted &&\n (this.bounceEOUTask === undefined ||\n this.bounceEOUTask.done ||\n ev.type == SpeechEventType.INTERIM_TRANSCRIPT)\n ) {\n // ignore stt event if user turn already committed and EOU task is done\n // or it's an interim transcript\n this.logger.debug(\n {\n userTurnCommitted: this.userTurnCommitted,\n eouTaskDone: this.bounceEOUTask?.done,\n evType: ev.type,\n turnDetectionMode: this.turnDetectionMode,\n },\n 'ignoring stt event',\n );\n return;\n }\n\n switch (ev.type) {\n case SpeechEventType.FINAL_TRANSCRIPT:\n this.hooks.onFinalTranscript(ev);\n const transcript = ev.alternatives?.[0]?.text;\n const confidence = ev.alternatives?.[0]?.confidence ?? 0;\n this.lastLanguage = ev.alternatives?.[0]?.language;\n\n if (!transcript) {\n // stt final transcript received but no transcript\n return;\n }\n\n this.logger.debug(\n {\n user_transcript: transcript,\n language: this.lastLanguage,\n },\n 'received user transcript',\n );\n\n this.lastFinalTranscriptTime = Date.now();\n this.audioTranscript += ` ${transcript}`;\n this.audioTranscript = this.audioTranscript.trimStart();\n this.finalTranscriptConfidence.push(confidence);\n const transcriptChanged = this.audioTranscript !== this.audioPreflightTranscript;\n this.audioInterimTranscript = '';\n this.audioPreflightTranscript = '';\n\n if (!this.vad || this.lastSpeakingTime === undefined) {\n // vad disabled, use stt timestamp\n // TODO: this would screw up transcription latency metrics\n // but we'll live with it for now.\n // the correct way is to ensure STT fires SpeechEventType.END_OF_SPEECH\n // and using that timestamp for lastSpeakingTime\n this.lastSpeakingTime = Date.now();\n }\n\n if (this.vadBaseTurnDetection || this.userTurnCommitted) {\n if (transcriptChanged) {\n this.logger.debug(\n { transcript: this.audioTranscript },\n 'triggering preemptive generation (FINAL_TRANSCRIPT)',\n );\n this.hooks.onPreemptiveGeneration({\n newTranscript: this.audioTranscript,\n transcriptConfidence:\n this.finalTranscriptConfidence.length > 0\n ? this.finalTranscriptConfidence.reduce((a, b) => a + b, 0) /\n this.finalTranscriptConfidence.length\n : 0,\n });\n }\n\n if (!this.speaking) {\n const chatCtx = this.hooks.retrieveChatCtx();\n this.logger.debug('running EOU detection on stt FINAL_TRANSCRIPT');\n this.runEOUDetection(chatCtx);\n }\n }\n break;\n case SpeechEventType.PREFLIGHT_TRANSCRIPT:\n this.hooks.onInterimTranscript(ev);\n const preflightTranscript = ev.alternatives?.[0]?.text ?? '';\n const preflightConfidence = ev.alternatives?.[0]?.confidence ?? 0;\n const preflightLanguage = ev.alternatives?.[0]?.language;\n\n const MIN_LANGUAGE_DETECTION_LENGTH = 5;\n if (\n !this.lastLanguage ||\n (preflightLanguage && preflightTranscript.length > MIN_LANGUAGE_DETECTION_LENGTH)\n ) {\n this.lastLanguage = preflightLanguage;\n }\n\n if (!preflightTranscript) {\n return;\n }\n\n this.logger.debug(\n {\n user_transcript: preflightTranscript,\n language: this.lastLanguage,\n },\n 'received user preflight transcript',\n );\n\n // still need to increment it as it's used for turn detection,\n this.lastFinalTranscriptTime = Date.now();\n // preflight transcript includes all pre-committed transcripts (including final transcript from the previous STT run)\n this.audioPreflightTranscript =\n `${this.audioTranscript} ${preflightTranscript}`.trimStart();\n this.audioInterimTranscript = preflightTranscript;\n\n if (!this.vad || this.lastSpeakingTime === undefined) {\n // vad disabled, use stt timestamp\n this.lastSpeakingTime = Date.now();\n }\n\n if (this.turnDetectionMode !== 'manual' || this.userTurnCommitted) {\n const confidenceVals = [...this.finalTranscriptConfidence, preflightConfidence];\n this.logger.debug(\n {\n transcript:\n this.audioPreflightTranscript.length > 100\n ? this.audioPreflightTranscript.slice(0, 100) + '...'\n : this.audioPreflightTranscript,\n },\n 'triggering preemptive generation (PREFLIGHT_TRANSCRIPT)',\n );\n this.hooks.onPreemptiveGeneration({\n newTranscript: this.audioPreflightTranscript,\n transcriptConfidence:\n confidenceVals.length > 0\n ? confidenceVals.reduce((a, b) => a + b, 0) / confidenceVals.length\n : 0,\n });\n }\n break;\n case SpeechEventType.INTERIM_TRANSCRIPT:\n this.logger.debug({ transcript: ev.alternatives?.[0]?.text }, 'interim transcript');\n this.hooks.onInterimTranscript(ev);\n this.audioInterimTranscript = ev.alternatives?.[0]?.text ?? '';\n break;\n case SpeechEventType.START_OF_SPEECH:\n if (this.turnDetectionMode !== 'stt') break;\n this.hooks.onStartOfSpeech({\n type: VADEventType.START_OF_SPEECH,\n samplesIndex: 0,\n timestamp: Date.now(),\n speechDuration: 0,\n silenceDuration: 0,\n frames: [],\n probability: 0,\n inferenceDuration: 0,\n speaking: true,\n rawAccumulatedSilence: 0,\n rawAccumulatedSpeech: 0,\n });\n this.speaking = true;\n this.lastSpeakingTime = Date.now();\n\n this.bounceEOUTask?.cancel();\n break;\n case SpeechEventType.END_OF_SPEECH:\n if (this.turnDetectionMode !== 'stt') break;\n this.hooks.onEndOfSpeech({\n type: VADEventType.END_OF_SPEECH,\n samplesIndex: 0,\n timestamp: Date.now(),\n speechDuration: 0,\n silenceDuration: 0,\n frames: [],\n probability: 0,\n inferenceDuration: 0,\n speaking: false,\n rawAccumulatedSilence: 0,\n rawAccumulatedSpeech: 0,\n });\n this.speaking = false;\n this.userTurnCommitted = true;\n this.lastSpeakingTime = Date.now();\n\n if (!this.speaking) {\n const chatCtx = this.hooks.retrieveChatCtx();\n this.logger.debug('running EOU detection on stt END_OF_SPEECH');\n this.runEOUDetection(chatCtx);\n }\n }\n }\n\n private runEOUDetection(chatCtx: ChatContext) {\n this.logger.debug(\n {\n stt: this.stt,\n audioTranscript: this.audioTranscript,\n turnDetectionMode: this.turnDetectionMode,\n },\n 'running EOU detection',\n );\n\n if (this.stt && !this.audioTranscript && this.turnDetectionMode !== 'manual') {\n // stt enabled but no transcript yet\n this.logger.debug('skipping EOU detection');\n return;\n }\n\n chatCtx = chatCtx.copy();\n chatCtx.addMessage({ role: 'user', content: this.audioTranscript });\n\n const turnDetector =\n // disable EOU model if manual turn detection enabled\n this.audioTranscript && this.turnDetectionMode !== 'manual' ? this.turnDetector : undefined;\n\n const bounceEOUTask =\n (\n lastSpeakingTime: number | undefined,\n lastFinalTranscriptTime: number,\n speechStartTime: number | undefined,\n ) =>\n async (controller: AbortController) => {\n let endpointingDelay = this.minEndpointingDelay;\n\n if (turnDetector) {\n await tracer.startActiveSpan(\n async (span) => {\n this.logger.debug('Running turn detector model');\n\n let endOfTurnProbability = 0.0;\n let unlikelyThreshold: number | undefined;\n\n if (!(await turnDetector.supportsLanguage(this.lastLanguage))) {\n this.logger.debug(`Turn detector does not support language ${this.lastLanguage}`);\n } else {\n try {\n endOfTurnProbability = await turnDetector.predictEndOfTurn(chatCtx);\n unlikelyThreshold = await turnDetector.unlikelyThreshold(this.lastLanguage);\n\n this.logger.debug(\n { endOfTurnProbability, unlikelyThreshold, language: this.lastLanguage },\n 'end of turn probability',\n );\n\n if (unlikelyThreshold && endOfTurnProbability < unlikelyThreshold) {\n endpointingDelay = this.maxEndpointingDelay;\n }\n } catch (error) {\n this.logger.error(error, 'Error predicting end of turn');\n }\n }\n\n span.setAttribute(\n traceTypes.ATTR_CHAT_CTX,\n JSON.stringify(chatCtx.toJSON({ excludeTimestamp: false })),\n );\n span.setAttribute(traceTypes.ATTR_EOU_PROBABILITY, endOfTurnProbability);\n span.setAttribute(traceTypes.ATTR_EOU_UNLIKELY_THRESHOLD, unlikelyThreshold ?? 0);\n span.setAttribute(traceTypes.ATTR_EOU_DELAY, endpointingDelay);\n span.setAttribute(traceTypes.ATTR_EOU_LANGUAGE, this.lastLanguage ?? '');\n },\n {\n name: 'eou_detection',\n context: this.rootSpanContext,\n },\n );\n }\n\n let extraSleep = endpointingDelay;\n if (lastSpeakingTime !== undefined) {\n extraSleep += lastSpeakingTime - Date.now();\n }\n\n if (extraSleep > 0) {\n // add delay to see if there's a potential upcoming EOU task that cancels this one\n await delay(Math.max(extraSleep, 0), { signal: controller.signal });\n }\n\n this.logger.debug({ transcript: this.audioTranscript }, 'end of user turn');\n\n const confidenceAvg =\n this.finalTranscriptConfidence.length > 0\n ? this.finalTranscriptConfidence.reduce((a, b) => a + b, 0) /\n this.finalTranscriptConfidence.length\n : 0;\n\n let startedSpeakingAt: number | undefined;\n let stoppedSpeakingAt: number | undefined;\n let transcriptionDelay: number | undefined;\n let endOfUtteranceDelay: number | undefined;\n\n // sometimes, we can't calculate the metrics because VAD was unreliable.\n // in this case, we just ignore the calculation, it's better than providing likely wrong values\n if (\n lastFinalTranscriptTime !== 0 &&\n lastSpeakingTime !== undefined &&\n speechStartTime !== undefined\n ) {\n startedSpeakingAt = speechStartTime;\n stoppedSpeakingAt = lastSpeakingTime;\n transcriptionDelay = Math.max(lastFinalTranscriptTime - lastSpeakingTime, 0);\n endOfUtteranceDelay = Date.now() - lastSpeakingTime;\n }\n\n const committed = await this.hooks.onEndOfTurn({\n newTranscript: this.audioTranscript,\n transcriptConfidence: confidenceAvg,\n transcriptionDelay: transcriptionDelay ?? 0,\n endOfUtteranceDelay: endOfUtteranceDelay ?? 0,\n startedSpeakingAt,\n stoppedSpeakingAt,\n });\n\n if (committed) {\n this._endUserTurnSpan({\n transcript: this.audioTranscript,\n confidence: confidenceAvg,\n transcriptionDelay: transcriptionDelay ?? 0,\n endOfUtteranceDelay: endOfUtteranceDelay ?? 0,\n });\n\n // clear the transcript if the user turn was committed\n this.audioTranscript = '';\n this.finalTranscriptConfidence = [];\n this.lastSpeakingTime = undefined;\n this.lastFinalTranscriptTime = 0;\n this.speechStartTime = undefined;\n }\n\n this.userTurnCommitted = false;\n };\n\n // cancel any existing EOU task\n this.bounceEOUTask?.cancel();\n // copy the values before awaiting (the values can change)\n this.bounceEOUTask = Task.from(\n bounceEOUTask(this.lastSpeakingTime, this.lastFinalTranscriptTime, this.speechStartTime),\n );\n\n this.bounceEOUTask.result\n .then(() => {\n this.logger.debug('EOU detection task completed');\n })\n .catch((err: unknown) => {\n if (err instanceof Error && err.message.includes('This operation was aborted')) {\n // ignore aborted errors\n return;\n }\n this.logger.error(err, 'Error in EOU detection task:');\n });\n }\n\n private async createSttTask(stt: STTNode | undefined, signal: AbortSignal) {\n if (!stt) return;\n\n this.logger.debug('createSttTask: create stt stream from stt node');\n\n const sttStream = await stt(this.sttInputStream, {});\n\n if (signal.aborted || sttStream === null) return;\n\n if (sttStream instanceof ReadableStream) {\n const reader = sttStream.getReader();\n\n signal.addEventListener('abort', async () => {\n try {\n reader.releaseLock();\n await sttStream?.cancel();\n } catch (e) {\n this.logger.debug('createSttTask: error during abort handler:', e);\n }\n });\n\n try {\n while (true) {\n if (signal.aborted) break;\n\n const { done, value: ev } = await reader.read();\n if (done) break;\n\n if (typeof ev === 'string') {\n throw new Error('STT node must yield SpeechEvent');\n } else {\n await this.onSTTEvent(ev);\n }\n }\n } catch (e) {\n if (isStreamReaderReleaseError(e)) {\n return;\n }\n this.logger.error({ error: e }, 'createSttTask: error reading sttStream');\n } finally {\n reader.releaseLock();\n try {\n await sttStream.cancel();\n } catch (e) {\n this.logger.debug(\n 'createSttTask: error cancelling sttStream (may already be cancelled):',\n e,\n );\n }\n }\n }\n }\n\n private async createVadTask(vad: VAD | undefined, signal: AbortSignal) {\n if (!vad) return;\n\n const vadStream = vad.stream();\n vadStream.updateInputStream(this.vadInputStream);\n\n const abortHandler = () => {\n vadStream.detachInputStream();\n vadStream.close();\n signal.removeEventListener('abort', abortHandler);\n };\n signal.addEventListener('abort', abortHandler);\n\n try {\n for await (const ev of vadStream) {\n if (signal.aborted) break;\n\n switch (ev.type) {\n case VADEventType.START_OF_SPEECH:\n this.logger.debug('VAD task: START_OF_SPEECH');\n this.hooks.onStartOfSpeech(ev);\n this.speaking = true;\n\n if (!this.userTurnSpan) {\n this.userTurnSpan = tracer.startSpan({\n name: 'user_turn',\n context: this.rootSpanContext,\n });\n }\n\n // Capture sample rate from the first VAD event if not already set\n if (ev.frames.length > 0 && ev.frames[0]) {\n this.sampleRate = ev.frames[0].sampleRate;\n }\n\n // If agent is speaking, user speech is overlap - trigger interruption detection\n if (this.agentSpeaking && this.interruptionEnabled) {\n this.onStartOfOverlapSpeech(ev.speechDuration, this.userTurnSpan);\n }\n\n this.bounceEOUTask?.cancel();\n break;\n case VADEventType.INFERENCE_DONE:\n this.hooks.onVADInferenceDone(ev);\n // for metrics, get the \"earliest\" signal of speech as possible\n if (ev.rawAccumulatedSpeech > 0.0) {\n this.lastSpeakingTime = Date.now();\n\n if (this.speechStartTime === undefined) {\n this.speechStartTime = Date.now();\n }\n }\n break;\n case VADEventType.END_OF_SPEECH:\n this.logger.debug('VAD task: END_OF_SPEECH');\n this.hooks.onEndOfSpeech(ev);\n\n // when VAD fires END_OF_SPEECH, it already waited for the silence_duration\n this.speaking = false;\n\n // If we were in overlap speech (agent speaking + user speaking), end it\n if (this.agentSpeaking && this.interruptionEnabled) {\n this.onEndOfOverlapSpeech();\n }\n\n if (\n this.vadBaseTurnDetection ||\n (this.turnDetectionMode === 'stt' && this.userTurnCommitted)\n ) {\n const chatCtx = this.hooks.retrieveChatCtx();\n this.runEOUDetection(chatCtx);\n }\n break;\n }\n }\n } catch (e) {\n this.logger.error(e, 'Error in VAD task');\n } finally {\n this.logger.debug('VAD task closed');\n }\n }\n\n private async createInterruptionTask(\n interruptionDetector: AdaptiveInterruptionDetector,\n signal: AbortSignal,\n ) {\n // Create the interruption stream from the detector\n this.interruptionStream = interruptionDetector.createStream();\n\n // Forward audio frames to the interruption stream\n const reader = this.interruptionInputStream.getReader();\n\n const forwardTask = (async () => {\n try {\n while (!signal.aborted) {\n const { done, value: frame } = await reader.read();\n if (done) break;\n await this.interruptionStream?.pushFrame(frame);\n }\n } catch (e) {\n if (!signal.aborted) {\n this.logger.error(e, 'Error forwarding audio to interruption stream');\n }\n } finally {\n reader.releaseLock();\n }\n })();\n\n // Read interruption events from the stream\n const eventStream = this.interruptionStream.stream;\n const eventReader = eventStream.getReader();\n\n const abortHandler = () => {\n eventReader.releaseLock();\n this.interruptionStream?.close();\n signal.removeEventListener('abort', abortHandler);\n };\n signal.addEventListener('abort', abortHandler);\n\n try {\n while (!signal.aborted) {\n const { done, value: ev } = await eventReader.read();\n if (done) break;\n\n this.logger.debug({ type: ev.type, probability: ev.probability }, 'Interruption event');\n this.hooks.onInterruption(ev);\n }\n } catch (e) {\n if (!signal.aborted) {\n this.logger.error(e, 'Error in interruption task');\n }\n } finally {\n this.logger.debug('Interruption task closed');\n await forwardTask;\n }\n }\n\n /**\n * Called when the agent starts speaking.\n * Enables interruption detection by sending the agent-speech-started sentinel.\n */\n onStartOfAgentSpeech(): void {\n this.agentSpeaking = true;\n\n if (!this.interruptionEnabled || !this.interruptionStream) {\n return;\n }\n\n this.interruptionStream.pushFrame(InterruptionStreamSentinel.speechStarted());\n }\n\n /**\n * Called when the agent stops speaking.\n * Disables interruption detection by sending the agent-speech-ended sentinel.\n */\n onEndOfAgentSpeech(): void {\n if (!this.interruptionEnabled || !this.interruptionStream) {\n this.agentSpeaking = false;\n return;\n }\n\n this.interruptionStream.pushFrame(InterruptionStreamSentinel.speechEnded());\n\n if (this.agentSpeaking) {\n // No interruption was detected, end the overlap inference (idempotent)\n this.onEndOfOverlapSpeech();\n }\n\n this.agentSpeaking = false;\n }\n\n /**\n * Called when user starts speaking while agent is speaking (overlap speech).\n * This triggers the interruption detection inference.\n */\n onStartOfOverlapSpeech(speechDuration: number, userSpeakingSpan?: Span): void {\n if (!this.interruptionEnabled || !this.interruptionStream) {\n return;\n }\n\n if (this.agentSpeaking && userSpeakingSpan) {\n this.interruptionStream.pushFrame(\n InterruptionStreamSentinel.overlapSpeechStarted(speechDuration, userSpeakingSpan),\n );\n }\n }\n\n /**\n * Called when user stops speaking during overlap.\n * This ends the interruption detection inference for this overlap period.\n */\n onEndOfOverlapSpeech(): void {\n if (!this.interruptionEnabled || !this.interruptionStream) {\n return;\n }\n\n this.interruptionStream.pushFrame(InterruptionStreamSentinel.overlapSpeechEnded());\n }\n\n setInputAudioStream(audioStream: ReadableStream<AudioFrame>) {\n this.deferredInputStream.setSource(audioStream);\n }\n\n detachInputAudioStream() {\n this.deferredInputStream.detachSource();\n }\n\n clearUserTurn() {\n this.audioTranscript = '';\n this.audioInterimTranscript = '';\n this.audioPreflightTranscript = '';\n this.finalTranscriptConfidence = [];\n this.userTurnCommitted = false;\n\n this.sttTask?.cancelAndWait().finally(() => {\n this.sttTask = Task.from(({ signal }) => this.createSttTask(this.stt, signal));\n this.sttTask.result.catch((err) => {\n this.logger.error(`Error running STT task: ${err}`);\n });\n });\n }\n\n commitUserTurn(audioDetached: boolean) {\n const commitUserTurnTask =\n (delayDuration: number = 500) =>\n async (controller: AbortController) => {\n if (Date.now() - this.lastFinalTranscriptTime > delayDuration) {\n // flush the stt by pushing silence\n if (audioDetached && this.sampleRate !== undefined) {\n const numSamples = Math.floor(this.sampleRate * 0.5);\n const silence = new Int16Array(numSamples * 2);\n const silenceFrame = new AudioFrame(silence, this.sampleRate, 1, numSamples);\n this.silenceAudioWriter.write(silenceFrame);\n }\n\n // wait for the final transcript to be available\n await delay(delayDuration, { signal: controller.signal });\n }\n\n if (this.audioInterimTranscript) {\n // append interim transcript in case the final transcript is not ready\n this.audioTranscript = `${this.audioTranscript} ${this.audioInterimTranscript}`.trim();\n }\n this.audioInterimTranscript = '';\n\n const chatCtx = this.hooks.retrieveChatCtx();\n this.logger.debug('running EOU detection on commitUserTurn');\n this.runEOUDetection(chatCtx);\n this.userTurnCommitted = true;\n };\n\n // cancel any existing commit user turn task\n this.commitUserTurnTask?.cancel();\n this.commitUserTurnTask = Task.from(commitUserTurnTask());\n\n this.commitUserTurnTask.result\n .then(() => {\n this.logger.debug('User turn committed');\n })\n .catch((err: unknown) => {\n this.logger.error(err, 'Error in user turn commit task:');\n });\n }\n\n async close() {\n this.detachInputAudioStream();\n this.silenceAudioWriter.releaseLock();\n await this.commitUserTurnTask?.cancelAndWait();\n await this.sttTask?.cancelAndWait();\n await this.vadTask?.cancelAndWait();\n await this.bounceEOUTask?.cancelAndWait();\n await this.interruptionTask?.cancelAndWait();\n await this.interruptionStream?.close();\n }\n\n private _endUserTurnSpan({\n transcript,\n confidence,\n transcriptionDelay,\n endOfUtteranceDelay,\n }: {\n transcript: string;\n confidence: number;\n transcriptionDelay: number;\n endOfUtteranceDelay: number;\n }): void {\n if (this.userTurnSpan) {\n this.userTurnSpan.setAttributes({\n [traceTypes.ATTR_USER_TRANSCRIPT]: transcript,\n [traceTypes.ATTR_TRANSCRIPT_CONFIDENCE]: confidence,\n [traceTypes.ATTR_TRANSCRIPTION_DELAY]: transcriptionDelay,\n [traceTypes.ATTR_END_OF_TURN_DELAY]: endOfUtteranceDelay,\n });\n this.userTurnSpan.end();\n this.userTurnSpan = undefined;\n }\n }\n\n private get vadBaseTurnDetection() {\n return ['vad', undefined].includes(this.turnDetectionMode);\n }\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,204 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+ var datastream_io_exports = {};
20
+ __export(datastream_io_exports, {
21
+ DataStreamAudioOutput: () => DataStreamAudioOutput
22
+ });
23
+ module.exports = __toCommonJS(datastream_io_exports);
24
+ var import_mutex = require("@livekit/mutex");
25
+ var import_rtc_node = require("@livekit/rtc-node");
26
+ var import_log = require("../../log.cjs");
27
+ var import_utils = require("../../utils.cjs");
28
+ var import_io = require("../io.cjs");
29
+ const RPC_CLEAR_BUFFER = "lk.clear_buffer";
30
+ const RPC_PLAYBACK_FINISHED = "lk.playback_finished";
31
+ const AUDIO_STREAM_TOPIC = "lk.audio_stream";
32
+ class DataStreamAudioOutput extends import_io.AudioOutput {
33
+ static _playbackFinishedRpcRegistered = false;
34
+ static _playbackFinishedHandlers = {};
35
+ room;
36
+ destinationIdentity;
37
+ roomConnectedFuture;
38
+ waitRemoteTrack;
39
+ streamWriter;
40
+ pushedDuration = 0;
41
+ started = false;
42
+ lock = new import_mutex.Mutex();
43
+ startTask;
44
+ #logger = (0, import_log.log)();
45
+ constructor(opts) {
46
+ super(opts.sampleRate, void 0, { pause: false });
47
+ const { room, destinationIdentity, sampleRate, waitRemoteTrack } = opts;
48
+ this.room = room;
49
+ this.destinationIdentity = destinationIdentity;
50
+ this.sampleRate = sampleRate;
51
+ this.waitRemoteTrack = waitRemoteTrack;
52
+ const onRoomConnected = async () => {
53
+ if (this.startTask) return;
54
+ await this.roomConnectedFuture.await;
55
+ DataStreamAudioOutput.registerPlaybackFinishedRpc({
56
+ room,
57
+ callerIdentity: this.destinationIdentity,
58
+ handler: (data) => this.handlePlaybackFinished(data)
59
+ });
60
+ this.startTask = import_utils.Task.from(({ signal }) => this._start(signal));
61
+ };
62
+ this.roomConnectedFuture = new import_utils.Future();
63
+ this.room.on(import_rtc_node.RoomEvent.ConnectionStateChanged, (_) => {
64
+ if (room.isConnected && !this.roomConnectedFuture.done) {
65
+ this.roomConnectedFuture.resolve(void 0);
66
+ }
67
+ });
68
+ if (this.room.isConnected) {
69
+ this.roomConnectedFuture.resolve(void 0);
70
+ }
71
+ onRoomConnected();
72
+ }
73
+ async _start(_abortSignal) {
74
+ const unlock = await this.lock.lock();
75
+ try {
76
+ if (this.started) return;
77
+ await this.roomConnectedFuture.await;
78
+ this.#logger.debug(
79
+ {
80
+ identity: this.destinationIdentity
81
+ },
82
+ "waiting for the remote participant"
83
+ );
84
+ await (0, import_utils.waitForParticipant)({
85
+ room: this.room,
86
+ identity: this.destinationIdentity
87
+ });
88
+ if (this.waitRemoteTrack) {
89
+ this.#logger.debug(
90
+ {
91
+ identity: this.destinationIdentity,
92
+ kind: this.waitRemoteTrack
93
+ },
94
+ "waiting for the remote track"
95
+ );
96
+ await (0, import_utils.waitForTrackPublication)({
97
+ room: this.room,
98
+ identity: this.destinationIdentity,
99
+ kind: this.waitRemoteTrack
100
+ });
101
+ }
102
+ this.#logger.debug(
103
+ {
104
+ identity: this.destinationIdentity
105
+ },
106
+ "remote participant ready"
107
+ );
108
+ this.started = true;
109
+ } finally {
110
+ unlock();
111
+ }
112
+ }
113
+ async captureFrame(frame) {
114
+ if (!this.startTask) {
115
+ this.startTask = import_utils.Task.from(({ signal }) => this._start(signal));
116
+ }
117
+ await this.startTask.result;
118
+ await super.captureFrame(frame);
119
+ if (!this.streamWriter) {
120
+ this.streamWriter = await this.room.localParticipant.streamBytes({
121
+ name: (0, import_utils.shortuuid)("AUDIO_"),
122
+ topic: AUDIO_STREAM_TOPIC,
123
+ destinationIdentities: [this.destinationIdentity],
124
+ attributes: {
125
+ sample_rate: frame.sampleRate.toString(),
126
+ num_channels: frame.channels.toString()
127
+ }
128
+ });
129
+ this.pushedDuration = 0;
130
+ }
131
+ await this.streamWriter.write(new Uint8Array(frame.data.buffer));
132
+ this.pushedDuration += frame.samplesPerChannel / frame.sampleRate;
133
+ }
134
+ flush() {
135
+ super.flush();
136
+ if (this.streamWriter === void 0 || !this.started) {
137
+ return;
138
+ }
139
+ this.streamWriter.close().finally(() => {
140
+ this.streamWriter = void 0;
141
+ });
142
+ }
143
+ clearBuffer() {
144
+ if (!this.started) return;
145
+ this.room.localParticipant.performRpc({
146
+ destinationIdentity: this.destinationIdentity,
147
+ method: RPC_CLEAR_BUFFER,
148
+ payload: ""
149
+ });
150
+ }
151
+ handlePlaybackFinished(data) {
152
+ if (data.callerIdentity !== this.destinationIdentity) {
153
+ this.#logger.warn(
154
+ {
155
+ callerIdentity: data.callerIdentity,
156
+ destinationIdentity: this.destinationIdentity
157
+ },
158
+ "playback finished event received from unexpected participant"
159
+ );
160
+ return "reject";
161
+ }
162
+ this.#logger.info(
163
+ {
164
+ callerIdentity: data.callerIdentity
165
+ },
166
+ "playback finished event received"
167
+ );
168
+ const playbackFinishedEvent = JSON.parse(data.payload);
169
+ this.onPlaybackFinished(playbackFinishedEvent);
170
+ return "ok";
171
+ }
172
+ static registerPlaybackFinishedRpc({
173
+ room,
174
+ callerIdentity,
175
+ handler
176
+ }) {
177
+ var _a;
178
+ DataStreamAudioOutput._playbackFinishedHandlers[callerIdentity] = handler;
179
+ if (DataStreamAudioOutput._playbackFinishedRpcRegistered) {
180
+ return;
181
+ }
182
+ const rpcHandler = async (data) => {
183
+ const handler2 = DataStreamAudioOutput._playbackFinishedHandlers[data.callerIdentity];
184
+ if (!handler2) {
185
+ (0, import_log.log)().warn(
186
+ {
187
+ callerIdentity: data.callerIdentity,
188
+ expectedIdentities: Object.keys(DataStreamAudioOutput._playbackFinishedHandlers)
189
+ },
190
+ "playback finished event received from unexpected participant"
191
+ );
192
+ return "reject";
193
+ }
194
+ return handler2(data);
195
+ };
196
+ (_a = room.localParticipant) == null ? void 0 : _a.registerRpcMethod(RPC_PLAYBACK_FINISHED, rpcHandler);
197
+ DataStreamAudioOutput._playbackFinishedRpcRegistered = true;
198
+ }
199
+ }
200
+ // Annotate the CommonJS export names for ESM import in node:
201
+ 0 && (module.exports = {
202
+ DataStreamAudioOutput
203
+ });
204
+ //# sourceMappingURL=datastream_io.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/voice/avatar/datastream_io.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2025 LiveKit, Inc.\n//\n// SPDX-License-Identifier: Apache-2.0\nimport { Mutex } from '@livekit/mutex';\nimport {\n type AudioFrame,\n type ByteStreamWriter,\n type Room,\n RoomEvent,\n type RpcInvocationData,\n type TrackKind,\n} from '@livekit/rtc-node';\nimport { log } from '../../log.js';\nimport {\n Future,\n Task,\n shortuuid,\n waitForParticipant,\n waitForTrackPublication,\n} from '../../utils.js';\nimport { AudioOutput, type PlaybackFinishedEvent } from '../io.js';\n\nconst RPC_CLEAR_BUFFER = 'lk.clear_buffer';\nconst RPC_PLAYBACK_FINISHED = 'lk.playback_finished';\nconst AUDIO_STREAM_TOPIC = 'lk.audio_stream';\n\nexport interface DataStreamAudioOutputOptions {\n room: Room;\n destinationIdentity: string;\n sampleRate?: number;\n waitRemoteTrack?: TrackKind;\n}\n\n/**\n * AudioOutput implementation that streams audio to a remote avatar worker using LiveKit DataStream.\n */\nexport class DataStreamAudioOutput extends AudioOutput {\n static _playbackFinishedRpcRegistered: boolean = false;\n static _playbackFinishedHandlers: Record<string, (data: RpcInvocationData) => string> = {};\n\n private room: Room;\n private destinationIdentity: string;\n private roomConnectedFuture: Future<void>;\n private waitRemoteTrack?: TrackKind;\n private streamWriter?: ByteStreamWriter;\n private pushedDuration: number = 0;\n private started: boolean = false;\n private lock = new Mutex();\n private startTask?: Task<void>;\n\n #logger = log();\n\n constructor(opts: DataStreamAudioOutputOptions) {\n super(opts.sampleRate, undefined, { pause: false });\n\n const { room, destinationIdentity, sampleRate, waitRemoteTrack } = opts;\n this.room = room;\n this.destinationIdentity = destinationIdentity;\n this.sampleRate = sampleRate;\n this.waitRemoteTrack = waitRemoteTrack;\n\n const onRoomConnected = async () => {\n if (this.startTask) return;\n\n await this.roomConnectedFuture.await;\n\n // register the rpc method right after the room is connected\n DataStreamAudioOutput.registerPlaybackFinishedRpc({\n room,\n callerIdentity: this.destinationIdentity,\n handler: (data) => this.handlePlaybackFinished(data),\n });\n\n this.startTask = Task.from(({ signal }) => this._start(signal));\n };\n\n this.roomConnectedFuture = new Future<void>();\n\n this.room.on(RoomEvent.ConnectionStateChanged, (_) => {\n if (room.isConnected && !this.roomConnectedFuture.done) {\n this.roomConnectedFuture.resolve(undefined);\n }\n });\n\n if (this.room.isConnected) {\n this.roomConnectedFuture.resolve(undefined);\n }\n\n onRoomConnected();\n }\n\n private async _start(_abortSignal: AbortSignal) {\n const unlock = await this.lock.lock();\n\n try {\n if (this.started) return;\n\n await this.roomConnectedFuture.await;\n\n this.#logger.debug(\n {\n identity: this.destinationIdentity,\n },\n 'waiting for the remote participant',\n );\n\n await waitForParticipant({\n room: this.room,\n identity: this.destinationIdentity,\n });\n\n if (this.waitRemoteTrack) {\n this.#logger.debug(\n {\n identity: this.destinationIdentity,\n kind: this.waitRemoteTrack,\n },\n 'waiting for the remote track',\n );\n\n await waitForTrackPublication({\n room: this.room,\n identity: this.destinationIdentity,\n kind: this.waitRemoteTrack,\n });\n }\n\n this.#logger.debug(\n {\n identity: this.destinationIdentity,\n },\n 'remote participant ready',\n );\n\n this.started = true;\n } finally {\n unlock();\n }\n }\n\n async captureFrame(frame: AudioFrame): Promise<void> {\n if (!this.startTask) {\n this.startTask = Task.from(({ signal }) => this._start(signal));\n }\n\n await this.startTask.result;\n await super.captureFrame(frame);\n\n if (!this.streamWriter) {\n this.streamWriter = await this.room.localParticipant!.streamBytes({\n name: shortuuid('AUDIO_'),\n topic: AUDIO_STREAM_TOPIC,\n destinationIdentities: [this.destinationIdentity],\n attributes: {\n sample_rate: frame.sampleRate.toString(),\n num_channels: frame.channels.toString(),\n },\n });\n this.pushedDuration = 0;\n }\n\n // frame.data is a Int16Array, write accepts a Uint8Array\n await this.streamWriter.write(new Uint8Array(frame.data.buffer));\n this.pushedDuration += frame.samplesPerChannel / frame.sampleRate;\n }\n\n flush(): void {\n super.flush();\n\n if (this.streamWriter === undefined || !this.started) {\n return;\n }\n\n this.streamWriter.close().finally(() => {\n this.streamWriter = undefined;\n });\n }\n\n clearBuffer(): void {\n if (!this.started) return;\n\n this.room.localParticipant!.performRpc({\n destinationIdentity: this.destinationIdentity,\n method: RPC_CLEAR_BUFFER,\n payload: '',\n });\n }\n\n private handlePlaybackFinished(data: RpcInvocationData): string {\n if (data.callerIdentity !== this.destinationIdentity) {\n this.#logger.warn(\n {\n callerIdentity: data.callerIdentity,\n destinationIdentity: this.destinationIdentity,\n },\n 'playback finished event received from unexpected participant',\n );\n return 'reject';\n }\n\n this.#logger.info(\n {\n callerIdentity: data.callerIdentity,\n },\n 'playback finished event received',\n );\n\n const playbackFinishedEvent = JSON.parse(data.payload) as PlaybackFinishedEvent;\n this.onPlaybackFinished(playbackFinishedEvent);\n return 'ok';\n }\n\n static registerPlaybackFinishedRpc({\n room,\n callerIdentity,\n handler,\n }: {\n room: Room;\n callerIdentity: string;\n handler: (data: RpcInvocationData) => string;\n }) {\n DataStreamAudioOutput._playbackFinishedHandlers[callerIdentity] = handler;\n\n if (DataStreamAudioOutput._playbackFinishedRpcRegistered) {\n return;\n }\n\n const rpcHandler = async (data: RpcInvocationData): Promise<string> => {\n const handler = DataStreamAudioOutput._playbackFinishedHandlers[data.callerIdentity];\n if (!handler) {\n log().warn(\n {\n callerIdentity: data.callerIdentity,\n expectedIdentities: Object.keys(DataStreamAudioOutput._playbackFinishedHandlers),\n },\n 'playback finished event received from unexpected participant',\n );\n\n return 'reject';\n }\n return handler(data);\n };\n\n room.localParticipant?.registerRpcMethod(RPC_PLAYBACK_FINISHED, rpcHandler);\n DataStreamAudioOutput._playbackFinishedRpcRegistered = true;\n }\n}\n"],"mappings":"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","names":["handler"]}
@@ -0,0 +1,37 @@
1
+ import { type AudioFrame, type Room, type RpcInvocationData, type TrackKind } from '@livekit/rtc-node';
2
+ import { AudioOutput } from '../io.js';
3
+ export interface DataStreamAudioOutputOptions {
4
+ room: Room;
5
+ destinationIdentity: string;
6
+ sampleRate?: number;
7
+ waitRemoteTrack?: TrackKind;
8
+ }
9
+ /**
10
+ * AudioOutput implementation that streams audio to a remote avatar worker using LiveKit DataStream.
11
+ */
12
+ export declare class DataStreamAudioOutput extends AudioOutput {
13
+ #private;
14
+ static _playbackFinishedRpcRegistered: boolean;
15
+ static _playbackFinishedHandlers: Record<string, (data: RpcInvocationData) => string>;
16
+ private room;
17
+ private destinationIdentity;
18
+ private roomConnectedFuture;
19
+ private waitRemoteTrack?;
20
+ private streamWriter?;
21
+ private pushedDuration;
22
+ private started;
23
+ private lock;
24
+ private startTask?;
25
+ constructor(opts: DataStreamAudioOutputOptions);
26
+ private _start;
27
+ captureFrame(frame: AudioFrame): Promise<void>;
28
+ flush(): void;
29
+ clearBuffer(): void;
30
+ private handlePlaybackFinished;
31
+ static registerPlaybackFinishedRpc({ room, callerIdentity, handler, }: {
32
+ room: Room;
33
+ callerIdentity: string;
34
+ handler: (data: RpcInvocationData) => string;
35
+ }): void;
36
+ }
37
+ //# sourceMappingURL=datastream_io.d.ts.map
@@ -0,0 +1,37 @@
1
+ import { type AudioFrame, type Room, type RpcInvocationData, type TrackKind } from '@livekit/rtc-node';
2
+ import { AudioOutput } from '../io.js';
3
+ export interface DataStreamAudioOutputOptions {
4
+ room: Room;
5
+ destinationIdentity: string;
6
+ sampleRate?: number;
7
+ waitRemoteTrack?: TrackKind;
8
+ }
9
+ /**
10
+ * AudioOutput implementation that streams audio to a remote avatar worker using LiveKit DataStream.
11
+ */
12
+ export declare class DataStreamAudioOutput extends AudioOutput {
13
+ #private;
14
+ static _playbackFinishedRpcRegistered: boolean;
15
+ static _playbackFinishedHandlers: Record<string, (data: RpcInvocationData) => string>;
16
+ private room;
17
+ private destinationIdentity;
18
+ private roomConnectedFuture;
19
+ private waitRemoteTrack?;
20
+ private streamWriter?;
21
+ private pushedDuration;
22
+ private started;
23
+ private lock;
24
+ private startTask?;
25
+ constructor(opts: DataStreamAudioOutputOptions);
26
+ private _start;
27
+ captureFrame(frame: AudioFrame): Promise<void>;
28
+ flush(): void;
29
+ clearBuffer(): void;
30
+ private handlePlaybackFinished;
31
+ static registerPlaybackFinishedRpc({ room, callerIdentity, handler, }: {
32
+ room: Room;
33
+ callerIdentity: string;
34
+ handler: (data: RpcInvocationData) => string;
35
+ }): void;
36
+ }
37
+ //# sourceMappingURL=datastream_io.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"datastream_io.d.ts","sourceRoot":"","sources":["../../../src/voice/avatar/datastream_io.ts"],"names":[],"mappings":"AAIA,OAAO,EACL,KAAK,UAAU,EAEf,KAAK,IAAI,EAET,KAAK,iBAAiB,EACtB,KAAK,SAAS,EACf,MAAM,mBAAmB,CAAC;AAS3B,OAAO,EAAE,WAAW,EAA8B,MAAM,UAAU,CAAC;AAMnE,MAAM,WAAW,4BAA4B;IAC3C,IAAI,EAAE,IAAI,CAAC;IACX,mBAAmB,EAAE,MAAM,CAAC;IAC5B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,eAAe,CAAC,EAAE,SAAS,CAAC;CAC7B;AAED;;GAEG;AACH,qBAAa,qBAAsB,SAAQ,WAAW;;IACpD,MAAM,CAAC,8BAA8B,EAAE,OAAO,CAAS;IACvD,MAAM,CAAC,yBAAyB,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,iBAAiB,KAAK,MAAM,CAAC,CAAM;IAE3F,OAAO,CAAC,IAAI,CAAO;IACnB,OAAO,CAAC,mBAAmB,CAAS;IACpC,OAAO,CAAC,mBAAmB,CAAe;IAC1C,OAAO,CAAC,eAAe,CAAC,CAAY;IACpC,OAAO,CAAC,YAAY,CAAC,CAAmB;IACxC,OAAO,CAAC,cAAc,CAAa;IACnC,OAAO,CAAC,OAAO,CAAkB;IACjC,OAAO,CAAC,IAAI,CAAe;IAC3B,OAAO,CAAC,SAAS,CAAC,CAAa;gBAInB,IAAI,EAAE,4BAA4B;YAuChC,MAAM;IAiDd,YAAY,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IA0BpD,KAAK,IAAI,IAAI;IAYb,WAAW,IAAI,IAAI;IAUnB,OAAO,CAAC,sBAAsB;IAwB9B,MAAM,CAAC,2BAA2B,CAAC,EACjC,IAAI,EACJ,cAAc,EACd,OAAO,GACR,EAAE;QACD,IAAI,EAAE,IAAI,CAAC;QACX,cAAc,EAAE,MAAM,CAAC;QACvB,OAAO,EAAE,CAAC,IAAI,EAAE,iBAAiB,KAAK,MAAM,CAAC;KAC9C;CA0BF"}
@@ -0,0 +1,188 @@
1
+ import { Mutex } from "@livekit/mutex";
2
+ import {
3
+ RoomEvent
4
+ } from "@livekit/rtc-node";
5
+ import { log } from "../../log.js";
6
+ import {
7
+ Future,
8
+ Task,
9
+ shortuuid,
10
+ waitForParticipant,
11
+ waitForTrackPublication
12
+ } from "../../utils.js";
13
+ import { AudioOutput } from "../io.js";
14
+ const RPC_CLEAR_BUFFER = "lk.clear_buffer";
15
+ const RPC_PLAYBACK_FINISHED = "lk.playback_finished";
16
+ const AUDIO_STREAM_TOPIC = "lk.audio_stream";
17
+ class DataStreamAudioOutput extends AudioOutput {
18
+ static _playbackFinishedRpcRegistered = false;
19
+ static _playbackFinishedHandlers = {};
20
+ room;
21
+ destinationIdentity;
22
+ roomConnectedFuture;
23
+ waitRemoteTrack;
24
+ streamWriter;
25
+ pushedDuration = 0;
26
+ started = false;
27
+ lock = new Mutex();
28
+ startTask;
29
+ #logger = log();
30
+ constructor(opts) {
31
+ super(opts.sampleRate, void 0, { pause: false });
32
+ const { room, destinationIdentity, sampleRate, waitRemoteTrack } = opts;
33
+ this.room = room;
34
+ this.destinationIdentity = destinationIdentity;
35
+ this.sampleRate = sampleRate;
36
+ this.waitRemoteTrack = waitRemoteTrack;
37
+ const onRoomConnected = async () => {
38
+ if (this.startTask) return;
39
+ await this.roomConnectedFuture.await;
40
+ DataStreamAudioOutput.registerPlaybackFinishedRpc({
41
+ room,
42
+ callerIdentity: this.destinationIdentity,
43
+ handler: (data) => this.handlePlaybackFinished(data)
44
+ });
45
+ this.startTask = Task.from(({ signal }) => this._start(signal));
46
+ };
47
+ this.roomConnectedFuture = new Future();
48
+ this.room.on(RoomEvent.ConnectionStateChanged, (_) => {
49
+ if (room.isConnected && !this.roomConnectedFuture.done) {
50
+ this.roomConnectedFuture.resolve(void 0);
51
+ }
52
+ });
53
+ if (this.room.isConnected) {
54
+ this.roomConnectedFuture.resolve(void 0);
55
+ }
56
+ onRoomConnected();
57
+ }
58
+ async _start(_abortSignal) {
59
+ const unlock = await this.lock.lock();
60
+ try {
61
+ if (this.started) return;
62
+ await this.roomConnectedFuture.await;
63
+ this.#logger.debug(
64
+ {
65
+ identity: this.destinationIdentity
66
+ },
67
+ "waiting for the remote participant"
68
+ );
69
+ await waitForParticipant({
70
+ room: this.room,
71
+ identity: this.destinationIdentity
72
+ });
73
+ if (this.waitRemoteTrack) {
74
+ this.#logger.debug(
75
+ {
76
+ identity: this.destinationIdentity,
77
+ kind: this.waitRemoteTrack
78
+ },
79
+ "waiting for the remote track"
80
+ );
81
+ await waitForTrackPublication({
82
+ room: this.room,
83
+ identity: this.destinationIdentity,
84
+ kind: this.waitRemoteTrack
85
+ });
86
+ }
87
+ this.#logger.debug(
88
+ {
89
+ identity: this.destinationIdentity
90
+ },
91
+ "remote participant ready"
92
+ );
93
+ this.started = true;
94
+ } finally {
95
+ unlock();
96
+ }
97
+ }
98
+ async captureFrame(frame) {
99
+ if (!this.startTask) {
100
+ this.startTask = Task.from(({ signal }) => this._start(signal));
101
+ }
102
+ await this.startTask.result;
103
+ await super.captureFrame(frame);
104
+ if (!this.streamWriter) {
105
+ this.streamWriter = await this.room.localParticipant.streamBytes({
106
+ name: shortuuid("AUDIO_"),
107
+ topic: AUDIO_STREAM_TOPIC,
108
+ destinationIdentities: [this.destinationIdentity],
109
+ attributes: {
110
+ sample_rate: frame.sampleRate.toString(),
111
+ num_channels: frame.channels.toString()
112
+ }
113
+ });
114
+ this.pushedDuration = 0;
115
+ }
116
+ await this.streamWriter.write(new Uint8Array(frame.data.buffer));
117
+ this.pushedDuration += frame.samplesPerChannel / frame.sampleRate;
118
+ }
119
+ flush() {
120
+ super.flush();
121
+ if (this.streamWriter === void 0 || !this.started) {
122
+ return;
123
+ }
124
+ this.streamWriter.close().finally(() => {
125
+ this.streamWriter = void 0;
126
+ });
127
+ }
128
+ clearBuffer() {
129
+ if (!this.started) return;
130
+ this.room.localParticipant.performRpc({
131
+ destinationIdentity: this.destinationIdentity,
132
+ method: RPC_CLEAR_BUFFER,
133
+ payload: ""
134
+ });
135
+ }
136
+ handlePlaybackFinished(data) {
137
+ if (data.callerIdentity !== this.destinationIdentity) {
138
+ this.#logger.warn(
139
+ {
140
+ callerIdentity: data.callerIdentity,
141
+ destinationIdentity: this.destinationIdentity
142
+ },
143
+ "playback finished event received from unexpected participant"
144
+ );
145
+ return "reject";
146
+ }
147
+ this.#logger.info(
148
+ {
149
+ callerIdentity: data.callerIdentity
150
+ },
151
+ "playback finished event received"
152
+ );
153
+ const playbackFinishedEvent = JSON.parse(data.payload);
154
+ this.onPlaybackFinished(playbackFinishedEvent);
155
+ return "ok";
156
+ }
157
+ static registerPlaybackFinishedRpc({
158
+ room,
159
+ callerIdentity,
160
+ handler
161
+ }) {
162
+ var _a;
163
+ DataStreamAudioOutput._playbackFinishedHandlers[callerIdentity] = handler;
164
+ if (DataStreamAudioOutput._playbackFinishedRpcRegistered) {
165
+ return;
166
+ }
167
+ const rpcHandler = async (data) => {
168
+ const handler2 = DataStreamAudioOutput._playbackFinishedHandlers[data.callerIdentity];
169
+ if (!handler2) {
170
+ log().warn(
171
+ {
172
+ callerIdentity: data.callerIdentity,
173
+ expectedIdentities: Object.keys(DataStreamAudioOutput._playbackFinishedHandlers)
174
+ },
175
+ "playback finished event received from unexpected participant"
176
+ );
177
+ return "reject";
178
+ }
179
+ return handler2(data);
180
+ };
181
+ (_a = room.localParticipant) == null ? void 0 : _a.registerRpcMethod(RPC_PLAYBACK_FINISHED, rpcHandler);
182
+ DataStreamAudioOutput._playbackFinishedRpcRegistered = true;
183
+ }
184
+ }
185
+ export {
186
+ DataStreamAudioOutput
187
+ };
188
+ //# sourceMappingURL=datastream_io.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/voice/avatar/datastream_io.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2025 LiveKit, Inc.\n//\n// SPDX-License-Identifier: Apache-2.0\nimport { Mutex } from '@livekit/mutex';\nimport {\n type AudioFrame,\n type ByteStreamWriter,\n type Room,\n RoomEvent,\n type RpcInvocationData,\n type TrackKind,\n} from '@livekit/rtc-node';\nimport { log } from '../../log.js';\nimport {\n Future,\n Task,\n shortuuid,\n waitForParticipant,\n waitForTrackPublication,\n} from '../../utils.js';\nimport { AudioOutput, type PlaybackFinishedEvent } from '../io.js';\n\nconst RPC_CLEAR_BUFFER = 'lk.clear_buffer';\nconst RPC_PLAYBACK_FINISHED = 'lk.playback_finished';\nconst AUDIO_STREAM_TOPIC = 'lk.audio_stream';\n\nexport interface DataStreamAudioOutputOptions {\n room: Room;\n destinationIdentity: string;\n sampleRate?: number;\n waitRemoteTrack?: TrackKind;\n}\n\n/**\n * AudioOutput implementation that streams audio to a remote avatar worker using LiveKit DataStream.\n */\nexport class DataStreamAudioOutput extends AudioOutput {\n static _playbackFinishedRpcRegistered: boolean = false;\n static _playbackFinishedHandlers: Record<string, (data: RpcInvocationData) => string> = {};\n\n private room: Room;\n private destinationIdentity: string;\n private roomConnectedFuture: Future<void>;\n private waitRemoteTrack?: TrackKind;\n private streamWriter?: ByteStreamWriter;\n private pushedDuration: number = 0;\n private started: boolean = false;\n private lock = new Mutex();\n private startTask?: Task<void>;\n\n #logger = log();\n\n constructor(opts: DataStreamAudioOutputOptions) {\n super(opts.sampleRate, undefined, { pause: false });\n\n const { room, destinationIdentity, sampleRate, waitRemoteTrack } = opts;\n this.room = room;\n this.destinationIdentity = destinationIdentity;\n this.sampleRate = sampleRate;\n this.waitRemoteTrack = waitRemoteTrack;\n\n const onRoomConnected = async () => {\n if (this.startTask) return;\n\n await this.roomConnectedFuture.await;\n\n // register the rpc method right after the room is connected\n DataStreamAudioOutput.registerPlaybackFinishedRpc({\n room,\n callerIdentity: this.destinationIdentity,\n handler: (data) => this.handlePlaybackFinished(data),\n });\n\n this.startTask = Task.from(({ signal }) => this._start(signal));\n };\n\n this.roomConnectedFuture = new Future<void>();\n\n this.room.on(RoomEvent.ConnectionStateChanged, (_) => {\n if (room.isConnected && !this.roomConnectedFuture.done) {\n this.roomConnectedFuture.resolve(undefined);\n }\n });\n\n if (this.room.isConnected) {\n this.roomConnectedFuture.resolve(undefined);\n }\n\n onRoomConnected();\n }\n\n private async _start(_abortSignal: AbortSignal) {\n const unlock = await this.lock.lock();\n\n try {\n if (this.started) return;\n\n await this.roomConnectedFuture.await;\n\n this.#logger.debug(\n {\n identity: this.destinationIdentity,\n },\n 'waiting for the remote participant',\n );\n\n await waitForParticipant({\n room: this.room,\n identity: this.destinationIdentity,\n });\n\n if (this.waitRemoteTrack) {\n this.#logger.debug(\n {\n identity: this.destinationIdentity,\n kind: this.waitRemoteTrack,\n },\n 'waiting for the remote track',\n );\n\n await waitForTrackPublication({\n room: this.room,\n identity: this.destinationIdentity,\n kind: this.waitRemoteTrack,\n });\n }\n\n this.#logger.debug(\n {\n identity: this.destinationIdentity,\n },\n 'remote participant ready',\n );\n\n this.started = true;\n } finally {\n unlock();\n }\n }\n\n async captureFrame(frame: AudioFrame): Promise<void> {\n if (!this.startTask) {\n this.startTask = Task.from(({ signal }) => this._start(signal));\n }\n\n await this.startTask.result;\n await super.captureFrame(frame);\n\n if (!this.streamWriter) {\n this.streamWriter = await this.room.localParticipant!.streamBytes({\n name: shortuuid('AUDIO_'),\n topic: AUDIO_STREAM_TOPIC,\n destinationIdentities: [this.destinationIdentity],\n attributes: {\n sample_rate: frame.sampleRate.toString(),\n num_channels: frame.channels.toString(),\n },\n });\n this.pushedDuration = 0;\n }\n\n // frame.data is a Int16Array, write accepts a Uint8Array\n await this.streamWriter.write(new Uint8Array(frame.data.buffer));\n this.pushedDuration += frame.samplesPerChannel / frame.sampleRate;\n }\n\n flush(): void {\n super.flush();\n\n if (this.streamWriter === undefined || !this.started) {\n return;\n }\n\n this.streamWriter.close().finally(() => {\n this.streamWriter = undefined;\n });\n }\n\n clearBuffer(): void {\n if (!this.started) return;\n\n this.room.localParticipant!.performRpc({\n destinationIdentity: this.destinationIdentity,\n method: RPC_CLEAR_BUFFER,\n payload: '',\n });\n }\n\n private handlePlaybackFinished(data: RpcInvocationData): string {\n if (data.callerIdentity !== this.destinationIdentity) {\n this.#logger.warn(\n {\n callerIdentity: data.callerIdentity,\n destinationIdentity: this.destinationIdentity,\n },\n 'playback finished event received from unexpected participant',\n );\n return 'reject';\n }\n\n this.#logger.info(\n {\n callerIdentity: data.callerIdentity,\n },\n 'playback finished event received',\n );\n\n const playbackFinishedEvent = JSON.parse(data.payload) as PlaybackFinishedEvent;\n this.onPlaybackFinished(playbackFinishedEvent);\n return 'ok';\n }\n\n static registerPlaybackFinishedRpc({\n room,\n callerIdentity,\n handler,\n }: {\n room: Room;\n callerIdentity: string;\n handler: (data: RpcInvocationData) => string;\n }) {\n DataStreamAudioOutput._playbackFinishedHandlers[callerIdentity] = handler;\n\n if (DataStreamAudioOutput._playbackFinishedRpcRegistered) {\n return;\n }\n\n const rpcHandler = async (data: RpcInvocationData): Promise<string> => {\n const handler = DataStreamAudioOutput._playbackFinishedHandlers[data.callerIdentity];\n if (!handler) {\n log().warn(\n {\n callerIdentity: data.callerIdentity,\n expectedIdentities: Object.keys(DataStreamAudioOutput._playbackFinishedHandlers),\n },\n 'playback finished event received from unexpected participant',\n );\n\n return 'reject';\n }\n return handler(data);\n };\n\n room.localParticipant?.registerRpcMethod(RPC_PLAYBACK_FINISHED, rpcHandler);\n DataStreamAudioOutput._playbackFinishedRpcRegistered = true;\n }\n}\n"],"mappings":"AAGA,SAAS,aAAa;AACtB;AAAA,EAIE;AAAA,OAGK;AACP,SAAS,WAAW;AACpB;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAS,mBAA+C;AAExD,MAAM,mBAAmB;AACzB,MAAM,wBAAwB;AAC9B,MAAM,qBAAqB;AAYpB,MAAM,8BAA8B,YAAY;AAAA,EACrD,OAAO,iCAA0C;AAAA,EACjD,OAAO,4BAAiF,CAAC;AAAA,EAEjF;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,iBAAyB;AAAA,EACzB,UAAmB;AAAA,EACnB,OAAO,IAAI,MAAM;AAAA,EACjB;AAAA,EAER,UAAU,IAAI;AAAA,EAEd,YAAY,MAAoC;AAC9C,UAAM,KAAK,YAAY,QAAW,EAAE,OAAO,MAAM,CAAC;AAElD,UAAM,EAAE,MAAM,qBAAqB,YAAY,gBAAgB,IAAI;AACnE,SAAK,OAAO;AACZ,SAAK,sBAAsB;AAC3B,SAAK,aAAa;AAClB,SAAK,kBAAkB;AAEvB,UAAM,kBAAkB,YAAY;AAClC,UAAI,KAAK,UAAW;AAEpB,YAAM,KAAK,oBAAoB;AAG/B,4BAAsB,4BAA4B;AAAA,QAChD;AAAA,QACA,gBAAgB,KAAK;AAAA,QACrB,SAAS,CAAC,SAAS,KAAK,uBAAuB,IAAI;AAAA,MACrD,CAAC;AAED,WAAK,YAAY,KAAK,KAAK,CAAC,EAAE,OAAO,MAAM,KAAK,OAAO,MAAM,CAAC;AAAA,IAChE;AAEA,SAAK,sBAAsB,IAAI,OAAa;AAE5C,SAAK,KAAK,GAAG,UAAU,wBAAwB,CAAC,MAAM;AACpD,UAAI,KAAK,eAAe,CAAC,KAAK,oBAAoB,MAAM;AACtD,aAAK,oBAAoB,QAAQ,MAAS;AAAA,MAC5C;AAAA,IACF,CAAC;AAED,QAAI,KAAK,KAAK,aAAa;AACzB,WAAK,oBAAoB,QAAQ,MAAS;AAAA,IAC5C;AAEA,oBAAgB;AAAA,EAClB;AAAA,EAEA,MAAc,OAAO,cAA2B;AAC9C,UAAM,SAAS,MAAM,KAAK,KAAK,KAAK;AAEpC,QAAI;AACF,UAAI,KAAK,QAAS;AAElB,YAAM,KAAK,oBAAoB;AAE/B,WAAK,QAAQ;AAAA,QACX;AAAA,UACE,UAAU,KAAK;AAAA,QACjB;AAAA,QACA;AAAA,MACF;AAEA,YAAM,mBAAmB;AAAA,QACvB,MAAM,KAAK;AAAA,QACX,UAAU,KAAK;AAAA,MACjB,CAAC;AAED,UAAI,KAAK,iBAAiB;AACxB,aAAK,QAAQ;AAAA,UACX;AAAA,YACE,UAAU,KAAK;AAAA,YACf,MAAM,KAAK;AAAA,UACb;AAAA,UACA;AAAA,QACF;AAEA,cAAM,wBAAwB;AAAA,UAC5B,MAAM,KAAK;AAAA,UACX,UAAU,KAAK;AAAA,UACf,MAAM,KAAK;AAAA,QACb,CAAC;AAAA,MACH;AAEA,WAAK,QAAQ;AAAA,QACX;AAAA,UACE,UAAU,KAAK;AAAA,QACjB;AAAA,QACA;AAAA,MACF;AAEA,WAAK,UAAU;AAAA,IACjB,UAAE;AACA,aAAO;AAAA,IACT;AAAA,EACF;AAAA,EAEA,MAAM,aAAa,OAAkC;AACnD,QAAI,CAAC,KAAK,WAAW;AACnB,WAAK,YAAY,KAAK,KAAK,CAAC,EAAE,OAAO,MAAM,KAAK,OAAO,MAAM,CAAC;AAAA,IAChE;AAEA,UAAM,KAAK,UAAU;AACrB,UAAM,MAAM,aAAa,KAAK;AAE9B,QAAI,CAAC,KAAK,cAAc;AACtB,WAAK,eAAe,MAAM,KAAK,KAAK,iBAAkB,YAAY;AAAA,QAChE,MAAM,UAAU,QAAQ;AAAA,QACxB,OAAO;AAAA,QACP,uBAAuB,CAAC,KAAK,mBAAmB;AAAA,QAChD,YAAY;AAAA,UACV,aAAa,MAAM,WAAW,SAAS;AAAA,UACvC,cAAc,MAAM,SAAS,SAAS;AAAA,QACxC;AAAA,MACF,CAAC;AACD,WAAK,iBAAiB;AAAA,IACxB;AAGA,UAAM,KAAK,aAAa,MAAM,IAAI,WAAW,MAAM,KAAK,MAAM,CAAC;AAC/D,SAAK,kBAAkB,MAAM,oBAAoB,MAAM;AAAA,EACzD;AAAA,EAEA,QAAc;AACZ,UAAM,MAAM;AAEZ,QAAI,KAAK,iBAAiB,UAAa,CAAC,KAAK,SAAS;AACpD;AAAA,IACF;AAEA,SAAK,aAAa,MAAM,EAAE,QAAQ,MAAM;AACtC,WAAK,eAAe;AAAA,IACtB,CAAC;AAAA,EACH;AAAA,EAEA,cAAoB;AAClB,QAAI,CAAC,KAAK,QAAS;AAEnB,SAAK,KAAK,iBAAkB,WAAW;AAAA,MACrC,qBAAqB,KAAK;AAAA,MAC1B,QAAQ;AAAA,MACR,SAAS;AAAA,IACX,CAAC;AAAA,EACH;AAAA,EAEQ,uBAAuB,MAAiC;AAC9D,QAAI,KAAK,mBAAmB,KAAK,qBAAqB;AACpD,WAAK,QAAQ;AAAA,QACX;AAAA,UACE,gBAAgB,KAAK;AAAA,UACrB,qBAAqB,KAAK;AAAA,QAC5B;AAAA,QACA;AAAA,MACF;AACA,aAAO;AAAA,IACT;AAEA,SAAK,QAAQ;AAAA,MACX;AAAA,QACE,gBAAgB,KAAK;AAAA,MACvB;AAAA,MACA;AAAA,IACF;AAEA,UAAM,wBAAwB,KAAK,MAAM,KAAK,OAAO;AACrD,SAAK,mBAAmB,qBAAqB;AAC7C,WAAO;AAAA,EACT;AAAA,EAEA,OAAO,4BAA4B;AAAA,IACjC;AAAA,IACA;AAAA,IACA;AAAA,EACF,GAIG;AA5NL;AA6NI,0BAAsB,0BAA0B,cAAc,IAAI;AAElE,QAAI,sBAAsB,gCAAgC;AACxD;AAAA,IACF;AAEA,UAAM,aAAa,OAAO,SAA6C;AACrE,YAAMA,WAAU,sBAAsB,0BAA0B,KAAK,cAAc;AACnF,UAAI,CAACA,UAAS;AACZ,YAAI,EAAE;AAAA,UACJ;AAAA,YACE,gBAAgB,KAAK;AAAA,YACrB,oBAAoB,OAAO,KAAK,sBAAsB,yBAAyB;AAAA,UACjF;AAAA,UACA;AAAA,QACF;AAEA,eAAO;AAAA,MACT;AACA,aAAOA,SAAQ,IAAI;AAAA,IACrB;AAEA,eAAK,qBAAL,mBAAuB,kBAAkB,uBAAuB;AAChE,0BAAsB,iCAAiC;AAAA,EACzD;AACF;","names":["handler"]}
@@ -0,0 +1,23 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __copyProps = (to, from, except, desc) => {
7
+ if (from && typeof from === "object" || typeof from === "function") {
8
+ for (let key of __getOwnPropNames(from))
9
+ if (!__hasOwnProp.call(to, key) && key !== except)
10
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
11
+ }
12
+ return to;
13
+ };
14
+ var __reExport = (target, mod, secondTarget) => (__copyProps(target, mod, "default"), secondTarget && __copyProps(secondTarget, mod, "default"));
15
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
16
+ var avatar_exports = {};
17
+ module.exports = __toCommonJS(avatar_exports);
18
+ __reExport(avatar_exports, require("./datastream_io.cjs"), module.exports);
19
+ // Annotate the CommonJS export names for ESM import in node:
20
+ 0 && (module.exports = {
21
+ ...require("./datastream_io.cjs")
22
+ });
23
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/voice/avatar/index.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2025 LiveKit, Inc.\n//\n// SPDX-License-Identifier: Apache-2.0\nexport * from './datastream_io.js';\n"],"mappings":";;;;;;;;;;;;;;;AAAA;AAAA;AAGA,2BAAc,+BAHd;","names":[]}