{"_id":"pyannote-cpp-node","_rev":"29-ff38cebcccdceaf172c0d5254c549e78","name":"pyannote-cpp-node","dist-tags":{"latest":"1.8.0"},"versions":{"0.1.0":{"name":"pyannote-cpp-node","version":"0.1.0","_id":"pyannote-cpp-node@0.1.0","maintainers":[{"name":"andyye","email":"andyye.jongcye@gmail.com"}],"dist":{"shasum":"127015269f4d7add4f0bae3ace69fb1dfabf2e63","tarball":"https://registry.npmjs.org/pyannote-cpp-node/-/pyannote-cpp-node-0.1.0.tgz","fileCount":22,"integrity":"sha512-gs9NqxiI9Q6hCqty2UK9oG5asgm7tqSZhZHKMwb04mc3n6clfssHdOXMwNVx1/yebpIbve2y+EkqBRkS6sVdig==","signatures":[{"sig":"MEUCIQDu7xJ2MwJCymSsY2V6jtZzCckkY085X2L06uGCO0jP6wIgQ7DOasynWx5u9a50h+7HroydK52h4zUXJ70jgvRg+Do=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":41067},"main":"./dist/index.js","type":"module","_from":"file:pyannote-cpp-node-0.1.0.tgz","types":"./dist/index.d.ts","engines":{"node":">=18"},"scripts":{"test":"vitest run","build":"tsc"},"_npmUser":{"name":"andyye","email":"andyye.jongcye@gmail.com"},"_resolved":"/private/var/folders/pn/mscr6wj123vfvbl1t6w2cz780000gn/T/ab2158d6b380d8df7fb671bb240aca11/pyannote-cpp-node-0.1.0.tgz","_integrity":"sha512-gs9NqxiI9Q6hCqty2UK9oG5asgm7tqSZhZHKMwb04mc3n6clfssHdOXMwNVx1/yebpIbve2y+EkqBRkS6sVdig==","_npmVersion":"10.9.0","description":"Node.js native bindings for real-time speaker diarization","directories":{},"_nodeVersion":"22.11.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.7.0"},"optionalDependencies":{"@pyannote-cpp-node/darwin-x64":"0.1.0","@pyannote-cpp-node/darwin-arm64":"0.1.0"},"_npmOperationalInternal":{"tmp":"tmp/pyannote-cpp-node_0.1.0_1770813200038_0.6191350452590407","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"pyannote-cpp-node","version":"0.2.0","_id":"pyannote-cpp-node@0.2.0","maintainers":[{"name":"andyye","email":"andyye.jongcye@gmail.com"}],"dist":{"shasum":"def66470ddeb4c8c4a664a497c8a21789da07bcc","tarball":"https://registry.npmjs.org/pyannote-cpp-node/-/pyannote-cpp-node-0.2.0.tgz","fileCount":30,"integrity":"sha512-Vk3BpI2M9NSk54JNuXyKi/SkkPfU918TmCGEJeJe3n748Ez5Blt1SrfkmdZh5yWIy6LGCiP2EeCJeW8aVL+kkw==","signatures":[{"sig":"MEQCIAZ3OAQFfXgy+ggLToLhowN8BwPb2QR9j/wsQnmu3bHKAiB+CcQAcO/qTD8148osbQxA8HmGjvNagtSxQBOSoR8Ekw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":38334},"main":"./dist/index.js","type":"module","_from":"file:pyannote-cpp-node-0.2.0.tgz","types":"./dist/index.d.ts","engines":{"node":">=18"},"scripts":{"test":"vitest run","build":"tsc"},"_npmUser":{"name":"andyye","email":"andyye.jongcye@gmail.com"},"_resolved":"/private/var/folders/pn/mscr6wj123vfvbl1t6w2cz780000gn/T/bc6dfee413ff9f129430937b1077bf1f/pyannote-cpp-node-0.2.0.tgz","_integrity":"sha512-Vk3BpI2M9NSk54JNuXyKi/SkkPfU918TmCGEJeJe3n748Ez5Blt1SrfkmdZh5yWIy6LGCiP2EeCJeW8aVL+kkw==","_npmVersion":"10.9.0","description":"![Platform](https://img.shields.io/badge/platform-macOS-lightgrey) ![Node](https://img.shields.io/badge/node-%3E%3D18-brightgreen)","directories":{},"_nodeVersion":"22.11.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.7.0"},"optionalDependencies":{"@pyannote-cpp-node/darwin-x64":"0.2.0","@pyannote-cpp-node/darwin-arm64":"0.2.0"},"_npmOperationalInternal":{"tmp":"tmp/pyannote-cpp-node_0.2.0_1771506486697_0.7121083113965097","host":"s3://npm-registry-packages-npm-production"}},"0.2.1":{"name":"pyannote-cpp-node","version":"0.2.1","_id":"pyannote-cpp-node@0.2.1","maintainers":[{"name":"andyye","email":"andyye.jongcye@gmail.com"}],"dist":{"shasum":"3d342c20158955280ab03b1a035a81b9fd2661bd","tarball":"https://registry.npmjs.org/pyannote-cpp-node/-/pyannote-cpp-node-0.2.1.tgz","fileCount":30,"integrity":"sha512-XagIkJpgcjdsStrLMFunEfmiZfHYRfSWrsWozb1dWqyGUgAw5lUBdhC/ahamOf5VhhnWY2oKfRONZW23+5C/Gw==","signatures":[{"sig":"MEUCIQCeXg8YdoEJqLwKo64wjOMSc2Uo4YMqR2wvpdFUiGvQdwIgSV+iilYMO9kWBgWbd4wDq7f4Ww11bjz1sPBabNlkUKU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":38062},"main":"./dist/index.js","type":"module","_from":"file:pyannote-cpp-node-0.2.1.tgz","types":"./dist/index.d.ts","engines":{"node":">=18"},"scripts":{"test":"vitest run","build":"tsc"},"_npmUser":{"name":"andyye","email":"andyye.jongcye@gmail.com"},"_resolved":"/private/var/folders/pn/mscr6wj123vfvbl1t6w2cz780000gn/T/71ea8c671797bceedb18003e7a913390/pyannote-cpp-node-0.2.1.tgz","_integrity":"sha512-XagIkJpgcjdsStrLMFunEfmiZfHYRfSWrsWozb1dWqyGUgAw5lUBdhC/ahamOf5VhhnWY2oKfRONZW23+5C/Gw==","_npmVersion":"10.9.0","description":"![Platform](https://img.shields.io/badge/platform-macOS-lightgrey) ![Node](https://img.shields.io/badge/node-%3E%3D18-brightgreen)","directories":{},"_nodeVersion":"22.11.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.7.0"},"optionalDependencies":{"@pyannote-cpp-node/darwin-x64":"0.2.1","@pyannote-cpp-node/darwin-arm64":"0.2.1"},"_npmOperationalInternal":{"tmp":"tmp/pyannote-cpp-node_0.2.1_1771591443179_0.5295545499402563","host":"s3://npm-registry-packages-npm-production"}},"0.2.2":{"name":"pyannote-cpp-node","version":"0.2.2","_id":"pyannote-cpp-node@0.2.2","maintainers":[{"name":"andyye","email":"andyye.jongcye@gmail.com"}],"dist":{"shasum":"5b768df5e52a9899773be4ce0f71dadbc6fade91","tarball":"https://registry.npmjs.org/pyannote-cpp-node/-/pyannote-cpp-node-0.2.2.tgz","fileCount":30,"integrity":"sha512-EEExY65mwSlC1Rrdx71X+RM5SaeceqAK+WWk8i0zz/wNPr4NR0RW9f9vJ1meWzWzqkjE2faoSBVCfJ0DAfl/mA==","signatures":[{"sig":"MEQCIFVqE6thPSoLClIcMluINu4r1kiasjhV/GK1lbFShKkCAiAO0VWR3N2NtOYHCjtjSE5hGsVV7/coMtChNd25T/mKPQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":39005},"main":"./dist/index.js","type":"module","_from":"file:pyannote-cpp-node-0.2.2.tgz","types":"./dist/index.d.ts","engines":{"node":">=18"},"scripts":{"test":"vitest run","build":"tsc"},"_npmUser":{"name":"andyye","email":"andyye.jongcye@gmail.com"},"_resolved":"/private/var/folders/pn/mscr6wj123vfvbl1t6w2cz780000gn/T/ddbe49274fa22954de1c601680934a2b/pyannote-cpp-node-0.2.2.tgz","_integrity":"sha512-EEExY65mwSlC1Rrdx71X+RM5SaeceqAK+WWk8i0zz/wNPr4NR0RW9f9vJ1meWzWzqkjE2faoSBVCfJ0DAfl/mA==","_npmVersion":"10.9.0","description":"![Platform](https://img.shields.io/badge/platform-macOS-lightgrey) ![Node](https://img.shields.io/badge/node-%3E%3D18-brightgreen)","directories":{},"_nodeVersion":"22.11.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.7.0"},"optionalDependencies":{"@pyannote-cpp-node/darwin-x64":"0.2.1","@pyannote-cpp-node/darwin-arm64":"0.2.2"},"_npmOperationalInternal":{"tmp":"tmp/pyannote-cpp-node_0.2.2_1771598751984_0.31798976971562243","host":"s3://npm-registry-packages-npm-production"}},"0.2.3":{"name":"pyannote-cpp-node","version":"0.2.3","_id":"pyannote-cpp-node@0.2.3","maintainers":[{"name":"andyye","email":"andyye.jongcye@gmail.com"}],"dist":{"shasum":"6c8338432c6ca55a2296fd4cb925272472bbfa77","tarball":"https://registry.npmjs.org/pyannote-cpp-node/-/pyannote-cpp-node-0.2.3.tgz","fileCount":30,"integrity":"sha512-Px73TjyYoYYKdIvwEes31CqQbc/3JueIvjFDt93XNxnGgmJaxbwpm9lLs0mVxT//b/ZkadaN0tYc9QdjE4GxAA==","signatures":[{"sig":"MEUCIQCie9h1o9Qvi+gidol9nN+r5zUwW89hbcCBiXy/GFgm+wIgC2om4q3OVyZfX11gvg+J0urPZD/704DAdUY6EcqeN/I=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":39005},"main":"./dist/index.js","type":"module","_from":"file:pyannote-cpp-node-0.2.3.tgz","types":"./dist/index.d.ts","engines":{"node":">=18"},"scripts":{"test":"vitest run","build":"tsc"},"_npmUser":{"name":"andyye","email":"andyye.jongcye@gmail.com"},"_resolved":"/private/var/folders/pn/mscr6wj123vfvbl1t6w2cz780000gn/T/eb41c0c05a984363f5fcc929a5a30c2b/pyannote-cpp-node-0.2.3.tgz","_integrity":"sha512-Px73TjyYoYYKdIvwEes31CqQbc/3JueIvjFDt93XNxnGgmJaxbwpm9lLs0mVxT//b/ZkadaN0tYc9QdjE4GxAA==","_npmVersion":"10.9.0","description":"![Platform](https://img.shields.io/badge/platform-macOS-lightgrey) ![Node](https://img.shields.io/badge/node-%3E%3D18-brightgreen)","directories":{},"_nodeVersion":"22.11.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.7.0"},"optionalDependencies":{"@pyannote-cpp-node/darwin-x64":"0.2.3","@pyannote-cpp-node/darwin-arm64":"0.2.3"},"_npmOperationalInternal":{"tmp":"tmp/pyannote-cpp-node_0.2.3_1771666186051_0.3227449279739427","host":"s3://npm-registry-packages-npm-production"}},"0.3.0":{"name":"pyannote-cpp-node","version":"0.3.0","_id":"pyannote-cpp-node@0.3.0","maintainers":[{"name":"andyye","email":"andyye.jongcye@gmail.com"}],"dist":{"shasum":"e0f1c2158d0ceab03a48c43ac1a4581cc2fbf8dc","tarball":"https://registry.npmjs.org/pyannote-cpp-node/-/pyannote-cpp-node-0.3.0.tgz","fileCount":30,"integrity":"sha512-IqhupZlY/rwYT/gsmPUuHcId2fXqjZBQbEt8ffM0wSpb8cnvgBtPU+BVMFTuaQz9ROYOlN4zefdNeJMPk8/hOA==","signatures":[{"sig":"MEQCIHd0ZHvc+C/EtI+hbDPSmxMYJlsqOReVtuu3QKSA4abKAiBTBnJXRNhAe5sy2b735qysfYi+opb6O2rLM5yOiv6cFw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":43505},"main":"./dist/index.js","type":"module","_from":"file:pyannote-cpp-node-0.3.0.tgz","types":"./dist/index.d.ts","engines":{"node":">=18"},"scripts":{"test":"vitest run","build":"tsc"},"_npmUser":{"name":"andyye","email":"andyye.jongcye@gmail.com"},"_resolved":"/private/var/folders/pn/mscr6wj123vfvbl1t6w2cz780000gn/T/f77cdedec1c68d1c456a66ed95d91c79/pyannote-cpp-node-0.3.0.tgz","_integrity":"sha512-IqhupZlY/rwYT/gsmPUuHcId2fXqjZBQbEt8ffM0wSpb8cnvgBtPU+BVMFTuaQz9ROYOlN4zefdNeJMPk8/hOA==","_npmVersion":"10.9.0","description":"![Platform](https://img.shields.io/badge/platform-macOS-lightgrey) ![Node](https://img.shields.io/badge/node-%3E%3D18-brightgreen)","directories":{},"_nodeVersion":"22.11.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.7.0"},"optionalDependencies":{"@pyannote-cpp-node/darwin-x64":"0.3.0","@pyannote-cpp-node/darwin-arm64":"0.3.0"},"_npmOperationalInternal":{"tmp":"tmp/pyannote-cpp-node_0.3.0_1771840444652_0.8642345715208872","host":"s3://npm-registry-packages-npm-production"}},"0.4.0":{"name":"pyannote-cpp-node","version":"0.4.0","_id":"pyannote-cpp-node@0.4.0","maintainers":[{"name":"andyye","email":"andyye.jongcye@gmail.com"}],"dist":{"shasum":"0045329395bdc22199778eae4b35eee2b3d3c3e3","tarball":"https://registry.npmjs.org/pyannote-cpp-node/-/pyannote-cpp-node-0.4.0.tgz","fileCount":30,"integrity":"sha512-xJlnsNmzEhJfpUK8tp3XtIGw8tDroCcy6lOPJ19x+O1UJEAyWf+yLtDga1hkWgPz5KQUTw7/B5fhhUMohcs/bg==","signatures":[{"sig":"MEYCIQDwvWRFDs3y3GEFa8hcTpkcYqGlcvyarj7o5AtUSghN1wIhAIZzgjjdIwkytKvyv79nne1S0wJ36f4h9M4IbjLKXOXt","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":50323},"main":"./dist/index.js","type":"module","_from":"file:pyannote-cpp-node-0.4.0.tgz","types":"./dist/index.d.ts","engines":{"node":">=18"},"scripts":{"test":"vitest run","build":"tsc"},"_npmUser":{"name":"andyye","email":"andyye.jongcye@gmail.com"},"_resolved":"/private/var/folders/pn/mscr6wj123vfvbl1t6w2cz780000gn/T/4ebe561fca6533cb418ff48ef1799522/pyannote-cpp-node-0.4.0.tgz","_integrity":"sha512-xJlnsNmzEhJfpUK8tp3XtIGw8tDroCcy6lOPJ19x+O1UJEAyWf+yLtDga1hkWgPz5KQUTw7/B5fhhUMohcs/bg==","_npmVersion":"10.9.0","description":"![Platform](https://img.shields.io/badge/platform-macOS-lightgrey) ![Node](https://img.shields.io/badge/node-%3E%3D18-brightgreen)","directories":{},"_nodeVersion":"22.11.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.7.0"},"optionalDependencies":{"@pyannote-cpp-node/darwin-x64":"0.4.0","@pyannote-cpp-node/darwin-arm64":"0.4.0"},"_npmOperationalInternal":{"tmp":"tmp/pyannote-cpp-node_0.4.0_1772028457305_0.3842454769454213","host":"s3://npm-registry-packages-npm-production"}},"0.5.0":{"name":"pyannote-cpp-node","version":"0.5.0","_id":"pyannote-cpp-node@0.5.0","maintainers":[{"name":"andyye","email":"andyye.jongcye@gmail.com"}],"dist":{"shasum":"29119372eb1091f5d94d8eb834e44aba47040122","tarball":"https://registry.npmjs.org/pyannote-cpp-node/-/pyannote-cpp-node-0.5.0.tgz","fileCount":30,"integrity":"sha512-w6rZRC4g14VkgGnJkLE9CN53Fn8r3vRQdzSCzrGjAdq1Yf5yDA04yZYHmjSADYNy0o9WTJ91OVRVSL8oWtBVBQ==","signatures":[{"sig":"MEQCICNcPeY0BiH9A/pXq5IWcc+PQL+VKAwjDAEj/7o6393oAiBOr7oJ/XR6myujRZQP8CQXsN131CQKdmIIHyHkzUroYA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":57131},"main":"./dist/index.js","type":"module","_from":"file:pyannote-cpp-node-0.5.0.tgz","types":"./dist/index.d.ts","engines":{"node":">=18"},"scripts":{"test":"vitest run","build":"tsc"},"_npmUser":{"name":"andyye","email":"andyye.jongcye@gmail.com"},"_resolved":"/private/var/folders/pn/mscr6wj123vfvbl1t6w2cz780000gn/T/942f13a0c3a8df36c1eb018b8fc80264/pyannote-cpp-node-0.5.0.tgz","_integrity":"sha512-w6rZRC4g14VkgGnJkLE9CN53Fn8r3vRQdzSCzrGjAdq1Yf5yDA04yZYHmjSADYNy0o9WTJ91OVRVSL8oWtBVBQ==","_npmVersion":"10.9.0","description":"![Platform](https://img.shields.io/badge/platform-macOS-lightgrey) ![Node](https://img.shields.io/badge/node-%3E%3D18-brightgreen)","directories":{},"_nodeVersion":"22.11.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.7.0"},"optionalDependencies":{"@pyannote-cpp-node/darwin-x64":"0.5.0","@pyannote-cpp-node/darwin-arm64":"0.5.0"},"_npmOperationalInternal":{"tmp":"tmp/pyannote-cpp-node_0.5.0_1772173630048_0.31010223925216884","host":"s3://npm-registry-packages-npm-production"}},"0.6.0":{"name":"pyannote-cpp-node","version":"0.6.0","_id":"pyannote-cpp-node@0.6.0","maintainers":[{"name":"andyye","email":"andyye.jongcye@gmail.com"}],"dist":{"shasum":"7359589d2e6af86bbb4ec3e1447f25d516aaae1a","tarball":"https://registry.npmjs.org/pyannote-cpp-node/-/pyannote-cpp-node-0.6.0.tgz","fileCount":30,"integrity":"sha512-HLIb7GW2LVTreAfjZ8nNNlf+zkoTR261EqlYkqpmaLNO7JC54jB7/J5q1QwAfLJsj9vWqvvLmhGBpa13i20x6A==","signatures":[{"sig":"MEUCICGuCr3oTCb6t+gsHxLhhkpoZ2DEH1xfY/JxLDnankcfAiEAr1xwB/PGvrJW+aKZ+mHSdidUkXxvbgw3BgdsPAlxPUQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":59333},"main":"./dist/index.js","type":"module","_from":"file:pyannote-cpp-node-0.6.0.tgz","types":"./dist/index.d.ts","engines":{"node":">=18"},"scripts":{"test":"vitest run","build":"tsc"},"_npmUser":{"name":"andyye","email":"andyye.jongcye@gmail.com"},"_resolved":"/private/var/folders/pn/mscr6wj123vfvbl1t6w2cz780000gn/T/fbb59af1afcc55ebe01354efc76f8793/pyannote-cpp-node-0.6.0.tgz","_integrity":"sha512-HLIb7GW2LVTreAfjZ8nNNlf+zkoTR261EqlYkqpmaLNO7JC54jB7/J5q1QwAfLJsj9vWqvvLmhGBpa13i20x6A==","_npmVersion":"10.9.0","description":"![Platform](https://img.shields.io/badge/platform-macOS-lightgrey) ![Node](https://img.shields.io/badge/node-%3E%3D18-brightgreen)","directories":{},"_nodeVersion":"22.11.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.7.0"},"optionalDependencies":{"@pyannote-cpp-node/darwin-x64":"0.6.0","@pyannote-cpp-node/darwin-arm64":"0.6.0"},"_npmOperationalInternal":{"tmp":"tmp/pyannote-cpp-node_0.6.0_1772287169009_0.39021431892436764","host":"s3://npm-registry-packages-npm-production"}},"1.0.0":{"name":"pyannote-cpp-node","version":"1.0.0","_id":"pyannote-cpp-node@1.0.0","maintainers":[{"name":"andyye","email":"andyye.jongcye@gmail.com"}],"homepage":"https://github.com/predict-woo/pyannote-ggml#readme","bugs":{"url":"https://github.com/predict-woo/pyannote-ggml/issues"},"dist":{"shasum":"9e8b9addc95c1a71933d98b0c883408ebbac76e4","tarball":"https://registry.npmjs.org/pyannote-cpp-node/-/pyannote-cpp-node-1.0.0.tgz","fileCount":22,"integrity":"sha512-YbIgdTp6yOkuDDbpTHDmiEw2bXr8rCwqJV264ccToVLiSzU0ujtAb8/WgAleTIj60L7mULQlA5Lv3dMBeql2uw==","signatures":[{"sig":"MEUCID6GzXgZAmyLYm60m4MTnGOO47IAvS5ISXAc6nfBGwPeAiEAwos3WsQ8OAUHbYNC3nJRY3zCEd0XqvmZU1ZI9uJNtck=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/pyannote-cpp-node@1.0.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":95850},"main":"./dist/index.js","type":"module","_from":"file:/home/runner/work/pyannote-ggml/pyannote-ggml/bindings/node/packages/pyannote-cpp-node/pyannote-cpp-node-1.0.0.tgz","types":"./dist/index.d.ts","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"scripts":{"test":"vitest run","build":"tsc"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:bf0328e7-80e2-46fc-9e63-ace1e8f99162"}},"_resolved":"/home/runner/work/pyannote-ggml/pyannote-ggml/bindings/node/packages/pyannote-cpp-node/pyannote-cpp-node-1.0.0.tgz","_integrity":"sha512-YbIgdTp6yOkuDDbpTHDmiEw2bXr8rCwqJV264ccToVLiSzU0ujtAb8/WgAleTIj60L7mULQlA5Lv3dMBeql2uw==","repository":{"url":"git+https://github.com/predict-woo/pyannote-ggml.git","type":"git"},"_npmVersion":"11.9.0","description":"Node.js bindings for whisper.cpp plus the pyannote speaker diarization pipeline","directories":{},"_nodeVersion":"24.14.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.7.0","@types/node":"^25.4.0"},"optionalDependencies":{"@pyannote-cpp-node/win32-x64":"1.0.0","@pyannote-cpp-node/darwin-arm64":"1.0.0"},"_npmOperationalInternal":{"tmp":"tmp/pyannote-cpp-node_1.0.0_1773648727400_0.7781827033660318","host":"s3://npm-registry-packages-npm-production"}},"1.0.1":{"name":"pyannote-cpp-node","version":"1.0.1","_id":"pyannote-cpp-node@1.0.1","maintainers":[{"name":"andyye","email":"andyye.jongcye@gmail.com"}],"homepage":"https://github.com/predict-woo/pyannote-ggml#readme","bugs":{"url":"https://github.com/predict-woo/pyannote-ggml/issues"},"dist":{"shasum":"57c116575bfc1f4fd358c596d7ca7f3d1a3139df","tarball":"https://registry.npmjs.org/pyannote-cpp-node/-/pyannote-cpp-node-1.0.1.tgz","fileCount":22,"integrity":"sha512-+dc3gFjJrj4gAboJXMpoEDMJckwAKCSZ7KR3qxPsRv54L+M8qZFySB69FHrwfhmNFHPHn0/t/aeDm9JnSBmF/g==","signatures":[{"sig":"MEUCIQDc9A+d8eW/MGjdFEOveSxp03YwTTT3U4Rzj0w5yepXKQIgUWC9JsrgpFN1nLBvhrQA2O46gsbM5m4pvLASJQ1Hn9c=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/pyannote-cpp-node@1.0.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":95850},"main":"./dist/index.js","type":"module","_from":"file:/home/runner/work/pyannote-ggml/pyannote-ggml/bindings/node/packages/pyannote-cpp-node/pyannote-cpp-node-1.0.1.tgz","types":"./dist/index.d.ts","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"scripts":{"test":"vitest run","build":"tsc"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:bf0328e7-80e2-46fc-9e63-ace1e8f99162"}},"_resolved":"/home/runner/work/pyannote-ggml/pyannote-ggml/bindings/node/packages/pyannote-cpp-node/pyannote-cpp-node-1.0.1.tgz","_integrity":"sha512-+dc3gFjJrj4gAboJXMpoEDMJckwAKCSZ7KR3qxPsRv54L+M8qZFySB69FHrwfhmNFHPHn0/t/aeDm9JnSBmF/g==","repository":{"url":"git+https://github.com/predict-woo/pyannote-ggml.git","type":"git"},"_npmVersion":"11.9.0","description":"Node.js bindings for whisper.cpp plus the pyannote speaker diarization pipeline","directories":{},"_nodeVersion":"24.14.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.7.0","@types/node":"^25.4.0"},"optionalDependencies":{"@pyannote-cpp-node/win32-x64":"1.0.1","@pyannote-cpp-node/darwin-arm64":"1.0.1"},"_npmOperationalInternal":{"tmp":"tmp/pyannote-cpp-node_1.0.1_1773649512565_0.36939066220704553","host":"s3://npm-registry-packages-npm-production"}},"1.0.2":{"name":"pyannote-cpp-node","version":"1.0.2","_id":"pyannote-cpp-node@1.0.2","maintainers":[{"name":"andyye","email":"andyye.jongcye@gmail.com"}],"homepage":"https://github.com/predict-woo/pyannote-ggml#readme","bugs":{"url":"https://github.com/predict-woo/pyannote-ggml/issues"},"dist":{"shasum":"353eee24f64052d6a7dcb17c6c40e646212b35f3","tarball":"https://registry.npmjs.org/pyannote-cpp-node/-/pyannote-cpp-node-1.0.2.tgz","fileCount":22,"integrity":"sha512-dAXR8XAs9n0BOFuwfHC79NPJWkNfKrpIlFgvjYRTnn0Jyy4/jwo3eo0Y7pMqS/eTFkljuo3/jXFv2EgKCjAPVA==","signatures":[{"sig":"MEQCID/A7o7iF+34sezSnikL9gTYmrDffXBJ0CYwwYkfHMzTAiALNh1+BihwO8bR6HRswQGsROqxS2L64USNluOd1GPj4Q==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/pyannote-cpp-node@1.0.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":95850},"main":"./dist/index.js","type":"module","_from":"file:/home/runner/work/pyannote-ggml/pyannote-ggml/bindings/node/packages/pyannote-cpp-node/pyannote-cpp-node-1.0.2.tgz","types":"./dist/index.d.ts","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"scripts":{"test":"vitest run","build":"tsc"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:bf0328e7-80e2-46fc-9e63-ace1e8f99162"}},"_resolved":"/home/runner/work/pyannote-ggml/pyannote-ggml/bindings/node/packages/pyannote-cpp-node/pyannote-cpp-node-1.0.2.tgz","_integrity":"sha512-dAXR8XAs9n0BOFuwfHC79NPJWkNfKrpIlFgvjYRTnn0Jyy4/jwo3eo0Y7pMqS/eTFkljuo3/jXFv2EgKCjAPVA==","repository":{"url":"git+https://github.com/predict-woo/pyannote-ggml.git","type":"git"},"_npmVersion":"11.9.0","description":"Node.js bindings for whisper.cpp plus the pyannote speaker diarization pipeline","directories":{},"_nodeVersion":"24.14.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.7.0","@types/node":"^25.4.0"},"optionalDependencies":{"@pyannote-cpp-node/win32-x64":"1.0.2","@pyannote-cpp-node/darwin-arm64":"1.0.2"},"_npmOperationalInternal":{"tmp":"tmp/pyannote-cpp-node_1.0.2_1773651082794_0.4307597245585413","host":"s3://npm-registry-packages-npm-production"}},"1.0.3":{"name":"pyannote-cpp-node","version":"1.0.3","_id":"pyannote-cpp-node@1.0.3","maintainers":[{"name":"andyye","email":"andyye.jongcye@gmail.com"}],"homepage":"https://github.com/predict-woo/pyannote-ggml#readme","bugs":{"url":"https://github.com/predict-woo/pyannote-ggml/issues"},"dist":{"shasum":"ad6cc642bdfa5b043a74b906bb93701aa98127e6","tarball":"https://registry.npmjs.org/pyannote-cpp-node/-/pyannote-cpp-node-1.0.3.tgz","fileCount":22,"integrity":"sha512-iWACBAjcRmVChdM6VeDjNm30oS2haRygkMGWfMz5m1H7+dbAoJCzsm18pNwK/BuDfYOOgH9XW2DvB6ahSeFOgA==","signatures":[{"sig":"MEUCIQCLaofxWDAnrbnTG3XYEx/xFO9lmwN2UceISqgcZeOe2gIgCNPqXMejdvx8DDaM/7G8DtWMe1q6T0nVcV67FTkuNv0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/pyannote-cpp-node@1.0.3","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":95850},"main":"./dist/index.js","type":"module","_from":"file:/home/runner/work/pyannote-ggml/pyannote-ggml/bindings/node/packages/pyannote-cpp-node/pyannote-cpp-node-1.0.3.tgz","types":"./dist/index.d.ts","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"scripts":{"test":"vitest run","build":"tsc"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:bf0328e7-80e2-46fc-9e63-ace1e8f99162"}},"_resolved":"/home/runner/work/pyannote-ggml/pyannote-ggml/bindings/node/packages/pyannote-cpp-node/pyannote-cpp-node-1.0.3.tgz","_integrity":"sha512-iWACBAjcRmVChdM6VeDjNm30oS2haRygkMGWfMz5m1H7+dbAoJCzsm18pNwK/BuDfYOOgH9XW2DvB6ahSeFOgA==","repository":{"url":"git+https://github.com/predict-woo/pyannote-ggml.git","type":"git"},"_npmVersion":"11.9.0","description":"Node.js bindings for whisper.cpp plus the pyannote speaker diarization pipeline","directories":{},"_nodeVersion":"24.14.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.7.0","@types/node":"^25.4.0"},"optionalDependencies":{"@pyannote-cpp-node/win32-x64":"1.0.3","@pyannote-cpp-node/darwin-arm64":"1.0.3"},"_npmOperationalInternal":{"tmp":"tmp/pyannote-cpp-node_1.0.3_1773665434863_0.1737379825004952","host":"s3://npm-registry-packages-npm-production"}},"1.0.4":{"name":"pyannote-cpp-node","version":"1.0.4","_id":"pyannote-cpp-node@1.0.4","maintainers":[{"name":"andyye","email":"andyye.jongcye@gmail.com"}],"homepage":"https://github.com/predict-woo/pyannote-ggml#readme","bugs":{"url":"https://github.com/predict-woo/pyannote-ggml/issues"},"dist":{"shasum":"c6c4f5a6e6a12c4ec79505a1fef2f6c856f2a2b3","tarball":"https://registry.npmjs.org/pyannote-cpp-node/-/pyannote-cpp-node-1.0.4.tgz","fileCount":22,"integrity":"sha512-zjQCGSuH0Oc4g+K+CL4KZtEbfa4eGrO7+TmY+rbZvQRCsfVcDCW3bS/JdQkD+p0QycI4E91KwKxFmnEdoLPvrA==","signatures":[{"sig":"MEUCIE3whtZziXwiFojIl3lr94zZ7oKC84q6gqAyVX2KjDdgAiEA5kwx80+MlMToa2fr+V327+vcY2tUpQE+93Iu1r5/ccA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/pyannote-cpp-node@1.0.4","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":95850},"main":"./dist/index.js","type":"module","_from":"file:/home/runner/work/pyannote-ggml/pyannote-ggml/bindings/node/packages/pyannote-cpp-node/pyannote-cpp-node-1.0.4.tgz","types":"./dist/index.d.ts","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"scripts":{"test":"vitest run","build":"tsc"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:bf0328e7-80e2-46fc-9e63-ace1e8f99162"}},"_resolved":"/home/runner/work/pyannote-ggml/pyannote-ggml/bindings/node/packages/pyannote-cpp-node/pyannote-cpp-node-1.0.4.tgz","_integrity":"sha512-zjQCGSuH0Oc4g+K+CL4KZtEbfa4eGrO7+TmY+rbZvQRCsfVcDCW3bS/JdQkD+p0QycI4E91KwKxFmnEdoLPvrA==","repository":{"url":"git+https://github.com/predict-woo/pyannote-ggml.git","type":"git"},"_npmVersion":"11.9.0","description":"Node.js bindings for whisper.cpp plus the pyannote speaker diarization pipeline","directories":{},"_nodeVersion":"24.14.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.7.0","@types/node":"^25.4.0"},"optionalDependencies":{"@pyannote-cpp-node/win32-x64":"1.0.4","@pyannote-cpp-node/darwin-arm64":"1.0.4"},"_npmOperationalInternal":{"tmp":"tmp/pyannote-cpp-node_1.0.4_1773668563038_0.7636855374306497","host":"s3://npm-registry-packages-npm-production"}},"1.0.5":{"name":"pyannote-cpp-node","version":"1.0.5","_id":"pyannote-cpp-node@1.0.5","maintainers":[{"name":"andyye","email":"andyye.jongcye@gmail.com"}],"homepage":"https://github.com/predict-woo/pyannote-ggml#readme","bugs":{"url":"https://github.com/predict-woo/pyannote-ggml/issues"},"dist":{"shasum":"45ff90714bd7e1a4986bb7d4c9958675b4b3071c","tarball":"https://registry.npmjs.org/pyannote-cpp-node/-/pyannote-cpp-node-1.0.5.tgz","fileCount":22,"integrity":"sha512-nPXD6GT6k6YQF6QGYJtHNEozp4Qh85Ffk9mk5b7kIqXDtAWrNVjTJdtSxohm43cjhMjsDWoe7+5dxTf4aOV2+g==","signatures":[{"sig":"MEQCIC5MpKAbI6ksYQywnuNySjNqN6PpYX0mnAUEaBFzmGEBAiAvSUeULh1rtlZ6p5abDGFDzux0e66KbF7JmKhnzA77Tw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/pyannote-cpp-node@1.0.5","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":97744},"main":"./dist/index.js","_from":"file:/home/runner/work/pyannote-ggml/pyannote-ggml/bindings/node/packages/pyannote-cpp-node/pyannote-cpp-node-1.0.5.tgz","types":"./dist/index.d.ts","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.js"}},"scripts":{"test":"vitest run","build":"tsc"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:bf0328e7-80e2-46fc-9e63-ace1e8f99162"}},"_resolved":"/home/runner/work/pyannote-ggml/pyannote-ggml/bindings/node/packages/pyannote-cpp-node/pyannote-cpp-node-1.0.5.tgz","_integrity":"sha512-nPXD6GT6k6YQF6QGYJtHNEozp4Qh85Ffk9mk5b7kIqXDtAWrNVjTJdtSxohm43cjhMjsDWoe7+5dxTf4aOV2+g==","repository":{"url":"git+https://github.com/predict-woo/pyannote-ggml.git","type":"git"},"_npmVersion":"11.9.0","description":"Node.js bindings for whisper.cpp plus the pyannote speaker diarization pipeline","directories":{},"_nodeVersion":"24.14.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.7.0","@types/node":"^25.4.0"},"optionalDependencies":{"@pyannote-cpp-node/win32-x64":"1.0.5","@pyannote-cpp-node/darwin-arm64":"1.0.5"},"_npmOperationalInternal":{"tmp":"tmp/pyannote-cpp-node_1.0.5_1773681913151_0.15836264530944155","host":"s3://npm-registry-packages-npm-production"}},"1.0.6":{"name":"pyannote-cpp-node","version":"1.0.6","_id":"pyannote-cpp-node@1.0.6","maintainers":[{"name":"andyye","email":"andyye.jongcye@gmail.com"}],"homepage":"https://github.com/predict-woo/pyannote-ggml#readme","bugs":{"url":"https://github.com/predict-woo/pyannote-ggml/issues"},"dist":{"shasum":"7bfab2dc73a51020147a1a7364db0f873754c1dd","tarball":"https://registry.npmjs.org/pyannote-cpp-node/-/pyannote-cpp-node-1.0.6.tgz","fileCount":22,"integrity":"sha512-oyGlhEwCjU8O7kjFKyDEeLbh2aIDjxyOq798CufOYSRfbWKXQz0r4XO2IGk3jzHFYr+cl0Sg4DrHnvA+D9dXNg==","signatures":[{"sig":"MEUCIBg0B+rFi9WZakM8GdycIG89Mb2cQRDu9hkT02sbspJ8AiEAxy2Lyg60H2kLSpzk24ENVHEx5RMPFZayCZTItZR7tws=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/pyannote-cpp-node@1.0.6","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":99152},"main":"./dist/index.js","_from":"file:/home/runner/work/pyannote-ggml/pyannote-ggml/bindings/node/packages/pyannote-cpp-node/pyannote-cpp-node-1.0.6.tgz","types":"./dist/index.d.ts","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.js"}},"scripts":{"test":"vitest run","build":"tsc"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:bf0328e7-80e2-46fc-9e63-ace1e8f99162"}},"_resolved":"/home/runner/work/pyannote-ggml/pyannote-ggml/bindings/node/packages/pyannote-cpp-node/pyannote-cpp-node-1.0.6.tgz","_integrity":"sha512-oyGlhEwCjU8O7kjFKyDEeLbh2aIDjxyOq798CufOYSRfbWKXQz0r4XO2IGk3jzHFYr+cl0Sg4DrHnvA+D9dXNg==","repository":{"url":"git+https://github.com/predict-woo/pyannote-ggml.git","type":"git"},"_npmVersion":"11.9.0","description":"Node.js bindings for whisper.cpp plus the pyannote speaker diarization pipeline","directories":{},"_nodeVersion":"24.14.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.7.0","@types/node":"^25.4.0"},"optionalDependencies":{"@pyannote-cpp-node/win32-x64":"1.0.6","@pyannote-cpp-node/darwin-arm64":"1.0.6"},"_npmOperationalInternal":{"tmp":"tmp/pyannote-cpp-node_1.0.6_1773738462372_0.9499157386068817","host":"s3://npm-registry-packages-npm-production"}},"1.0.7":{"name":"pyannote-cpp-node","version":"1.0.7","_id":"pyannote-cpp-node@1.0.7","maintainers":[{"name":"andyye","email":"andyye.jongcye@gmail.com"}],"homepage":"https://github.com/predict-woo/pyannote-ggml#readme","bugs":{"url":"https://github.com/predict-woo/pyannote-ggml/issues"},"dist":{"shasum":"1a1135c63f8bebfcc28ca59802bad70a150325e9","tarball":"https://registry.npmjs.org/pyannote-cpp-node/-/pyannote-cpp-node-1.0.7.tgz","fileCount":22,"integrity":"sha512-haln9ChqLREiWhd4Zoy4B6QKNRPHrjDPHQ3DhwPfphQg1dO0W+CfoX2ZJPT8pb5CnZpJu/y4MaXxeZbknG+UDA==","signatures":[{"sig":"MEYCIQD3Ius1R58DrzEpDD3Cs+0YNs34Oxv5Afykz4LqLWHifwIhAKzBKCrtrujyHXVrZMhd9pHY0qRp39Wx9MaeNpqDdLRh","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":99152},"main":"./dist/index.js","_from":"file:/home/runner/work/pyannote-ggml/pyannote-ggml/bindings/node/packages/pyannote-cpp-node/pyannote-cpp-node-1.0.7.tgz","types":"./dist/index.d.ts","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.js"}},"scripts":{"test":"vitest run","build":"tsc"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:bf0328e7-80e2-46fc-9e63-ace1e8f99162"}},"_resolved":"/home/runner/work/pyannote-ggml/pyannote-ggml/bindings/node/packages/pyannote-cpp-node/pyannote-cpp-node-1.0.7.tgz","_integrity":"sha512-haln9ChqLREiWhd4Zoy4B6QKNRPHrjDPHQ3DhwPfphQg1dO0W+CfoX2ZJPT8pb5CnZpJu/y4MaXxeZbknG+UDA==","repository":{"url":"git+https://github.com/predict-woo/pyannote-ggml.git","type":"git"},"_npmVersion":"11.9.0","description":"Node.js bindings for whisper.cpp plus the pyannote speaker diarization pipeline","directories":{},"_nodeVersion":"24.14.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.7.0","@types/node":"^25.4.0"},"optionalDependencies":{"@pyannote-cpp-node/win32-x64":"1.0.7","@pyannote-cpp-node/darwin-arm64":"1.0.7"},"_npmOperationalInternal":{"tmp":"tmp/pyannote-cpp-node_1.0.7_1773836506634_0.557306077068338","host":"s3://npm-registry-packages-npm-production"}},"1.0.8":{"name":"pyannote-cpp-node","version":"1.0.8","_id":"pyannote-cpp-node@1.0.8","maintainers":[{"name":"andyye","email":"andyye.jongcye@gmail.com"}],"homepage":"https://github.com/predict-woo/pyannote-ggml#readme","bugs":{"url":"https://github.com/predict-woo/pyannote-ggml/issues"},"dist":{"shasum":"3e47358c681f0b2ef8dc6a3c3107f6c0feed483d","tarball":"https://registry.npmjs.org/pyannote-cpp-node/-/pyannote-cpp-node-1.0.8.tgz","fileCount":22,"integrity":"sha512-bE7Tm+VfwIWY5F5GX5pt12ooaIk9wb5TJhJ6E5AHrFD92Bah/D3icCdiJRmd+mBp2SfGOFt6WppCntCqOYflHA==","signatures":[{"sig":"MEQCID83h4uf1l/F3TD9jQJksvZK0ySJ5ciXLdTnKEg3WR1GAiAVWAjTXWaQhlCN6WFwacXF/gZQ6VxH6qiiub88Sl7d4g==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":99152},"main":"./dist/index.js","_from":"file:/home/runner/work/pyannote-ggml/pyannote-ggml/bindings/node/packages/pyannote-cpp-node/pyannote-cpp-node-1.0.8.tgz","types":"./dist/index.d.ts","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.js"}},"scripts":{"test":"vitest run","build":"tsc"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:bf0328e7-80e2-46fc-9e63-ace1e8f99162"}},"_resolved":"/home/runner/work/pyannote-ggml/pyannote-ggml/bindings/node/packages/pyannote-cpp-node/pyannote-cpp-node-1.0.8.tgz","_integrity":"sha512-bE7Tm+VfwIWY5F5GX5pt12ooaIk9wb5TJhJ6E5AHrFD92Bah/D3icCdiJRmd+mBp2SfGOFt6WppCntCqOYflHA==","repository":{"url":"git+https://github.com/predict-woo/pyannote-ggml.git","type":"git"},"_npmVersion":"11.9.0","description":"Node.js bindings for whisper.cpp plus the pyannote speaker diarization pipeline","directories":{},"_nodeVersion":"24.14.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.7.0","@types/node":"^25.4.0"},"optionalDependencies":{"@pyannote-cpp-node/win32-x64":"1.0.8","@pyannote-cpp-node/darwin-arm64":"1.0.8"},"_npmOperationalInternal":{"tmp":"tmp/pyannote-cpp-node_1.0.8_1773839054525_0.6708199898393652","host":"s3://npm-registry-packages-npm-production"}},"1.0.9":{"name":"pyannote-cpp-node","version":"1.0.9","_id":"pyannote-cpp-node@1.0.9","maintainers":[{"name":"andyye","email":"andyye.jongcye@gmail.com"}],"homepage":"https://github.com/predict-woo/pyannote-ggml#readme","bugs":{"url":"https://github.com/predict-woo/pyannote-ggml/issues"},"dist":{"shasum":"b9ec532e5a4b163fb9b066672f0e5c7df97ad2e4","tarball":"https://registry.npmjs.org/pyannote-cpp-node/-/pyannote-cpp-node-1.0.9.tgz","fileCount":22,"integrity":"sha512-yLztYrqiLe2o27KXsgtnIMKxx/5ylVPOODFwggivNZ+Nu49koY0DKuFMlZQgM3EkdWZyJVjitVxWgBu13NXXew==","signatures":[{"sig":"MEQCIBqReMxXAQG5ev/m0qmJODCl0Mh1DhG1nxswa4NkhFsNAiB5755fcr1I5/9KLecPZz7CiUFiJX73OCRX5pqYpVJyng==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":99152},"main":"./dist/index.js","_from":"file:/home/runner/work/pyannote-ggml/pyannote-ggml/bindings/node/packages/pyannote-cpp-node/pyannote-cpp-node-1.0.9.tgz","types":"./dist/index.d.ts","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.js"}},"scripts":{"test":"vitest run","build":"tsc"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:bf0328e7-80e2-46fc-9e63-ace1e8f99162"}},"_resolved":"/home/runner/work/pyannote-ggml/pyannote-ggml/bindings/node/packages/pyannote-cpp-node/pyannote-cpp-node-1.0.9.tgz","_integrity":"sha512-yLztYrqiLe2o27KXsgtnIMKxx/5ylVPOODFwggivNZ+Nu49koY0DKuFMlZQgM3EkdWZyJVjitVxWgBu13NXXew==","repository":{"url":"git+https://github.com/predict-woo/pyannote-ggml.git","type":"git"},"_npmVersion":"11.9.0","description":"Node.js bindings for whisper.cpp plus the pyannote speaker diarization pipeline","directories":{},"_nodeVersion":"24.14.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.7.0","@types/node":"^25.4.0"},"optionalDependencies":{"@pyannote-cpp-node/win32-x64":"1.0.9","@pyannote-cpp-node/darwin-arm64":"1.0.9"},"_npmOperationalInternal":{"tmp":"tmp/pyannote-cpp-node_1.0.9_1773997857831_0.44728310516936554","host":"s3://npm-registry-packages-npm-production"}},"1.0.10":{"name":"pyannote-cpp-node","version":"1.0.10","_id":"pyannote-cpp-node@1.0.10","maintainers":[{"name":"andyye","email":"andyye.jongcye@gmail.com"}],"homepage":"https://github.com/predict-woo/pyannote-ggml#readme","bugs":{"url":"https://github.com/predict-woo/pyannote-ggml/issues"},"dist":{"shasum":"b04528b5d532962b65121687f2b3cdc2ff6960a5","tarball":"https://registry.npmjs.org/pyannote-cpp-node/-/pyannote-cpp-node-1.0.10.tgz","fileCount":22,"integrity":"sha512-x4OkZoQBEk8TKBhU8vl8IYAA8shOYFXgmoB1OUj57NUtO41jZvUZ2WjCVb/yecvGcjRZd3IVki0T/ZcO9dKCow==","signatures":[{"sig":"MEUCIQCmT5v4DdZUyyIXHfBdK8FfZO3cLr9GMudg7asAAspIwQIgTuFaKFLaVWak9iDMjiCJNijsYnxKij2dgMqeM0+m/XE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":99155},"main":"./dist/index.js","_from":"file:/home/runner/work/pyannote-ggml/pyannote-ggml/bindings/node/packages/pyannote-cpp-node/pyannote-cpp-node-1.0.10.tgz","types":"./dist/index.d.ts","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.js"}},"scripts":{"test":"vitest run","build":"tsc"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:bf0328e7-80e2-46fc-9e63-ace1e8f99162"}},"_resolved":"/home/runner/work/pyannote-ggml/pyannote-ggml/bindings/node/packages/pyannote-cpp-node/pyannote-cpp-node-1.0.10.tgz","_integrity":"sha512-x4OkZoQBEk8TKBhU8vl8IYAA8shOYFXgmoB1OUj57NUtO41jZvUZ2WjCVb/yecvGcjRZd3IVki0T/ZcO9dKCow==","repository":{"url":"git+https://github.com/predict-woo/pyannote-ggml.git","type":"git"},"_npmVersion":"11.9.0","description":"Node.js bindings for whisper.cpp plus the pyannote speaker diarization pipeline","directories":{},"_nodeVersion":"24.14.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.7.0","@types/node":"^25.4.0"},"optionalDependencies":{"@pyannote-cpp-node/win32-x64":"1.0.10","@pyannote-cpp-node/darwin-arm64":"1.0.10"},"_npmOperationalInternal":{"tmp":"tmp/pyannote-cpp-node_1.0.10_1774001625364_0.5284042097679937","host":"s3://npm-registry-packages-npm-production"}},"1.0.11":{"name":"pyannote-cpp-node","version":"1.0.11","_id":"pyannote-cpp-node@1.0.11","maintainers":[{"name":"andyye","email":"andyye.jongcye@gmail.com"}],"homepage":"https://github.com/predict-woo/pyannote-ggml#readme","bugs":{"url":"https://github.com/predict-woo/pyannote-ggml/issues"},"dist":{"shasum":"0de498f92c3f789d9db9525e76d19fcb5dc6f57b","tarball":"https://registry.npmjs.org/pyannote-cpp-node/-/pyannote-cpp-node-1.0.11.tgz","fileCount":22,"integrity":"sha512-fYbV8R6y18n6tWM+BQ88bj38f8IJ4S43Jf14c5JY4LiCiTmufFRvZJWP/+bmmTkhnCnNg88w1IflH9Qolvz1eA==","signatures":[{"sig":"MEUCIA7tdANALOWGW1ymlmcC+lJwtjc3q0/udlOU82pnLW1vAiEAvA+1/mgwUJiAcs+XPYYSZmlfRjcrcPhpbWJIYZSe1Zo=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":101844},"main":"./dist/index.js","_from":"file:/home/runner/work/pyannote-ggml/pyannote-ggml/bindings/node/packages/pyannote-cpp-node/pyannote-cpp-node-1.0.11.tgz","types":"./dist/index.d.ts","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.js"}},"scripts":{"test":"vitest run","build":"tsc"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:bf0328e7-80e2-46fc-9e63-ace1e8f99162"}},"_resolved":"/home/runner/work/pyannote-ggml/pyannote-ggml/bindings/node/packages/pyannote-cpp-node/pyannote-cpp-node-1.0.11.tgz","_integrity":"sha512-fYbV8R6y18n6tWM+BQ88bj38f8IJ4S43Jf14c5JY4LiCiTmufFRvZJWP/+bmmTkhnCnNg88w1IflH9Qolvz1eA==","repository":{"url":"git+https://github.com/predict-woo/pyannote-ggml.git","type":"git"},"_npmVersion":"11.9.0","description":"Node.js bindings for whisper.cpp plus the pyannote speaker diarization pipeline","directories":{},"_nodeVersion":"24.14.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.7.0","@types/node":"^25.4.0"},"optionalDependencies":{"@pyannote-cpp-node/win32-x64":"1.0.11","@pyannote-cpp-node/darwin-arm64":"1.0.11"},"_npmOperationalInternal":{"tmp":"tmp/pyannote-cpp-node_1.0.11_1774079517213_0.8536297628889407","host":"s3://npm-registry-packages-npm-production"}},"1.0.12":{"name":"pyannote-cpp-node","version":"1.0.12","_id":"pyannote-cpp-node@1.0.12","maintainers":[{"name":"andyye","email":"andyye.jongcye@gmail.com"}],"homepage":"https://github.com/predict-woo/pyannote-ggml#readme","bugs":{"url":"https://github.com/predict-woo/pyannote-ggml/issues"},"dist":{"shasum":"47c15df5a266ed10194da23786f97b79bb66cc1d","tarball":"https://registry.npmjs.org/pyannote-cpp-node/-/pyannote-cpp-node-1.0.12.tgz","fileCount":22,"integrity":"sha512-hnJIPvbYyKraon+JMuHJGuaU5as2RbYbiKJObcrMYYIDzx0iZyOiI/IrVFBDZZ2hZvobzsz2dmCS+csKiaHfAw==","signatures":[{"sig":"MEUCIQCLQESh3/q8Wiyf3E7N9EQ38jk7gOGbiNQ7+MP2KUMLFAIgA7KgBZx1i3WMZsdjddrRA5qw2d05PBRg8JpAJy61fDc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":101901},"main":"./dist/index.js","_from":"file:/home/runner/work/pyannote-ggml/pyannote-ggml/bindings/node/packages/pyannote-cpp-node/pyannote-cpp-node-1.0.12.tgz","types":"./dist/index.d.ts","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.js"}},"scripts":{"test":"vitest run","build":"tsc"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:bf0328e7-80e2-46fc-9e63-ace1e8f99162"}},"_resolved":"/home/runner/work/pyannote-ggml/pyannote-ggml/bindings/node/packages/pyannote-cpp-node/pyannote-cpp-node-1.0.12.tgz","_integrity":"sha512-hnJIPvbYyKraon+JMuHJGuaU5as2RbYbiKJObcrMYYIDzx0iZyOiI/IrVFBDZZ2hZvobzsz2dmCS+csKiaHfAw==","repository":{"url":"git+https://github.com/predict-woo/pyannote-ggml.git","type":"git"},"_npmVersion":"11.9.0","description":"Node.js bindings for whisper.cpp plus the pyannote speaker diarization pipeline","directories":{},"_nodeVersion":"24.14.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.7.0","@types/node":"^25.4.0"},"optionalDependencies":{"@pyannote-cpp-node/win32-x64":"1.0.12","@pyannote-cpp-node/darwin-arm64":"1.0.12"},"_npmOperationalInternal":{"tmp":"tmp/pyannote-cpp-node_1.0.12_1774122884590_0.1084494595216019","host":"s3://npm-registry-packages-npm-production"}},"1.2.0":{"name":"pyannote-cpp-node","version":"1.2.0","_id":"pyannote-cpp-node@1.2.0","maintainers":[{"name":"andyye","email":"andyye.jongcye@gmail.com"}],"homepage":"https://github.com/altalt-org/alt-core-pipeline#readme","bugs":{"url":"https://github.com/altalt-org/alt-core-pipeline/issues"},"dist":{"shasum":"45b2d3b481ca4ef2b49d81161f9f67b45811e898","tarball":"https://registry.npmjs.org/pyannote-cpp-node/-/pyannote-cpp-node-1.2.0.tgz","fileCount":22,"integrity":"sha512-/Vyjf1RKmYny98i7Wdtl3PAwv45QJK3ouLQ0mu8oSEi+5syUXvyAqvBzn9HYmE9I22x/FGUkUVB3jUUFuvegqw==","signatures":[{"sig":"MEYCIQDeYs6XVa3K13gb0XThB3HhPGOJ0vv5wzkXMPcixvN6VgIhAKXzQafJlw/Ki56froI24jIFeBJnOGHYr4RVrmtN0Tn0","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":102941},"main":"./dist/index.js","_from":"file:/home/runner/work/alt-core-pipeline/alt-core-pipeline/bindings/node/packages/pyannote-cpp-node/pyannote-cpp-node-1.2.0.tgz","types":"./dist/index.d.ts","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.js"}},"scripts":{"test":"vitest run","build":"tsc"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:5713b5f5-5f44-41c0-ad93-b50e4c584988"}},"_resolved":"/home/runner/work/alt-core-pipeline/alt-core-pipeline/bindings/node/packages/pyannote-cpp-node/pyannote-cpp-node-1.2.0.tgz","_integrity":"sha512-/Vyjf1RKmYny98i7Wdtl3PAwv45QJK3ouLQ0mu8oSEi+5syUXvyAqvBzn9HYmE9I22x/FGUkUVB3jUUFuvegqw==","repository":{"url":"git+https://github.com/altalt-org/alt-core-pipeline.git","type":"git"},"_npmVersion":"11.9.0","description":"Node.js bindings for whisper.cpp plus the pyannote speaker diarization pipeline","directories":{},"_nodeVersion":"24.14.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.7.0","@types/node":"^25.4.0"},"optionalDependencies":{"@pyannote-cpp-node/win32-x64":"1.2.0","@pyannote-cpp-node/darwin-arm64":"1.2.0"},"_npmOperationalInternal":{"tmp":"tmp/pyannote-cpp-node_1.2.0_1774274347882_0.392006536401859","host":"s3://npm-registry-packages-npm-production"}},"1.3.0":{"name":"pyannote-cpp-node","version":"1.3.0","_id":"pyannote-cpp-node@1.3.0","maintainers":[{"name":"andyye","email":"andyye.jongcye@gmail.com"}],"homepage":"https://github.com/altalt-org/alt-core-pipeline#readme","bugs":{"url":"https://github.com/altalt-org/alt-core-pipeline/issues"},"dist":{"shasum":"a2fa6a41a82991c140b6c5603eb1e383b856713a","tarball":"https://registry.npmjs.org/pyannote-cpp-node/-/pyannote-cpp-node-1.3.0.tgz","fileCount":22,"integrity":"sha512-Gylpd7hVdedJDjtrkc+MrX0SIia5s0/zLYgWS3DCo3PfiFb5b0NaV0CXJdX9gpn9R327qZYobkrql5f7DK3f3Q==","signatures":[{"sig":"MEYCIQDKJOvdK0maAQx/tnJcMu8JXksgnyuSkTbB/ah2BEfr3gIhAPWFN1I3j+VjL0XB6RWg59m1XttLyMN67fmtv9zkcPaZ","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":102941},"main":"./dist/index.js","_from":"file:/home/runner/work/alt-core-pipeline/alt-core-pipeline/bindings/node/packages/pyannote-cpp-node/pyannote-cpp-node-1.3.0.tgz","types":"./dist/index.d.ts","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.js"}},"scripts":{"test":"vitest run","build":"tsc"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:5713b5f5-5f44-41c0-ad93-b50e4c584988"}},"_resolved":"/home/runner/work/alt-core-pipeline/alt-core-pipeline/bindings/node/packages/pyannote-cpp-node/pyannote-cpp-node-1.3.0.tgz","_integrity":"sha512-Gylpd7hVdedJDjtrkc+MrX0SIia5s0/zLYgWS3DCo3PfiFb5b0NaV0CXJdX9gpn9R327qZYobkrql5f7DK3f3Q==","repository":{"url":"git+https://github.com/altalt-org/alt-core-pipeline.git","type":"git"},"_npmVersion":"11.9.0","description":"Node.js bindings for whisper.cpp plus the pyannote speaker diarization pipeline","directories":{},"_nodeVersion":"24.14.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.7.0","@types/node":"^25.4.0"},"optionalDependencies":{"@pyannote-cpp-node/win32-x64":"1.3.0","@pyannote-cpp-node/darwin-arm64":"1.3.0"},"_npmOperationalInternal":{"tmp":"tmp/pyannote-cpp-node_1.3.0_1774275230311_0.17799763169183236","host":"s3://npm-registry-packages-npm-production"}},"1.4.0":{"name":"pyannote-cpp-node","version":"1.4.0","_id":"pyannote-cpp-node@1.4.0","maintainers":[{"name":"andyye","email":"andyye.jongcye@gmail.com"}],"homepage":"https://github.com/altalt-org/alt-core-pipeline#readme","bugs":{"url":"https://github.com/altalt-org/alt-core-pipeline/issues"},"dist":{"shasum":"4bb3a3967c258c649f6ba37898f7e2775909e25d","tarball":"https://registry.npmjs.org/pyannote-cpp-node/-/pyannote-cpp-node-1.4.0.tgz","fileCount":22,"integrity":"sha512-QtFMetV/d2PXDDtVugzwv7t+somMSSP7tx03LozZAZqhB3r7LinE9tfrIAUuVNXNayh9DXuDQCzWnfz/s0xLSw==","signatures":[{"sig":"MEYCIQDF0yJwwNrXuYyNlf9jMmp8R9NQbNWwcyY6yntRS7/mLQIhAIfE7V/QWlFgx8rb5kkS9Qh45sXxPLRaaOqi1b/s7oSt","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":104711},"main":"./dist/index.js","_from":"file:/home/runner/work/alt-core-pipeline/alt-core-pipeline/bindings/node/packages/pyannote-cpp-node/pyannote-cpp-node-1.4.0.tgz","types":"./dist/index.d.ts","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.js"}},"scripts":{"test":"vitest run","build":"tsc"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:5713b5f5-5f44-41c0-ad93-b50e4c584988"}},"_resolved":"/home/runner/work/alt-core-pipeline/alt-core-pipeline/bindings/node/packages/pyannote-cpp-node/pyannote-cpp-node-1.4.0.tgz","_integrity":"sha512-QtFMetV/d2PXDDtVugzwv7t+somMSSP7tx03LozZAZqhB3r7LinE9tfrIAUuVNXNayh9DXuDQCzWnfz/s0xLSw==","repository":{"url":"git+https://github.com/altalt-org/alt-core-pipeline.git","type":"git"},"_npmVersion":"11.9.0","description":"Node.js bindings for whisper.cpp plus the pyannote speaker diarization pipeline","directories":{},"_nodeVersion":"24.14.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.7.0","@types/node":"^25.4.0"},"optionalDependencies":{"@pyannote-cpp-node/win32-x64":"1.4.0","@pyannote-cpp-node/darwin-arm64":"1.4.0"},"_npmOperationalInternal":{"tmp":"tmp/pyannote-cpp-node_1.4.0_1774330539993_0.2034512549060652","host":"s3://npm-registry-packages-npm-production"}},"1.5.0":{"name":"pyannote-cpp-node","version":"1.5.0","_id":"pyannote-cpp-node@1.5.0","maintainers":[{"name":"andyye","email":"andyye.jongcye@gmail.com"}],"homepage":"https://github.com/altalt-org/alt-core-pipeline#readme","bugs":{"url":"https://github.com/altalt-org/alt-core-pipeline/issues"},"dist":{"shasum":"ce47026292912fac6fc3eb4d3e1586792b157f27","tarball":"https://registry.npmjs.org/pyannote-cpp-node/-/pyannote-cpp-node-1.5.0.tgz","fileCount":22,"integrity":"sha512-YCHPhDEQodp1sj5RWSLh6F5InuETC5PPprZvK96N8df3mSmnuKovQpVZBjKBTkBjcnZlPzESjhnUG9G87eYgRQ==","signatures":[{"sig":"MEQCID12tsOGwVZVnot1RtDX9zqqULxM6MdpTGMnA9BcMR36AiAM1IYbCXFVXIFt7Z6GOiOXSLjClAf8/0s7BPguixrdYg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":104711},"main":"./dist/index.js","_from":"file:/home/runner/work/alt-core-pipeline/alt-core-pipeline/bindings/node/packages/pyannote-cpp-node/pyannote-cpp-node-1.5.0.tgz","types":"./dist/index.d.ts","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.js"}},"scripts":{"test":"vitest run","build":"tsc"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:5713b5f5-5f44-41c0-ad93-b50e4c584988"}},"_resolved":"/home/runner/work/alt-core-pipeline/alt-core-pipeline/bindings/node/packages/pyannote-cpp-node/pyannote-cpp-node-1.5.0.tgz","_integrity":"sha512-YCHPhDEQodp1sj5RWSLh6F5InuETC5PPprZvK96N8df3mSmnuKovQpVZBjKBTkBjcnZlPzESjhnUG9G87eYgRQ==","repository":{"url":"git+https://github.com/altalt-org/alt-core-pipeline.git","type":"git"},"_npmVersion":"11.9.0","description":"Node.js bindings for whisper.cpp plus the pyannote speaker diarization pipeline","directories":{},"_nodeVersion":"24.14.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.7.0","@types/node":"^25.4.0"},"optionalDependencies":{"@pyannote-cpp-node/win32-x64":"1.5.0","@pyannote-cpp-node/darwin-arm64":"1.5.0"},"_npmOperationalInternal":{"tmp":"tmp/pyannote-cpp-node_1.5.0_1774344447577_0.1525747762607863","host":"s3://npm-registry-packages-npm-production"}},"1.6.0":{"name":"pyannote-cpp-node","version":"1.6.0","_id":"pyannote-cpp-node@1.6.0","maintainers":[{"name":"andyye","email":"andyye.jongcye@gmail.com"}],"homepage":"https://github.com/altalt-org/alt-core-pipeline#readme","bugs":{"url":"https://github.com/altalt-org/alt-core-pipeline/issues"},"dist":{"shasum":"90c30d7abf3f1c295112caf9ebf38fd8f53b0f4a","tarball":"https://registry.npmjs.org/pyannote-cpp-node/-/pyannote-cpp-node-1.6.0.tgz","fileCount":22,"integrity":"sha512-mY1A889AUdEsYI21iExbFfUQmSqGkRYpKwnYQF/FH18cfWhQbQDZPEfbFaIIJimMkDWLU/p42CqvgdYDWGPLeA==","signatures":[{"sig":"MEQCIEe1sGiPycmAf8KGNdWyP9ZHw+sjYbH4/jsP8yYDlBOFAiBAdVHOFzSd/1PRkWJHfq5oJaZdIbJHYItp1Vvc8Q/LdA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":104711},"main":"./dist/index.js","_from":"file:/home/runner/work/alt-core-pipeline/alt-core-pipeline/bindings/node/packages/pyannote-cpp-node/pyannote-cpp-node-1.6.0.tgz","types":"./dist/index.d.ts","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.js"}},"scripts":{"test":"vitest run","build":"tsc"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:5713b5f5-5f44-41c0-ad93-b50e4c584988"}},"_resolved":"/home/runner/work/alt-core-pipeline/alt-core-pipeline/bindings/node/packages/pyannote-cpp-node/pyannote-cpp-node-1.6.0.tgz","_integrity":"sha512-mY1A889AUdEsYI21iExbFfUQmSqGkRYpKwnYQF/FH18cfWhQbQDZPEfbFaIIJimMkDWLU/p42CqvgdYDWGPLeA==","repository":{"url":"git+https://github.com/altalt-org/alt-core-pipeline.git","type":"git"},"_npmVersion":"11.9.0","description":"Node.js bindings for whisper.cpp plus the pyannote speaker diarization pipeline","directories":{},"_nodeVersion":"24.14.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.7.0","@types/node":"^25.4.0"},"optionalDependencies":{"@pyannote-cpp-node/win32-x64":"1.6.0","@pyannote-cpp-node/darwin-arm64":"1.6.0"},"_npmOperationalInternal":{"tmp":"tmp/pyannote-cpp-node_1.6.0_1774430290094_0.10031782746746187","host":"s3://npm-registry-packages-npm-production"}},"1.7.0":{"name":"pyannote-cpp-node","version":"1.7.0","_id":"pyannote-cpp-node@1.7.0","maintainers":[{"name":"andyye","email":"andyye.jongcye@gmail.com"}],"homepage":"https://github.com/altalt-org/alt-core-pipeline#readme","bugs":{"url":"https://github.com/altalt-org/alt-core-pipeline/issues"},"dist":{"shasum":"725d02431c293db7422e4f2fa788a3498353b696","tarball":"https://registry.npmjs.org/pyannote-cpp-node/-/pyannote-cpp-node-1.7.0.tgz","fileCount":22,"integrity":"sha512-BPmLzoyPIZIUFSHQR5fUjZtmiy2d6rEsepHcpojrrgzM6NRRDyLCq48a76iG2MnjELsPu82vG4rx/9gfp9f9cg==","signatures":[{"sig":"MEQCIAZQY+qG2KGiCMjOvLGRgx3i/bWa9RXNloN97MxcrhVdAiBkuOYbHecAC16TGyWLJNz6dK015Z7GRAQSabofj+4zjw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":104711},"main":"./dist/index.js","_from":"file:/home/runner/work/alt-core-pipeline/alt-core-pipeline/bindings/node/packages/pyannote-cpp-node/pyannote-cpp-node-1.7.0.tgz","types":"./dist/index.d.ts","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.js"}},"scripts":{"test":"vitest run","build":"tsc"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:5713b5f5-5f44-41c0-ad93-b50e4c584988"}},"_resolved":"/home/runner/work/alt-core-pipeline/alt-core-pipeline/bindings/node/packages/pyannote-cpp-node/pyannote-cpp-node-1.7.0.tgz","_integrity":"sha512-BPmLzoyPIZIUFSHQR5fUjZtmiy2d6rEsepHcpojrrgzM6NRRDyLCq48a76iG2MnjELsPu82vG4rx/9gfp9f9cg==","repository":{"url":"git+https://github.com/altalt-org/alt-core-pipeline.git","type":"git"},"_npmVersion":"11.9.0","description":"Node.js bindings for whisper.cpp plus the pyannote speaker diarization pipeline","directories":{},"_nodeVersion":"24.14.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.7.0","@types/node":"^25.4.0"},"optionalDependencies":{"@pyannote-cpp-node/win32-x64":"1.7.0","@pyannote-cpp-node/darwin-arm64":"1.7.0"},"_npmOperationalInternal":{"tmp":"tmp/pyannote-cpp-node_1.7.0_1774501049822_0.4999439329122619","host":"s3://npm-registry-packages-npm-production"}},"1.8.0":{"name":"pyannote-cpp-node","version":"1.8.0","description":"Node.js bindings for whisper.cpp plus the pyannote speaker diarization pipeline","main":"./dist/index.js","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","require":"./dist/index.js","import":"./dist/index.js"}},"engines":{"node":">=18"},"repository":{"type":"git","url":"git+https://github.com/altalt-org/alt-core-pipeline.git"},"publishConfig":{"access":"public"},"scripts":{"build":"tsc","test":"vitest run"},"optionalDependencies":{"@pyannote-cpp-node/darwin-arm64":"1.8.0","@pyannote-cpp-node/win32-x64":"1.8.0"},"devDependencies":{"@types/node":"^25.4.0","typescript":"^5.7.0"},"_id":"pyannote-cpp-node@1.8.0","bugs":{"url":"https://github.com/altalt-org/alt-core-pipeline/issues"},"homepage":"https://github.com/altalt-org/alt-core-pipeline#readme","_integrity":"sha512-4zbUfJcRjMKZ0dvWfOJ5/pPZSIb85BZirZo6twQzts7rE8pXM34DYVabmaiEbRi1oddQr4R9xVCCy2VlRgnHdg==","_resolved":"/home/runner/work/alt-core-pipeline/alt-core-pipeline/bindings/node/packages/pyannote-cpp-node/pyannote-cpp-node-1.8.0.tgz","_from":"file:/home/runner/work/alt-core-pipeline/alt-core-pipeline/bindings/node/packages/pyannote-cpp-node/pyannote-cpp-node-1.8.0.tgz","_nodeVersion":"24.14.0","_npmVersion":"11.9.0","dist":{"integrity":"sha512-4zbUfJcRjMKZ0dvWfOJ5/pPZSIb85BZirZo6twQzts7rE8pXM34DYVabmaiEbRi1oddQr4R9xVCCy2VlRgnHdg==","shasum":"1b3d89e051bb069b08a5c62ca6fa59a66bbd1f08","tarball":"https://registry.npmjs.org/pyannote-cpp-node/-/pyannote-cpp-node-1.8.0.tgz","fileCount":22,"unpackedSize":104711,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIB90cwqx3KNKGoDLxbjyYod2J+kaR3ghN7SmueapNvfOAiEAimloyTYSUTCFCm+SYEkHtsvKyLqliYkvwtyu6AsucGM="}]},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:5713b5f5-5f44-41c0-ad93-b50e4c584988"}},"directories":{},"maintainers":[{"name":"andyye","email":"andyye.jongcye@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/pyannote-cpp-node_1.8.0_1774508249734_0.6868701968045341"},"_hasShrinkwrap":false}},"time":{"created":"2026-02-11T12:33:19.937Z","modified":"2026-03-26T06:57:29.971Z","0.1.0":"2026-02-11T12:33:20.195Z","0.2.0":"2026-02-19T13:08:06.834Z","0.2.1":"2026-02-20T12:44:03.357Z","0.2.2":"2026-02-20T14:45:52.127Z","0.2.3":"2026-02-21T09:29:46.192Z","0.3.0":"2026-02-23T09:54:04.796Z","0.4.0":"2026-02-25T14:07:37.481Z","0.5.0":"2026-02-27T06:27:10.185Z","0.6.0":"2026-02-28T13:59:29.164Z","1.0.0":"2026-03-16T08:12:07.545Z","1.0.1":"2026-03-16T08:25:12.715Z","1.0.2":"2026-03-16T08:51:22.926Z","1.0.3":"2026-03-16T12:50:34.998Z","1.0.4":"2026-03-16T13:42:43.176Z","1.0.5":"2026-03-16T17:25:13.353Z","1.0.6":"2026-03-17T09:07:42.529Z","1.0.7":"2026-03-18T12:21:46.780Z","1.0.8":"2026-03-18T13:04:14.690Z","1.0.9":"2026-03-20T09:10:58.003Z","1.0.10":"2026-03-20T10:13:45.511Z","1.0.11":"2026-03-21T07:51:57.355Z","1.0.12":"2026-03-21T19:54:44.725Z","1.2.0":"2026-03-23T13:59:08.041Z","1.3.0":"2026-03-23T14:13:50.449Z","1.4.0":"2026-03-24T05:35:40.140Z","1.5.0":"2026-03-24T09:27:27.806Z","1.6.0":"2026-03-25T09:18:10.304Z","1.7.0":"2026-03-26T04:57:29.965Z","1.8.0":"2026-03-26T06:57:29.878Z"},"bugs":{"url":"https://github.com/altalt-org/alt-core-pipeline/issues"},"homepage":"https://github.com/altalt-org/alt-core-pipeline#readme","repository":{"type":"git","url":"git+https://github.com/altalt-org/alt-core-pipeline.git"},"description":"Node.js bindings for whisper.cpp plus the pyannote speaker diarization pipeline","maintainers":[{"name":"andyye","email":"andyye.jongcye@gmail.com"}],"readme":"# pyannote-cpp-node\n\n![Platform](https://img.shields.io/badge/platform-macOS%20arm64%20%7C%20Windows%20x64-lightgrey)\n![Node](https://img.shields.io/badge/node-%3E%3D18-brightgreen)\n\nNode.js native bindings for whisper.cpp transcription/VAD plus the pyannote speaker diarization pipeline.\n\n## Overview\n\n`pyannote-cpp-node` is now the single package for both:\n\n- low-level whisper.cpp APIs: `WhisperContext`, `VadContext`, `transcribe`, `transcribeAsync`, `getGpuDevices`\n- high-level pyannote pipeline APIs: `Pipeline`, `PipelineSession`\n- standalone audio processing: `processAgc`\n\nPlatform support:\n\n- `darwin-arm64`: full pipeline (CoreML + Metal acceleration)\n- `win32-x64`: full pipeline (Vulkan GPU + optional OpenVINO acceleration)\n- unsupported: `darwin-x64`, `win32-ia32`, Linux\n\nOn both supported pipeline platforms, `getCapabilities().pipeline` is `true`.\n\nThe integrated pipeline combines Whisper transcription and optional speaker diarization into a single API (`transcriptionOnly: true` skips diarization).\n\nGiven 16 kHz mono PCM audio (`Float32Array`), it produces transcript segments shaped as below. In streaming mode, diarization emits cumulative `segments` events, while `transcriptionOnly: true` emits incremental `segments` events. `finalize()` returns all segments in both modes.\n\n- speaker label (`SPEAKER_00`, `SPEAKER_01`, ...), `\"UNKNOWN\"` when diarization could not assign a speaker, or empty string (`\"\"`) when `transcriptionOnly` is `true`\n- segment start/duration in seconds\n- segment text\n\nThe API supports three modes: **offline** batch processing (`transcribeOffline`), **one-shot** streaming (`transcribe`), and **incremental** streaming (`createSession` + `push`/`finalize`). All three modes support transcription-only operation via `transcriptionOnly: true`. All heavy operations are asynchronous and run on libuv worker threads.\n\n## Features\n\n- Low-level whisper.cpp transcription API compatible with prior `whisper-cpp-node` usage\n- Built-in Silero VAD via `VadContext`\n- GPU device enumeration via `getGpuDevices()`\n- Integrated transcription + diarization in one pipeline\n- Speaker-labeled transcript segments with sentence-level text\n- **Offline mode**: runs Whisper on the full audio at once + offline diarization (fastest for batch)\n- **One-shot mode**: streaming pipeline with automatic chunking\n- **Streaming mode**: incremental push/finalize with real-time `segments` events and `audio` chunk streaming\n- **Transcription-only mode**: skip speaker diarization entirely, only segmentation, VAD, and Whisper models required\n- Deterministic output for the same audio/models/config\n- CoreML-accelerated inference on macOS\n- **Shared model cache**: all models loaded once during `Pipeline.load()`, reused across offline/streaming/session modes\n- **Runtime backend switching**: switch inference backends at runtime on macOS and Windows\n- **Progress reporting**: optional `onProgress` callback for `transcribeOffline` reports Whisper, diarization, and alignment phases\n- **Real-time segment streaming**: optional `onSegment` callback for `transcribeOffline` delivers each Whisper segment (start, end, text) as it's produced — enables live transcript preview and time-based loading bars\n- **WebRTC AGC2 audio normalization**: adaptive gain control at the pipeline ingress, using an RNN-based VAD for speech-aware gain adjustment\n- **Standalone AGC API**: `processAgc()` for offline audio normalization without the full pipeline\n- TypeScript-first API with complete type definitions\n\n## Requirements\n\n- macOS Apple Silicon or Windows x64\n- Node.js >= 18\n- Model files:\n  - Segmentation GGUF (`segModelPath`) — required on all platforms\n  - Embedding GGUF (`embModelPath`) — required unless `transcriptionOnly` is `true`\n  - PLDA GGUF (`pldaPath`) — required unless `transcriptionOnly` is `true`\n  - Whisper GGUF (`whisperModelPath`) — required on all platforms\n  - Optional Silero VAD model (`vadModelPath`)\n  - Required backend config (`backend`) with one of: `metal`, `vulkan`, `coreml`, or `openvino-hybrid`\n  - Accelerator-specific paths now live inside `backend`\n    - `backend: { type: 'coreml', segPath, embPath, whisperEncoderPath }` uses CoreML `.mlpackage` / `.mlmodelc` assets on macOS\n    - `backend: { type: 'openvino-hybrid', whisperEncoderPath, embPath }` uses OpenVINO IR `.xml` assets on Windows\n    - `backend: { type: 'metal', segPath, embPath }` on macOS requires segmentation and embedding model paths\n    - `backend: { type: 'vulkan' }` on Windows does not need extra accelerator paths\n\n## Installation\n\n```bash\nnpm install pyannote-cpp-node\n```\n\n```bash\npnpm add pyannote-cpp-node\n```\n\nThe package installs a platform-specific native addon through `optionalDependencies`.\n\n## Low-Level Quick Start\n\n```typescript\nimport {\n  WhisperContext,\n  createVadContext,\n  getCapabilities,\n  transcribeAsync,\n} from 'pyannote-cpp-node';\n\nconst capabilities = getCapabilities();\nconsole.log(capabilities);\n\nconst ctx = new WhisperContext({\n  model: './models/ggml-base.en.bin',\n  use_gpu: true,\n  no_prints: true,\n});\n\nconst result = await transcribeAsync(ctx, {\n  fname_inp: './audio.wav',\n  language: 'en',\n});\n\nconst vad = createVadContext({\n  model: './models/ggml-silero-v6.2.0.bin',\n});\n\nconsole.log(result.segments);\nconsole.log(vad.getWindowSamples());\n\nvad.free();\nctx.free();\n```\n\n## Quick Start\n\n### macOS (Apple Silicon)\n\n```typescript\nimport { Pipeline } from 'pyannote-cpp-node';\n\nconst pipeline = await Pipeline.load({\n  segModelPath: './models/segmentation.gguf',\n  embModelPath: './models/embedding.gguf',\n  pldaPath: './models/plda.gguf',\n  whisperModelPath: './models/ggml-large-v3-turbo-q5_0.bin',\n  backend: {\n    type: 'coreml',\n    segPath: './models/segmentation.mlpackage',\n    embPath: './models/embedding.mlpackage',\n    whisperEncoderPath: './models/ggml-large-v3-turbo-q5_0-encoder.mlmodelc',\n  },\n  language: 'en',\n});\n\nconst audio = loadAudioAsFloat32Array('./audio-16khz-mono.wav');\nconst result = await pipeline.transcribeOffline(audio);\n\nfor (const segment of result.segments) {\n  const end = segment.start + segment.duration;\n  console.log(\n    `[${segment.speaker}] ${segment.start.toFixed(2)}-${end.toFixed(2)} ${segment.text.trim()}`\n  );\n}\n\npipeline.close();\n```\n\n### Windows (x64)\n\n```typescript\nimport { Pipeline } from 'pyannote-cpp-node';\n\nconst pipeline = await Pipeline.load({\n  segModelPath: './models/segmentation.gguf',\n  embModelPath: './models/embedding.gguf',\n  pldaPath: './models/plda.gguf',\n  whisperModelPath: './models/ggml-large-v3-turbo-q5_0.bin',\n  language: 'en',\n  backend: { type: 'vulkan' },\n});\n\nconst audio = loadAudioAsFloat32Array('./audio-16khz-mono.wav');\nconst result = await pipeline.transcribeOffline(audio);\n\nfor (const segment of result.segments) {\n  const end = segment.start + segment.duration;\n  console.log(\n    `[${segment.speaker}] ${segment.start.toFixed(2)}-${end.toFixed(2)} ${segment.text.trim()}`\n  );\n}\n\npipeline.close();\n```\n\nTo use the Windows OpenVINO hybrid path instead, pass the OpenVINO assets through `backend`:\n\n```typescript\nconst pipeline = await Pipeline.load({\n  segModelPath: './models/segmentation.gguf',\n  embModelPath: './models/embedding.gguf',\n  pldaPath: './models/plda.gguf',\n  whisperModelPath: './models/ggml-large-v3-turbo-q5_0.bin',\n  backend: {\n    type: 'openvino-hybrid',\n    whisperEncoderPath: './models/ggml-large-v3-turbo-encoder-openvino.xml',\n    embPath: './models/embedding-openvino.xml',\n  },\n});\n```\n\n### Transcription-only mode\n\n```typescript\nconst macPipeline = await Pipeline.load({\n  segModelPath: './models/segmentation.gguf',\n  whisperModelPath: './models/ggml-large-v3-turbo-q5_0.bin',\n  language: 'en',\n  transcriptionOnly: true,\n  backend: {\n    type: 'coreml',\n    segPath: './models/segmentation.mlpackage',\n    embPath: './models/embedding.mlpackage',\n    whisperEncoderPath: './models/ggml-large-v3-turbo-q5_0-encoder.mlmodelc',\n  },\n});\n\nconst windowsPipeline = await Pipeline.load({\n  segModelPath: './models/segmentation.gguf',\n  whisperModelPath: './models/ggml-large-v3-turbo-q5_0.bin',\n  language: 'en',\n  transcriptionOnly: true,\n  backend: { type: 'vulkan' },\n});\n\nconst result = await macPipeline.transcribe(audio);\n\nfor (const segment of result.segments) {\n  const end = segment.start + segment.duration;\n  // No speaker label - segment.speaker is empty string\n  console.log(`${segment.start.toFixed(2)}-${end.toFixed(2)} ${segment.text.trim()}`);\n}\n\nmacPipeline.close();\nwindowsPipeline.close();\n```\n\n## API Reference\n\n### `Pipeline`\n\n```typescript\nclass Pipeline {\n  static async load(config: PipelineConfig): Promise<Pipeline>;\n  async transcribeOffline(audio: Float32Array, onProgress?: (phase: number, progress: number) => void, onSegment?: (start: number, end: number, text: string) => void): Promise<TranscriptionResult>;\n  async transcribe(audio: Float32Array): Promise<TranscriptionResult>;\n  setLanguage(language: string): void;\n  setDecodeOptions(options: DecodeOptions): void;\n  createSession(): PipelineSession;\n  async setExecutionBackend(backend: BackendConfig): Promise<void>;\n  cancel(): void;\n  close(): void;\n  get isClosed(): boolean;\n}\n```\n\n#### `static async load(config: PipelineConfig): Promise<Pipeline>`\n\nValidates model paths and loads all models into a shared cache on a background thread. The accelerator assets are selected by `config.backend`, which is required and has no default. On macOS, `backend: { type: 'coreml', ... }` loads CoreML segmentation, embedding, and Whisper encoder assets, while `backend: { type: 'metal', ... }` uses Metal with segmentation and embedding model paths. On Windows x64, `backend: { type: 'vulkan' }` loads the Vulkan path, and `backend: { type: 'openvino-hybrid', ... }` also loads OpenVINO IR models for the Whisper encoder and embedding model. Models are loaded once and reused across all subsequent `transcribe()`, `transcribeOffline()`, and `createSession()` calls. Models are freed only when `close()` is called.\n\n- `backend` is required in every `Pipeline.load()` call\n- `coreml` requires `segPath`, `embPath`, and `whisperEncoderPath`\n- `openvino-hybrid` requires `whisperEncoderPath` and `embPath`\n- `metal` requires `segPath` and `embPath`\n- `vulkan` does not require extra accelerator model paths\n\n#### `async transcribeOffline(audio: Float32Array, onProgress?, onSegment?): Promise<TranscriptionResult>`\n\nRuns Whisper on the **entire** audio buffer in a single `whisper_full()` call, then runs offline diarization and WhisperX-style speaker alignment. In transcription-only mode, diarization and speaker alignment are skipped, and segments have an empty `speaker` field. This is the fastest mode for batch processing — no streaming infrastructure is involved.\n\nIf cancellation is requested with `pipeline.cancel()` or `pipeline.close()` while this call is in flight, the promise rejects with `Error(\"Operation cancelled\")`.\n\nThe optional `onProgress` callback receives `(phase, progress)` updates:\n\n| Phase | Value | Meaning |\n| --- | --- | --- |\n| `0` | `0`–`100` | Whisper transcription progress (percentage) |\n| `1` | `0` | Diarization started |\n| `2` | `0` | Speaker alignment started |\n\n```typescript\nconst result = await pipeline.transcribeOffline(audio, (phase, progress) => {\n  if (phase === 0) console.log(`Transcribing: ${progress}%`);\n  if (phase === 1) console.log('Running diarization...');\n  if (phase === 2) console.log('Aligning speakers...');\n});\n```\n\nThe optional `onSegment` callback receives `(start, end, text)` for each Whisper segment as it's produced during transcription. Times are in seconds. This enables live transcript preview before diarization and alignment complete.\n\n```typescript\nconst result = await pipeline.transcribeOffline(audio, undefined, (start, end, text) => {\n  console.log(`[${start.toFixed(2)}-${end.toFixed(2)}] ${text}`);\n});\n```\n\nBoth callbacks can be used simultaneously:\n\n```typescript\nconst result = await pipeline.transcribeOffline(\n  audio,\n  (phase, progress) => {\n    if (phase === 0) updateProgressBar(progress);\n  },\n  (start, end, text) => {\n    appendToTranscriptPreview(start, end, text);\n  },\n);\n```\n\n#### `async transcribe(audio: Float32Array): Promise<TranscriptionResult>`\n\nRuns one-shot transcription (+ diarization unless `transcriptionOnly` is set) using the streaming pipeline internally (pushes 1-second chunks then finalizes).\n\nIf cancellation is requested with `pipeline.cancel()` or `pipeline.close()` while this call is in flight, the promise rejects with `Error(\"Operation cancelled\")`.\n\n#### `setLanguage(language: string): void`\n\nUpdates the Whisper decode language for subsequent `transcribe()` calls. This is a convenience shorthand for `setDecodeOptions({ language })`.\n\n#### `setDecodeOptions(options: DecodeOptions): void`\n\nUpdates one or more Whisper decode options for subsequent `transcribe()` calls. Only the fields you pass are changed; others retain their current values. See `DecodeOptions` for available fields.\n\n\n#### `async setExecutionBackend(backend: BackendConfig): Promise<void>`\n\nSwitches the inference backend at runtime. Tears down and reloads the entire model cache with the new backend configuration. The promise resolves when the new models are ready.\n\n- **macOS**: supports `metal` and `coreml`\n- **Windows**: supports `vulkan` and `openvino-hybrid`\n\nPass one of these `BackendConfig` variants:\n\n```typescript\ntype BackendConfig =\n  | { type: 'metal'; gpuDevice?: number; flashAttn?: boolean; segPath: string; embPath: string }\n  | { type: 'vulkan'; gpuDevice?: number; flashAttn?: boolean }\n  | {\n      type: 'coreml';\n      gpuDevice?: number;\n      flashAttn?: boolean;\n      segPath: string;\n      embPath: string;\n      whisperEncoderPath: string;\n    }\n  | {\n      type: 'openvino-hybrid';\n      gpuDevice?: number;\n      flashAttn?: boolean;\n      whisperEncoderPath: string;\n      embPath: string;\n      openvinoDevice?: string;\n      openvinoCacheDir?: string;\n    };\n```\n\n> **Warning**: This is a heavy operation (~5-6s on Intel iGPU). It fully tears down and rebuilds the model cache. Treat it as a one-time configuration change, not something to call in a loop. See [Warnings and Known Issues](#warnings-and-known-issues) for Intel iGPU limitations.\n\n```typescript\n// macOS: switch to Metal\nawait pipeline.setExecutionBackend({\n  type: 'metal',\n  segPath: './models/segmentation.mlpackage',\n  embPath: './models/embedding.mlpackage',\n});\n\n// macOS: switch to CoreML\nawait pipeline.setExecutionBackend({\n  type: 'coreml',\n  segPath: './models/segmentation.mlpackage',\n  embPath: './models/embedding.mlpackage',\n  whisperEncoderPath: './models/ggml-large-v3-turbo-q5_0-encoder.mlmodelc',\n});\n\n// Windows: switch to OpenVINO hybrid\nawait pipeline.setExecutionBackend({\n  type: 'openvino-hybrid',\n  whisperEncoderPath: './models/ggml-large-v3-turbo-encoder-openvino.xml',\n  embPath: './models/embedding-openvino.xml',\n});\n\n// Windows: switch back to Vulkan\nawait pipeline.setExecutionBackend({ type: 'vulkan' });\n```\n\n#### `createSession(): PipelineSession`\n\nCreates an independent streaming session for incremental processing.\nThis method takes no arguments; native segment/audio callbacks are wired internally.\n\n#### `cancel(): void`\n\nRequests cooperative cancellation of the active `transcribe()` or `transcribeOffline()` call, if any. Native work stops at the next supported cancellation point, and the in-flight promise rejects with `Error(\"Operation cancelled\")`.\n\n#### `close(): void`\n\nRequests cancellation of any active model-level operation, then releases native resources. Safe to call multiple times.\n\n#### `get isClosed(): boolean`\n\nReturns `true` after `close()`.\n\n### `PipelineSession` (extends `EventEmitter`)\n\n```typescript\nclass PipelineSession extends EventEmitter {\n  async push(audio: Float32Array): Promise<PushResult>;\n  cancel(): void;\n  setLanguage(language: string): void;\n  setDecodeOptions(options: DecodeOptions): void;\n  async finalize(): Promise<TranscriptionResult>;\n  close(): Promise<void>;\n  get isClosed(): boolean;\n  on<K extends keyof PipelineSessionEvents>(\n    event: K,\n    listener: (...args: PipelineSessionEvents[K]) => void\n  ): this;\n}\n```\n\n```typescript\ninterface PipelineSessionEvents {\n  segments: [segments: AlignedSegment[]];\n  audio: [audio: Float32Array];\n  error: [error: Error];\n}\n```\n\n#### `async push(audio: Float32Array): Promise<PushResult>`\n\nPushes an arbitrary number of samples into the streaming pipeline.\n\n```typescript\ninterface PushResult {\n  vad: boolean[];  // per-window VAD (true = speech, false = silence)\n  rms: number[];   // per-window RMS of input audio, aligned 1:1 with vad\n}\n```\n\n- `vad` contains per-frame VAD booleans (one per 512-sample window)\n- `rms` contains the RMS energy of each corresponding window (post-AGC when `agcEnabled` is true, raw input otherwise)\n- Both arrays are the same length\n- The pipeline pre-fills 10 seconds of silence during initialization, so results are returned immediately from the first push (~0.94s step size)\n- Chunk size is flexible; not restricted to 16,000-sample pushes\n\nIf the session is cancelled before or during the call, the promise rejects with `Error(\"Operation cancelled\")`.\n\n#### `setLanguage(language: string): void`\n\nUpdates the Whisper decode language on the live streaming session. Takes effect on the next Whisper decode run. Thread-safe — the change is pushed to the C++ pipeline immediately.\n\n#### `setDecodeOptions(options: DecodeOptions): void`\n\nUpdates one or more Whisper decode options on the live streaming session. Takes effect on the next Whisper decode run. Thread-safe — changes are pushed to the C++ pipeline immediately. Only the fields you pass are changed; others retain their current values.\n\n#### `async finalize(): Promise<TranscriptionResult>`\n\nFlushes all stages, runs final recluster + alignment, and returns the definitive result. `finalize()` always returns all accumulated segments regardless of mode. In diarization mode this is the final re-aligned output, and in transcription-only mode this is the union of all incremental `segments` emissions.\n\nIf the session is cancelled before or during the call, the promise rejects with `Error(\"Operation cancelled\")`.\n\n```typescript\ntype TranscriptionResult = {\n  segments: AlignedSegment[];\n  /** Silence-filtered audio when VAD model is loaded. Timestamps align to this audio. */\n  filteredAudio?: Float32Array;\n};\n```\n\n#### `cancel(): void`\n\nRequests cooperative cancellation of the active streaming operation, if any. After calling `cancel()`, the current `push()` or `finalize()` promise rejects with `Error(\"Operation cancelled\")`.\n\n#### `close(): Promise<void>`\n\nRequests cancellation of any active `push()` / `finalize()` work, then releases native session resources. Safe to call multiple times.\n\n#### `get isClosed(): boolean`\n\nReturns `true` after `close()`.\n\n#### Event: `'segments'`\n\nEmitted after each Whisper transcription result. Behavior depends on mode:\n\n- With diarization (default): each emission contains all segments re-aligned against the latest speaker clustering. Earlier segments may get updated speaker labels as more data arrives. The final emission after `finalize()` is the definitive output.\n- With `transcriptionOnly: true`: each emission contains only the new segments from the latest Whisper result. Earlier segments never change, so incremental delivery is safe. Accumulate across emissions to build the full transcript.\n\n```typescript\n// With diarization (default): cumulative, re-aligned output\nsession.on('segments', (segments: AlignedSegment[]) => {\n  // `segments` contains the latest full speaker-labeled transcript so far\n  const latest = segments[segments.length - 1];\n  if (latest) {\n    const end = latest.start + latest.duration;\n    console.log(`[${latest.speaker}] ${latest.start.toFixed(2)}-${end.toFixed(2)} ${latest.text.trim()}`);\n  }\n});\n\n// With transcriptionOnly: incremental output, accumulate manually\nconst allSegments: AlignedSegment[] = [];\nsession.on('segments', (newSegments: AlignedSegment[]) => {\n  allSegments.push(...newSegments);\n  for (const seg of newSegments) {\n    const end = seg.start + seg.duration;\n    console.log(`${seg.start.toFixed(2)}-${end.toFixed(2)} ${seg.text.trim()}`);\n  }\n});\n```\n\n#### Event: `'audio'`\n\nEmitted in real-time with silence-filtered PCM chunks (`Float32Array`) as the pipeline processes audio.\n\n```typescript\nsession.on('audio', (chunk: Float32Array) => {\n  // `chunk` is silence-filtered audio emitted for streaming consumers\n});\n```\n\n### `processAgc`\n\n```typescript\nfunction processAgc(audio: Float32Array, sampleRate?: number): Float32Array;\n```\n\nStandalone WebRTC AGC2 audio normalization. Processes the entire audio buffer through the adaptive gain controller and returns the gain-normalized result.\n\n- `audio`: 16 kHz mono PCM samples in `[-1.0, 1.0]`\n- `sampleRate`: sample rate in Hz (default: `16000`)\n- Returns a new `Float32Array` with normalized audio\n\nThis is a synchronous, stateless operation — a new AGC instance is created and destroyed per call. For streaming use, AGC is integrated into the pipeline via `agcEnabled: true`.\n\n```typescript\nimport { processAgc } from 'pyannote-cpp-node';\n\nconst normalized = processAgc(quietAudio);\n// normalized has higher RMS energy than quietAudio\n```\n\n### Types\n\n```typescript\nexport interface PipelineConfig {\n  // === Required Model Paths ===\n  /** Path to segmentation GGUF model */\n  segModelPath: string;\n\n  /** Path to Whisper GGUF model */\n  whisperModelPath: string;\n\n  /** Path to embedding GGUF model (required unless transcriptionOnly is true) */\n  embModelPath?: string;\n\n  /** Path to PLDA GGUF model (required unless transcriptionOnly is true) */\n  pldaPath?: string;\n\n  // === Optional Model Paths ===\n  /** Path to Silero VAD model (optional, enables silence compression) */\n  vadModelPath?: string;\n\n  /**\n   * Transcription-only mode - skip speaker diarization (default: false).\n   * When true, embModelPath, pldaPath, and backend embedding assets are not required.\n   */\n  transcriptionOnly?: boolean;\n\n  /**\n   * Enable WebRTC AGC2 audio normalization at the pipeline ingress (default: false).\n   * When true, audio is gain-normalized before silence filtering and downstream processing.\n   */\n  agcEnabled?: boolean;\n\n  /** Required execution backend configuration */\n  backend: BackendConfig;\n\n  /** Suppress whisper.cpp log output (default: false) */\n  noPrints?: boolean;\n\n  // === Whisper Decode Options ===\n  /** Number of threads for Whisper inference (default: 4) */\n  nThreads?: number;\n\n  /** Language code (e.g., 'en', 'zh'). Omit for auto-detect. (default: 'en') */\n  language?: string;\n\n  /** Translate non-English speech to English (default: false) */\n  translate?: boolean;\n\n  /** Auto-detect spoken language. Overrides 'language' when true. (default: false) */\n  detectLanguage?: boolean;\n\n  // === Sampling ===\n  /** Sampling temperature. 0.0 = greedy deterministic. (default: 0.0) */\n  temperature?: number;\n\n  /** Temperature increment for fallback retries (default: 0.2) */\n  temperatureInc?: number;\n\n  /** Disable temperature fallback. If true, temperatureInc is ignored. (default: false) */\n  noFallback?: boolean;\n\n  /** Beam search size. -1 uses greedy decoding. >1 enables beam search. (default: -1) */\n  beamSize?: number;\n\n  /** Best-of-N sampling candidates for greedy decoding (default: 5) */\n  bestOf?: number;\n\n  // === Thresholds ===\n  /** Entropy threshold for decoder fallback (default: 2.4) */\n  entropyThold?: number;\n\n  /** Log probability threshold for decoder fallback (default: -1.0) */\n  logprobThold?: number;\n\n  /** No-speech probability threshold (default: 0.6) */\n  noSpeechThold?: number;\n\n  // === Context ===\n  /** Initial prompt text to condition the decoder (default: none) */\n  prompt?: string;\n\n  /** Don't use previous segment as context for next segment (default: true) */\n  noContext?: boolean;\n\n  /** Suppress blank outputs at the beginning of segments (default: true) */\n  suppressBlank?: boolean;\n\n  /** Suppress non-speech tokens (default: false) */\n  suppressNst?: boolean;\n}\n\nexport type BackendConfig =\n  | {\n      /** Metal backend on macOS */\n      type: 'metal';\n      /** GPU device index */\n      gpuDevice?: number;\n      /** Enable Flash Attention */\n      flashAttn?: boolean;\n      /** Path to segmentation model directory */\n      segPath: string;\n      /** Path to embedding model directory */\n      embPath: string;\n    }\n  | {\n      /** Vulkan backend on Windows */\n      type: 'vulkan';\n      /** GPU device index */\n      gpuDevice?: number;\n      /** Enable Flash Attention */\n      flashAttn?: boolean;\n    }\n  | {\n      /** CoreML backend on macOS */\n      type: 'coreml';\n      /** GPU device index */\n      gpuDevice?: number;\n      /** Enable Flash Attention */\n      flashAttn?: boolean;\n      /** Path to segmentation CoreML .mlpackage directory */\n      segPath: string;\n      /** Path to embedding CoreML .mlpackage directory */\n      embPath: string;\n      /** Path to Whisper encoder CoreML .mlmodelc directory */\n      whisperEncoderPath: string;\n    }\n  | {\n      /** OpenVINO hybrid backend on Windows */\n      type: 'openvino-hybrid';\n      /** GPU device index */\n      gpuDevice?: number;\n      /** Enable Flash Attention */\n      flashAttn?: boolean;\n      /** Path to Whisper encoder OpenVINO IR (.xml) */\n      whisperEncoderPath: string;\n      /** Path to embedding OpenVINO IR (.xml) */\n      embPath: string;\n      /** OpenVINO device target (default: 'GPU') */\n      openvinoDevice?: string;\n      /** OpenVINO model cache directory */\n      openvinoCacheDir?: string;\n    };\n\nexport interface DecodeOptions {\n  /** Language code (e.g., 'en', 'zh'). Omit for auto-detect. */\n  language?: string;\n  /** Translate non-English speech to English */\n  translate?: boolean;\n  /** Auto-detect spoken language. Overrides 'language' when true. */\n  detectLanguage?: boolean;\n  /** Number of threads for Whisper inference */\n  nThreads?: number;\n  /** Sampling temperature. 0.0 = greedy deterministic. */\n  temperature?: number;\n  /** Temperature increment for fallback retries */\n  temperatureInc?: number;\n  /** Disable temperature fallback. If true, temperatureInc is ignored. */\n  noFallback?: boolean;\n  /** Beam search size. -1 uses greedy decoding. >1 enables beam search. */\n  beamSize?: number;\n  /** Best-of-N sampling candidates for greedy decoding */\n  bestOf?: number;\n  /** Entropy threshold for decoder fallback */\n  entropyThold?: number;\n  /** Log probability threshold for decoder fallback */\n  logprobThold?: number;\n  /** No-speech probability threshold */\n  noSpeechThold?: number;\n  /** Initial prompt text to condition the decoder */\n  prompt?: string;\n  /** Don't use previous segment as context for next segment */\n  noContext?: boolean;\n  /** Suppress blank outputs at the beginning of segments */\n  suppressBlank?: boolean;\n  /** Suppress non-speech tokens */\n  suppressNst?: boolean;\n}\n\nexport interface AlignedSegment {\n  /** Global speaker label (e.g., SPEAKER_00). \"UNKNOWN\" when diarization could not assign a speaker. Empty string when transcriptionOnly is true. */\n  speaker: string;\n\n  /** Segment start time in seconds. */\n  start: number;\n\n  /** Segment duration in seconds. */\n  duration: number;\n\n  /** Transcribed text for this segment. */\n  text: string;\n}\n\nexport interface TranscriptionResult {\n  /** Transcript segments. Speaker-labeled when diarization is enabled; speaker is empty string in transcription-only mode. */\n  segments: AlignedSegment[];\n  /**\n   * Silence-filtered audio (16 kHz mono Float32Array).\n   * Present when a VAD model is loaded (`vadModelPath` in config).\n   * Silence longer than 2 seconds is compressed to 2 seconds.\n   * All segment timestamps are aligned to this audio —\n   * save it directly and timestamps will sync correctly.\n   */\n  filteredAudio?: Float32Array;\n}\n```\n\n## Usage Examples\n\n### Offline transcription (recommended for batch)\n\n```typescript\nimport { Pipeline } from 'pyannote-cpp-node';\n\nasync function runOffline(audio: Float32Array) {\n  const pipeline = await Pipeline.load({\n    segModelPath: './models/segmentation.gguf',\n    embModelPath: './models/embedding.gguf',\n    pldaPath: './models/plda.gguf',\n    whisperModelPath: './models/ggml-large-v3-turbo-q5_0.bin',\n    backend: {\n      type: 'coreml',\n      segPath: './models/segmentation.mlpackage',\n      embPath: './models/embedding.mlpackage',\n      whisperEncoderPath: './models/ggml-large-v3-turbo-q5_0-encoder.mlmodelc',\n    },\n  });\n\n  // Runs Whisper on full audio at once + offline diarization\n  const result = await pipeline.transcribeOffline(audio);\n\n  for (const seg of result.segments) {\n    const end = seg.start + seg.duration;\n    console.log(`[${seg.speaker}] ${seg.start.toFixed(2)}-${end.toFixed(2)} ${seg.text.trim()}`);\n  }\n\n  pipeline.close();\n}\n```\n\n### Offline transcription with silence filtering\n\nWhen a VAD model is provided, `transcribeOffline` automatically compresses silence longer than 2 seconds down to 2 seconds before running Whisper and diarization. The filtered audio is returned alongside segments so you can save it with correctly aligned timestamps.\n\n```typescript\nimport { Pipeline } from 'pyannote-cpp-node';\nimport { writeFileSync } from 'node:fs';\n\nasync function runOfflineWithVAD(audio: Float32Array) {\n  const pipeline = await Pipeline.load({\n    segModelPath: './models/segmentation.gguf',\n    embModelPath: './models/embedding.gguf',\n    pldaPath: './models/plda.gguf',\n    whisperModelPath: './models/ggml-large-v3-turbo-q5_0.bin',\n    backend: {\n      type: 'coreml',\n      segPath: './models/segmentation.mlpackage',\n      embPath: './models/embedding.mlpackage',\n      whisperEncoderPath: './models/ggml-large-v3-turbo-q5_0-encoder.mlmodelc',\n    },\n    vadModelPath: './models/ggml-silero-v6.2.0.bin', // enables silence filtering\n  });\n\n  const result = await pipeline.transcribeOffline(audio);\n\n  // Save the silence-filtered audio — timestamps in result.segments align to this\n  if (result.filteredAudio) {\n    // filteredAudio is 16 kHz mono Float32Array with silence compressed\n    writeFileSync('./output-filtered.pcm', Buffer.from(result.filteredAudio.buffer));\n    console.log(`Filtered: ${audio.length} -> ${result.filteredAudio.length} samples`);\n  }\n\n  for (const seg of result.segments) {\n    const end = seg.start + seg.duration;\n    console.log(`[${seg.speaker}] ${seg.start.toFixed(2)}-${end.toFixed(2)} ${seg.text.trim()}`);\n  }\n\n  pipeline.close();\n}\n```\n\n### Offline transcription with progress and live transcript preview\n\n```typescript\nimport { Pipeline } from 'pyannote-cpp-node';\n\nasync function runOfflineWithCallbacks(audio: Float32Array) {\n  const pipeline = await Pipeline.load({\n    segModelPath: './models/segmentation.gguf',\n    embModelPath: './models/embedding.gguf',\n    pldaPath: './models/plda.gguf',\n    whisperModelPath: './models/ggml-large-v3-turbo-q5_0.bin',\n    backend: {\n      type: 'coreml',\n      segPath: './models/segmentation.mlpackage',\n      embPath: './models/embedding.mlpackage',\n      whisperEncoderPath: './models/ggml-large-v3-turbo-q5_0-encoder.mlmodelc',\n    },\n  });\n\n  const result = await pipeline.transcribeOffline(\n    audio,\n    // Progress callback — phase 0 is Whisper (0-100%), phase 1 is diarization, phase 2 is alignment\n    (phase, progress) => {\n      if (phase === 0) updateProgressBar(progress);\n      if (phase === 1) showStatus('Identifying speakers...');\n      if (phase === 2) showStatus('Aligning speakers to transcript...');\n    },\n    // Segment callback — each Whisper segment as it's produced (before diarization)\n    (start, end, text) => {\n      appendToLivePreview(`[${start.toFixed(2)}-${end.toFixed(2)}] ${text}`);\n    },\n  );\n\n  console.log(`Done: ${result.segments.length} speaker-labeled segments`);\n  pipeline.close();\n}\n```\n\n### One-shot transcription (streaming internals)\n\n```typescript\nimport { Pipeline } from 'pyannote-cpp-node';\n\nasync function runOneShot(audio: Float32Array) {\n  const pipeline = await Pipeline.load({\n    segModelPath: './models/segmentation.gguf',\n    embModelPath: './models/embedding.gguf',\n    pldaPath: './models/plda.gguf',\n    whisperModelPath: './models/ggml-large-v3-turbo-q5_0.bin',\n    backend: {\n      type: 'coreml',\n      segPath: './models/segmentation.mlpackage',\n      embPath: './models/embedding.mlpackage',\n      whisperEncoderPath: './models/ggml-large-v3-turbo-q5_0-encoder.mlmodelc',\n    },\n  });\n\n  // Uses streaming pipeline internally (push 1s chunks + finalize)\n  const result = await pipeline.transcribe(audio);\n\n  for (const seg of result.segments) {\n    const end = seg.start + seg.duration;\n    console.log(`[${seg.speaker}] ${seg.start.toFixed(2)}-${end.toFixed(2)} ${seg.text.trim()}`);\n  }\n\n  pipeline.close();\n}\n```\n\n### Streaming transcription\n\n```typescript\nimport { Pipeline } from 'pyannote-cpp-node';\n\nasync function runStreaming(audio: Float32Array) {\n  const pipeline = await Pipeline.load({\n    segModelPath: './models/segmentation.gguf',\n    embModelPath: './models/embedding.gguf',\n    pldaPath: './models/plda.gguf',\n    whisperModelPath: './models/ggml-large-v3-turbo-q5_0.bin',\n    backend: {\n      type: 'coreml',\n      segPath: './models/segmentation.mlpackage',\n      embPath: './models/embedding.mlpackage',\n      whisperEncoderPath: './models/ggml-large-v3-turbo-q5_0-encoder.mlmodelc',\n    },\n  });\n\n  const session = pipeline.createSession();\n  // Diarization mode (default): each event is cumulative and may relabel earlier segments\n  session.on('segments', (segments) => {\n    const latest = segments[segments.length - 1];\n    if (latest) {\n      const end = latest.start + latest.duration;\n      console.log(`[live][${latest.speaker}] ${latest.start.toFixed(2)}-${end.toFixed(2)} ${latest.text.trim()}`);\n    }\n  });\n\n  session.on('audio', (chunk) => {\n    console.log(`silence-filtered audio chunk: ${chunk.length} samples`);\n  });\n\n  const chunkSize = 16000;\n  for (let i = 0; i < audio.length; i += chunkSize) {\n    const chunk = audio.slice(i, Math.min(i + chunkSize, audio.length));\n    const { vad, rms } = await session.push(chunk);\n    if (vad.length > 0) {\n      const speechFrames = vad.filter(Boolean).length;\n      const avgRms = rms.reduce((a, b) => a + b, 0) / rms.length;\n      console.log(`VAD: ${vad.length} frames (${speechFrames} speech), avg RMS: ${avgRms.toFixed(4)}`);\n    }\n  }\n\n  const finalResult = await session.finalize();\n  console.log(`Final segments: ${finalResult.segments.length}`);\n\n  await session.close();\n  pipeline.close();\n}\n```\n\n```typescript\nimport { Pipeline, type AlignedSegment } from 'pyannote-cpp-node';\n\nasync function runStreamingTranscriptionOnly(audio: Float32Array) {\n  const pipeline = await Pipeline.load({\n    segModelPath: './models/segmentation.gguf',\n    whisperModelPath: './models/ggml-large-v3-turbo-q5_0.bin',\n    transcriptionOnly: true,\n    backend: {\n      type: 'coreml',\n      segPath: './models/segmentation.mlpackage',\n      embPath: './models/embedding.mlpackage',\n      whisperEncoderPath: './models/ggml-large-v3-turbo-q5_0-encoder.mlmodelc',\n    },\n  });\n\n  const session = pipeline.createSession();\n\n  // Transcription-only: each event has only NEW segments\n  const allSegments: AlignedSegment[] = [];\n  session.on('segments', (newSegments) => {\n    allSegments.push(...newSegments);\n    for (const seg of newSegments) {\n      const end = seg.start + seg.duration;\n      console.log(`${seg.start.toFixed(2)}-${end.toFixed(2)} ${seg.text.trim()}`);\n    }\n  });\n\n  const chunkSize = 16000;\n  for (let i = 0; i < audio.length; i += chunkSize) {\n    const chunk = audio.slice(i, Math.min(i + chunkSize, audio.length));\n    await session.push(chunk);\n  }\n\n  const finalResult = await session.finalize();\n  console.log(`Final segments from finalize(): ${finalResult.segments.length}`);\n  console.log(`Accumulated from incremental events: ${allSegments.length}`);\n\n  await session.close();\n  pipeline.close();\n}\n```\n\n### Graceful shutdown\n\nUse `cancel()` to stop in-flight native work before tearing down resources. This is useful for long offline or streaming runs that should exit promptly on `Ctrl+C`.\n\n```typescript\nconst pipeline = await Pipeline.load(config);\nconst session = pipeline.createSession();\n\nprocess.once('SIGINT', async () => {\n  session.cancel();\n  pipeline.cancel();\n  await session.close().catch(() => {});\n  pipeline.close();\n  process.exit(130);\n});\n```\n\n### Custom Whisper decode options\n\n```typescript\nimport { Pipeline } from 'pyannote-cpp-node';\n\nconst pipeline = await Pipeline.load({\n  segModelPath: './models/segmentation.gguf',\n  embModelPath: './models/embedding.gguf',\n  pldaPath: './models/plda.gguf',\n  whisperModelPath: './models/ggml-large-v3-turbo-q5_0.bin',\n  backend: {\n    type: 'coreml',\n    segPath: './models/segmentation.mlpackage',\n    embPath: './models/embedding.mlpackage',\n    whisperEncoderPath: './models/ggml-large-v3-turbo-q5_0-encoder.mlmodelc',\n    flashAttn: true,\n    gpuDevice: 0,\n  },\n\n  // Decode strategy\n  nThreads: 8,\n  language: 'ko',\n  translate: false,\n  detectLanguage: false,\n  temperature: 0.0,\n  temperatureInc: 0.2,\n  noFallback: false,\n  beamSize: 5,\n  bestOf: 5,\n\n  // Thresholds and context\n  entropyThold: 2.4,\n  logprobThold: -1.0,\n  noSpeechThold: 0.6,\n  prompt: 'Meeting transcript with technical terminology.',\n  noContext: true,\n  suppressBlank: true,\n  suppressNst: false,\n});\n```\n\n### Changing language at runtime\n\n```typescript\nimport { Pipeline } from 'pyannote-cpp-node';\n\nconst pipeline = await Pipeline.load({\n  segModelPath: './models/segmentation.gguf',\n  embModelPath: './models/embedding.gguf',\n  pldaPath: './models/plda.gguf',\n  whisperModelPath: './models/ggml-large-v3-turbo-q5_0.bin',\n  backend: {\n    type: 'coreml',\n    segPath: './models/segmentation.mlpackage',\n    embPath: './models/embedding.mlpackage',\n    whisperEncoderPath: './models/ggml-large-v3-turbo-q5_0-encoder.mlmodelc',\n  },\n  language: 'en',\n});\n\n// First transcription in English\nconst result1 = await pipeline.transcribe(englishAudio);\n\n// Switch to Korean for the next transcription\npipeline.setLanguage('ko');\nconst result2 = await pipeline.transcribe(koreanAudio);\n\n// Or update multiple decode options at once\npipeline.setDecodeOptions({\n  language: 'zh',\n  temperature: 0.2,\n  beamSize: 5,\n});\nconst result3 = await pipeline.transcribe(chineseAudio);\n\npipeline.close();\n```\n\n### Switching execution backend at runtime (macOS)\n\n```typescript\nimport { Pipeline } from 'pyannote-cpp-node';\n\n// Start with Metal\nconst pipeline = await Pipeline.load({\n  segModelPath: './models/segmentation.gguf',\n  embModelPath: './models/embedding.gguf',\n  pldaPath: './models/plda.gguf',\n  whisperModelPath: './models/ggml-large-v3-turbo-q5_0.bin',\n  backend: {\n    type: 'metal',\n    segPath: './models/segmentation.mlpackage',\n    embPath: './models/embedding.mlpackage',\n  },\n});\n\n// Switch to CoreML\nawait pipeline.setExecutionBackend({\n  type: 'coreml',\n  segPath: './models/segmentation.mlpackage',\n  embPath: './models/embedding.mlpackage',\n  whisperEncoderPath: './models/ggml-large-v3-turbo-q5_0-encoder.mlmodelc',\n});\nconst result1 = await pipeline.transcribeOffline(audio);\n\n// Switch back to Metal\nawait pipeline.setExecutionBackend({\n  type: 'metal',\n  segPath: './models/segmentation.mlpackage',\n  embPath: './models/embedding.mlpackage',\n});\nconst result2 = await pipeline.transcribeOffline(audio);\n\npipeline.close();\n```\n\n## Execution Backends\n\n`setExecutionBackend(backend)` switches the inference backend at runtime.\n\n- On macOS: supports `metal` and `coreml`\n- On Windows: supports `vulkan` and `openvino-hybrid`\n- `openvino-hybrid` uses OpenVINO for the Whisper encoder and embedding model, and Vulkan for everything else\n- `gpuDevice` and `flashAttn` are configured inside the backend object\n\n```typescript\nconst pipeline = await Pipeline.load({\n  segModelPath: './models/segmentation.gguf',\n  embModelPath: './models/embedding.gguf',\n  pldaPath: './models/plda.gguf',\n  whisperModelPath: './models/ggml-large-v3-turbo-q5_0.bin',\n  language: 'en',\n  backend: {\n    type: 'openvino-hybrid',\n    whisperEncoderPath: './models/ggml-large-v3-turbo-encoder-openvino.xml',\n    embPath: './models/embedding-openvino.xml',\n  },\n});\n\n// Switch to OpenVINO-hybrid at runtime\nawait pipeline.setExecutionBackend({\n  type: 'openvino-hybrid',\n  whisperEncoderPath: './models/ggml-large-v3-turbo-encoder-openvino.xml',\n  embPath: './models/embedding-openvino.xml',\n});\nconst result = await pipeline.transcribeOffline(audio);\n\n// Switch back to Vulkan\nawait pipeline.setExecutionBackend({ type: 'vulkan' });\n```\n\nStreaming sessions also support runtime changes:\n\n```typescript\nconst session = pipeline.createSession();\n\nsession.on('segments', (segments) => {\n  console.log(segments);\n});\n\n// Push English audio\nawait session.push(englishChunk);\n\n// Switch language mid-stream — takes effect on the next Whisper decode\nsession.setLanguage('ko');\nawait session.push(koreanChunk);\n\nconst result = await session.finalize();\n\nawait session.close();\n```\n\n## JSON Output Format\n\nThe pipeline returns this JSON shape:\n\n```json\n{\n  \"segments\": [\n    {\n      \"speaker\": \"SPEAKER_00\",\n      \"start\": 0.497000,\n      \"duration\": 2.085000,\n      \"text\": \"Hello world\"\n    }\n  ]\n}\n```\n\nWhen `transcriptionOnly` is `true`, the `speaker` field is an empty string:\n\n```json\n{\n  \"segments\": [\n    {\n      \"speaker\": \"\",\n      \"start\": 0.497000,\n      \"duration\": 2.085000,\n      \"text\": \"Hello world\"\n    }\n  ]\n}\n```\n\n## Audio Format Requirements\n\n- Input must be `Float32Array`\n- Sample rate must be `16000` Hz\n- Audio must be mono\n- Recommended amplitude range: `[-1.0, 1.0]`\n\nAll API methods expect decoded PCM samples; file decoding/resampling is handled by the caller.\n\n## Architecture\n\n### Offline mode (`transcribeOffline`)\n\n1. VAD silence filter (optional — compresses silence >2s to 2s when `vadModelPath` provided)\n2. Single `whisper_full()` call on filtered audio\n3. Offline diarization (segmentation → powerset → embeddings → PLDA → AHC → VBx) on filtered audio\n4. WhisperX-style alignment (speaker assignment by maximum segment overlap)\n5. Return segments + filtered audio bytes (timestamps aligned to filtered audio)\n\nIn transcription-only mode, steps 3 (diarization) and 4 (alignment) are skipped.\n\n### Streaming mode (`transcribe` / `createSession`)\n\nThe streaming pipeline runs in 8 stages:\n\n0. AGC2 normalization (optional — enabled via `agcEnabled: true`)\n1. VAD silence filter (optional compression of long silence)\n2. Audio buffer (stream-safe FIFO with timestamp tracking)\n3. Segmentation (speech activity over rolling windows)\n4. Transcription (Whisper sentence-level segments)\n5. Alignment (segment-level speaker assignment by overlap)\n6. Finalize (flush + final recluster + final alignment)\n7. Callback/event emission (`segments` updates + `audio` chunk streaming)\n\nIn transcription-only mode, steps 5 (alignment) and 6 (recluster) are skipped, and segments are emitted with an empty `speaker` field. Each `segments` event contains only the new segments from that Whisper call (incremental), unlike diarization mode which re-emits all segments after each recluster (cumulative).\n\n## Performance\n\n- Offline transcription + diarization: **~12x real-time** (30s audio in 2.5s)\n- Diarization only: **39x real-time**\n- Integrated streaming transcription + diarization: **~14.6x real-time**\n- 45-minute Korean meeting test (6 speakers): **2713s audio in 186s**\n- Each Whisper segment maps 1:1 to a speaker-labeled segment (no merging)\n- Speaker confusion rate: **2.55%**\n\n## Warnings and Known Issues\n\n### Intel Integrated GPU (Iris Xe) - Vulkan driver memory leak\n\n- Intel Iris Xe (12th/13th gen) Vulkan drivers have a known memory leak when GPU contexts are repeatedly created and destroyed\n- This is a confirmed Intel driver bug (Intel internal tracking ID: 14022504159), not a bug in this library\n- Affects: repeated `Pipeline.load()` / `pipeline.close()` cycles in the same process (crashes after ~8-10 cycles)\n- Affects: repeated `setExecutionBackend()` calls (each call tears down and rebuilds the full GPU context)\n- Does NOT affect: creating/closing sessions (sessions borrow cached GPU contexts, no new Vulkan allocations)\n- Does NOT affect: NVIDIA or AMD discrete GPUs, or Intel Core Ultra (newer gen) integrated GPUs\n- Workaround: load the pipeline once at application startup and reuse it. Close only at shutdown.\n- Reference: https://community.intel.com/t5/Developing-Games-on-Intel/Memory-leaks-on-Intel-Iris-Xe-graphics/td-p/1585566\n\n### setExecutionBackend is a heavy operation\n\n- Each call fully tears down and reloads the model cache (Whisper context, GGML models, Vulkan/OpenVINO backends)\n- Takes ~5-6 seconds on Intel Iris Xe\n- Treat it as a one-time configuration change, not something to call repeatedly\n- On Intel iGPU: limit to 1-2 switches per process lifetime to avoid the driver leak\n\n### One operation at a time\n\nThe pipeline enforces exclusive access to its GPU resources. Only one of the following can be active at a time:\n\n- A streaming session (`createSession()`)\n- A one-shot transcription (`transcribe()`)\n- An offline transcription (`transcribeOffline()`)\n- A backend switch (`setExecutionBackend()`)\n\nAttempting to start a second operation while one is active throws an error. Close the current session or wait for the current operation to complete before starting the next one.\n\nIf you need to stop the current operation early, call `cancel()` and wait for the in-flight promise to reject before starting the next operation.\n\n```typescript\n// CORRECT: sequential operations\nconst session = pipeline.createSession();\n// ... push audio, finalize ...\nawait session.close();\nconst result = await pipeline.transcribeOffline(audio); // OK — session is closed\n\n// ERROR: concurrent operations\nconst session1 = pipeline.createSession();\nconst session2 = pipeline.createSession(); // throws: \"A session is already active\"\nawait pipeline.transcribeOffline(audio);   // throws: \"Model is busy\"\n```\n\n### Session creation is cheap\n\n- `createSession()` borrows pre-loaded models and GPU contexts from the cache\n- No new Vulkan backends or model loads occur\n- Close the session when done, then create another — safe to repeat unlimited times\n\n```typescript\n// SAFE: load once, create many sessions sequentially\nconst pipeline = await Pipeline.load(config);\nfor (const file of files) {\n  const session = pipeline.createSession();\n  // ... push audio, finalize ...\n  await session.close(); // cheap — no GPU teardown\n}\npipeline.close(); // once, at shutdown\n\n// DANGEROUS on Intel iGPU: repeated load/close cycles\nfor (const file of files) {\n  const pipeline = await Pipeline.load(config); // creates Vulkan context\n  await pipeline.transcribe(audio);\n  pipeline.close(); // destroys Vulkan context - driver leaks ~8th cycle crashes\n}\n```\n\n## Platform Support\n\n| Platform | Low-level (Whisper/VAD) | Pipeline (Transcription + Diarization) |\n| --- | --- | --- |\n| macOS arm64 (Apple Silicon) | Supported | Supported (CoreML + Metal) |\n| Windows x64 | Supported | Supported (Vulkan + optional OpenVINO) |\n| macOS x64 (Intel) | Supported | Not tested |\n| Linux | Not supported | Not supported |\n\n## License\n\nMIT\n","readmeFilename":"README.md"}