{"id":21423919,"url":"https://github.com/picovoice/eagle","last_synced_at":"2025-04-09T18:17:45.872Z","repository":{"id":169951516,"uuid":"635558237","full_name":"Picovoice/eagle","owner":"Picovoice","description":"On-device speaker recognition engine powered by deep learning ","archived":false,"fork":false,"pushed_at":"2025-03-17T21:19:53.000Z","size":38113,"stargazers_count":33,"open_issues_count":0,"forks_count":5,"subscribers_count":9,"default_branch":"main","last_synced_at":"2025-04-09T18:17:38.604Z","etag":null,"topics":["speaker-embedding","speaker-identification","speaker-recognition"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Picovoice.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2023-05-03T00:35:25.000Z","updated_at":"2025-03-19T02:25:37.000Z","dependencies_parsed_at":"2025-02-05T20:38:10.511Z","dependency_job_id":"91393087-4615-4c18-91a5-09b712b668ca","html_url":"https://github.com/Picovoice/eagle","commit_stats":null,"previous_names":["picovoice/eagle"],"tags_count":8,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Picovoice%2Feagle","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Picovoice%2Feagle/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Picovoice%2Feagle/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Picovoice%2Feagle/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Picovoice","download_url":"https://codeload.github.com/Picovoice/eagle/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248085321,"owners_count":21045139,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["speaker-embedding","speaker-identification","speaker-recognition"],"created_at":"2024-11-22T21:18:52.110Z","updated_at":"2025-04-09T18:17:45.851Z","avatar_url":"https://github.com/Picovoice.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Eagle\n\n[![GitHub release](https://img.shields.io/github/release/Picovoice/Eagle.svg)](https://github.com/Picovoice/Eagle/releases)\n[![GitHub](https://img.shields.io/github/license/Picovoice/eagle)](https://github.com/Picovoice/eagle/)\n\n[![Maven Central](https://img.shields.io/maven-central/v/ai.picovoice/eagle-android?label=maven-central%20%5Bandroid%5D)](https://repo1.maven.org/maven2/ai/picovoice/eagle-android/)\n[![npm](https://img.shields.io/npm/v/@picovoice/eagle-node?label=npm%20%5Bnode%5D)](https://www.npmjs.com/package/@picovoice/eagle-node)\n[![npm](https://img.shields.io/npm/v/@picovoice/eagle-web?label=npm%20%5Bweb%5D)](https://www.npmjs.com/package/@picovoice/eagle-web)\n[![CocoaPods](https://img.shields.io/cocoapods/v/Eagle-iOS)](https://cocoapods.org/pods/Eagle-iOS)\u003c!-- markdown-link-check-disable-line --\u003e\n[![PyPI](https://img.shields.io/pypi/v/pveagle)](https://pypi.org/project/pveagle/)\n\nMade in Vancouver, Canada by [Picovoice](https://picovoice.ai)\n\n[![Twitter URL](https://img.shields.io/twitter/url?label=%40AiPicovoice\u0026style=social\u0026url=https%3A%2F%2Ftwitter.com%2FAiPicovoice)](https://twitter.com/AiPicovoice)\u003c!-- markdown-link-check-disable-line --\u003e\n[![YouTube Channel Views](https://img.shields.io/youtube/channel/views/UCAdi9sTCXLosG1XeqDwLx7w?label=YouTube\u0026style=social)](https://www.youtube.com/channel/UCAdi9sTCXLosG1XeqDwLx7w)\n\nEagle is an on-device speaker recognition engine. Eagle is:\n\n- Private; All voice processing runs locally.\n- [Accurate](https://picovoice.ai/docs/benchmark/speaker-recognition/#accuracy)\n- Language-agnostic and text-independent\n- Optimized for real-time processing\n- Cross-Platform:\n    - Linux (x86_64), macOS (x86_64, arm64), Windows (x86_64, arm64)\n    - Android and iOS\n    - Chrome, Safari, Firefox, and Edge\n    - Raspberry Pi (3, 4, 5)\n\n\n## Table of Contents\n\n- [Eagle](#eagle)\n  - [Table of Contents](#table-of-contents)\n  - [Overview](#overview)\n  - [AccessKey](#accesskey)\n  - [Demos](#demos)\n    - [Python Demos](#python-demos)\n    - [Android Demo](#android-demo)\n    - [iOS Demo](#ios-demo)\n    - [C Demos](#c-demos)\n    - [Web Demo](#web-demo)\n    - [Node.js](#nodejs-demos)\n  - [SDKs](#sdks)\n    - [Python](#python)\n    - [Android](#android)\n    - [iOS](#ios)\n    - [C](#c)\n    - [Web](#web)\n    - [Node.js](#nodejs)\n  - [Releases](#releases)\n  - [FAQ](#faq)\n\n## Overview\n\nEagle consists of two distinct steps: Enrollment and Recognition. In the enrollment step, Eagle analyzes a series of\nutterances from a particular speaker to learn their unique voiceprint. This step results in a `Profile`,\nwhich can be stored and utilized in the next step. During the Recognition step, Eagle registers speakers using\nthe `Profile`s generated in the enrollment phase. Then, Eagle compares the incoming frames of audio to the voiceprints\nof all enrolled speakers in real-time to determine the similarity between them.\n\n## AccessKey\n\nAccessKey is your authentication and authorization token for deploying Picovoice SDKs, including Eagle. Anyone who is\nusing Picovoice needs to have a valid AccessKey. You must keep your AccessKey secret. You would need internet\nconnectivity to validate your AccessKey with Picovoice license servers even though the speaker recognition is running\n100% offline.\n\nAccessKey also verifies that your usage is within the limits of your account. Everyone who signs up for\n[Picovoice Console](https://console.picovoice.ai/) receives the `Free Tier` usage rights described\n[here](https://picovoice.ai/pricing/). If you wish to increase your limits, you can purchase a subscription plan.\n\n## Demos\n\n### Python Demos\n\nInstall the demo package:\n\n```console\npip3 install pveagledemo\n```\n\n#### Speaker Enrollment\n\nCreate a new speaker profile:\n\n```console\neagle_demo_mic enroll --access_key ${ACCESS_KEY} --output_profile_path ${OUTPUT_PROFILE_PATH}\n```\n\nor\n\n```console\neagle_demo_file enroll \\\n    --access_key ${ACCESS_KEY} \\\n    --enroll_audio_paths ${ENROLL_AUDIO_PATHS}\n    --output_profile_path ${OUTPUT_PROFILE_PATH}\n```\n\n#### Speaker Recognition\n\nTest the speaker recognition engine:\n\n```console\neagle_demo_mic test \\\n    --access_key ${ACCESS_KEY} \\\n    --input_profile_paths ${INPUT_PROFILE_PATH}\n```\n\nor\n\n```console\neagle_demo_file test \\\n    --access_key ${ACCESS_KEY} \\\n    --input_profile_paths ${INPUT_PROFILE_PATH}\n    --test_audio_paths ${TEST_AUDIO_PATHS}\n```\n\nReplace `${ACCESS_KEY}` with yours obtained from Picovoice Console.\n\nFor more information about Python demos go to [demo/python](./demo/python).\n\n### Android Demo\n\nUsing Android Studio, open [demo/android/EagleDemo](./demo/android/EagleDemo) as an Android project and then run the application.\n\nOpen the file [MainActivity.java](./demo/android/EagleDemo/eagle-demo-app/src/main/java/ai/picovoice/eagledemo/MainActivity.java) and replace `\"${YOUR_ACCESS_KEY_HERE}\"` in with your `AccessKey`.\n\n\n### iOS Demo\n\nTo run the demo, go to [demo/ios/EagleDemo](./demo/ios/EagleDemo) and run:\n\n```console\npod install\n```\n\nReplace `let accessKey = \"${YOUR_ACCESS_KEY_HERE}\"` in the file [ViewModel.swift](./demo/ios/EagleDemo/EagleDemo/ViewModel.swift) with your `AccessKey`.\n\nThen, using [Xcode](https://developer.apple.com/xcode/), open the generated `EagleDemo.xcworkspace` and run the application.\n\n### C Demos\n\nBuild the demo:\n\n```console\ncmake -S demo/c/ -B demo/c/build \u0026\u0026 cmake --build demo/c/build --target eagle_demo_mic\n```\n\nTo list the available audio input devices:\n\n```console\n./demo/c/build/eagle_demo_mic -s\n```\n\n#### Speaker Enrollment\n\nTo enroll a new speaker:\n\n```console\n./demo/c/build/eagle_demo_mic -l ${LIBRARY_PATH} -m ${MODEL_PATH} -a ${ACCESS_KEY} -e ${OUTPUT_PROFILE_PATH}\n```\n\n#### Speaker Recognition\n\nTo test the speaker recognition engine:\n\n```console\n./demo/c/build/eagle_demo_mic -l ${LIBRARY_PATH} -m ${MODEL_PATH} -a ${ACCESS_KEY} -i ${INPUT_PROFILE_PATH}\n```\n\nReplace `${LIBRARY_PATH}` with path to appropriate library available under [lib](./lib), `${MODEL_PATH}` with path\nto the model file available under [lib/common](./lib/common), `${ACCESS_KEY}` with AccessKey\nobtained from [Picovoice Console](https://console.picovoice.ai/). `${OUTPUT_PROFILE_PATH}` in the enrollment step is the\npath to the generated speaker profile. `${INPUT_PROFILE_PATH}` in the recognition step is the path to the generated\nspeaker\nprofile to be tested.\n\nFor more information about C demos go to [demo/c](./demo/c).\n\n### Web Demo\n\nFrom [demo/web](./demo/web) run the following in the terminal:\n\n```console\nyarn\nyarn start\n```\n\n(or)\n\n```console\nnpm install\nnpm run start\n```\n\nOpen `http://localhost:5000` in your browser to try the demo.\n\n### Node.js Demos\n\nInstall the demo package:\n\n```console\nnpm install -g @picovoice/eagle-node-demo\n```\n\n#### Speaker Enrollment\n\nCreate a new speaker profile:\n\n```console\neagle-mic-demo --enroll \\\n    --access_key ${ACCESS_KEY} \\\n    --output_profile_path ${OUTPUT_PROFILE_PATH}\n```\n\nor\n\n```console\neagle-file-demo --enroll \\\n    --access_key ${ACCESS_KEY} \\\n    --enroll_audio_paths ${ENROLL_AUDIO_PATH_1 ...} \\\n    --output_profile_path ${OUTPUT_PROFILE_PATH}\n```\n\n#### Speaker Recognition\n\nTest the speaker recognition engine:\n\n```console\neagle-mic-demo --test \\\n    --access_key ${ACCESS_KEY} \\\n    --input_profile_paths ${INPUT_PROFILE_PATH_1 ...}\n```\n\nor\n\n```console\neagle-file-demo --test \\\n    --access_key ${ACCESS_KEY} \\\n    --test_audio_path ${TEST_AUDIO_PATH} \\\n    --input_profile_paths ${INPUT_PROFILE_PATH_1 ...}\n```\n\nReplace `${ACCESS_KEY}` with yours obtained from Picovoice Console.\n\nFor more information about Node.js demos go to [demo/nodejs](./demo/nodejs).\n\n## SDKs\n\n### Python\n\nInstall the Python SDK:\n\n```console\npip3 install pveagle\n```\n\n#### Speaker Enrollment\n\nCreate an instance of the profiler:\n\n```python\nimport pveagle\n\n# AccessKey obtained from Picovoice Console (https://console.picovoice.ai/)\naccess_key = \"${ACCESS_KEY}\"\neagle_profiler = pveagle.create_profiler(access_key)\n```\n\nCreate a new speaker profile:\n\n```python\ndef get_next_enroll_audio_data():\n    pass\n\n\npercentage = 0.0\nwhile percentage \u003c 100.0:\n    percentage, error = eagle_profiler.enroll(get_next_enroll_audio_data())\n```\n\nExport the speaker profile once enrollment is complete:\n\n```python\nspeaker_profile = eagle_profiler.export()\n```\n\nRelease the resources acquired by the profiler:\n\n```python\neagle_profiler.delete()\n```\n\n#### Speaker Recognition\n\nCreate an instance of the engine using the speaker profile exported before:\n\n```python\neagle = pveagle.create_recognizer(access_key, speaker_profile)\n```\n\nProcess incoming audio frames:\n\n```python\ndef get_next_audio_frame():\n    pass\n\n\nwhile True:\n    score = eagle.process(get_next_audio_frame())\n```\n\nFinally, when done be sure to explicitly release the resources:\n\n```python\neagle.delete()\n```\n\n### Android\n\nTo include the package in your Android project, ensure you have included `mavenCentral()` in your top-level `build.gradle` file and then add the following to your app's `build.gradle`:\n\n```groovy\ndependencies {\n    implementation 'ai.picovoice:eagle-android:${LATEST_VERSION}'\n}\n```\n\n#### Speaker Enrollment\n\nCreate an instance of the profiler:\n\n```java\nimport ai.picovoice.eagle.*;\n\nfinal String accessKey = \"${ACCESS_KEY}\";\n\ntry {\n    EagleProfiler eagleProfiler = new EagleProfiler.Builder()\n            .setAccessKey(accessKey)\n            .build();\n} catch (EagleException e) { }\n```\n\nCreate a new speaker profile:\n\n```java\npublic short[] getNextEnrollAudioData() {\n    // get audio data\n}\n\nEagleProfilerEnrollResult result = null;\ntry {\n    while (result != null \u0026\u0026 result.getPercentage() \u003c 100.0) {\n        result = eagleProfiler.enroll(getNextEnrollAudioData());\n    }\n} catch (EagleException e) { }\n```\n\nExport the speaker profile once enrollment is complete:\n\n```java\ntry {\n    EagleProfile speakerProfile = eagleProfiler.export();\n} catch (EagleException e) { }\n```\n\nRelease the resources acquired by the profiler:\n\n```java\neagleProfiler.delete();\n```\n\n#### Speaker Recognition\n\nCreate an instance of the engine using the speaker profile exported before:\n\n```java\nimport ai.picovoice.eagle.*;\n\nfinal String accessKey = \"${ACCESS_KEY}\";\n\ntry {\n    Eagle eagle = new Eagle.Builder()\n        .setAccessKey(accessKey)\n        .setSpeakerProfile(speakerProfile)\n        .build();\n} catch (EagleException e) { }\n```\n\nProcess incoming audio frames:\n\n```java\npublic short[] getNextAudioFrame() {\n    // get audio frame\n}\n\n\ntry {\n    while (true) {\n        float[] scores = eagle.process(getNextAudioFrame());\n    }\n} catch (EagleException e) { }\n```\n\nFinally, when done be sure to explicitly release the resources:\n\n```java\neagle.delete()\n```\n\n### iOS\n\n\u003c!-- markdown-link-check-disable --\u003e\nThe Eagle iOS binding is available via [CocoaPods](https://cocoapods.org/pods/Eagle-iOS). To import it into your iOS project, add the following line to your Podfile and run `pod install`:\n\u003c!-- markdown-link-check-enable --\u003e\n\n```ruby\npod 'Eagle-iOS'\n```\n\n#### Speaker Enrollment\n\nCreate an instance of the profiler:\n\n```swift\nimport pveagle\n\nlet accessKey : String = // .. AccessKey obtained from Picovoice Console (https://console.picovoice.ai/)\nlet eagleProfiler = try EagleProfiler(accessKey: accessKey)\n```\n\nCreate a new speaker profile:\n\n```swift\nfunc get_next_enroll_audio_data(numSamples: Int) -\u003e [Int16] {\n    // ...\n}\n\ndo {\n    let numSamples = eagleProfiler.minEnrollSamples()\n\n    var percentage = 0.0\n    var feedback: EagleProfilerEnrollFeedback?\n\n    while (percentage \u003c 100.0) {\n        (percentage, feedback) = try eagleProfiler.enroll(pcm: get_next_enroll_audio_data(numSamples: numSamples))\n    }\n} catch { }\n```\n\nExport the speaker profile once enrollment is complete:\n\n```swift\nlet speakerProfile = try eagleProfiler.export()\n```\n\nRelease the resources acquired by the profiler:\n\n```swift\neagleProfiler.delete()\n```\n\n#### Speaker Recognition\n\nCreate an instance of the engine using the speaker profile exported before:\n\n```swift\nlet eagle = Eagle(accessKey: accessKey, speakerProfiles: [speakerProfile])\n```\n\nProcess incoming audio frames:\n\n```swift\nfunc get_next_audio_frame() -\u003e [Int16] {\n    // ...\n}\n\ndo {\n    let profileScores = try eagle.process(pcm: get_next_audio_frame())\n} catch { }\n```\n\nFinally, when done be sure to explicitly release the resources:\n\n```swift\neagle.delete()\n```\n\n### C\n\n[include/pv_eagle.h](./include/pv_eagle.h) header file contains relevant information.\n\n#### Speaker Enrollment\n\nBuild an instance of the profiler:\n\n```c\nconst char *access_key = \"${ACCESS_KEY}\";\nconst char *model_path = \"${MODEL_PATH}\";\n\npv_eagle_profiler_t *eagle_profiler = NULL;\npv_status_t status = pv_eagle_profiler_init(\n            access_key,\n            model_path,\n            \u0026eagle_profiler);\nif (status != PV_STATUS_SUCCESS) {\n    // error handling logic\n}\n```\n\nReplace `${ACCESS_KEY}` with the AccessKey obtained from Picovoice Console, and `${MODEL_PATH}` with the path to the\nmodel file available under [lib/common](./lib/common).\n\nUse `eagle_profiler` to create a new speaker profile:\n\n```c\nextern const int16_t *get_next_enroll_audio_frame(void);\nextern const int32_t get_next_enroll_audio_num_samples(void);\n\nfloat enroll_percentage = 0.0f;\npv_eagle_profiler_enroll_feedback_t feedback = PV_EAGLE_PROFILER_ENROLLMENT_ERROR_AUDIO_OK;\n\nwhile (enroll_percentage \u003c 100.0f) {\n  status = pv_eagle_profiler_enroll(\n          eagle_profiler,\n          get_next_enroll_audio_frame(),\n          get_next_enroll_audio_num_samples(),\n          \u0026feedback,\n          \u0026enroll_percentage);\n  if (status != PV_STATUS_SUCCESS) {\n      // error handling logic\n  }\n}\n\nint32_t profile_size_bytes = 0;\nstatus = pv_eagle_profiler_export_size(eagle_profiler, \u0026profile_size_bytes);\nvoid *speaker_profile = malloc(profile_size_bytes);\nstatus = pv_eagle_profiler_export(\n        eagle_profiler,\n        speaker_profile);\nif (status != PV_STATUS_SUCCESS) {\n    // error handling logic\n}\n```\n\nOnce the speaker profile is exported, the resources acquired by the profiler can be released:\n\n```c\npv_eagle_profiler_delete(eagle_profiler);\n```\n\n#### Speaker Recognition\n\nCreate an instance of the engine using the speaker profile exported before:\n\n```c\npv_eagle_t *eagle = NULL;\npv_status_t status = pv_eagle_init(\n        access_key,\n        model_path,\n        1,\n        (const void *const *) \u0026speaker_profile,\n        \u0026eagle);\nif (status != PV_STATUS_SUCCESS) {\n    // error handling logic\n}\n```\n\nNow the `eagle` can be used to process incoming audio frames:\n\n```c\nextern const int16_t *get_next_audio_frame(void);\nconst int32_t frame_length = pv_eagle_frame_length();\n\nfloat score = 0.f;\nwhile (true) {\n    const int16_t *pcm = get_next_audio_frame();\n    const pv_status_t status = pv_eagle_process(eagle, pcm, \u0026score);\n    if (status != PV_STATUS_SUCCESS) {\n        // error handling logic\n    }\n}\n```\n\nFinally, when done be sure to release the acquired resources:\n\n```c\npv_eagle_delete(handle);\n```\n\n### Web\n\nInstall the Eagle package with `yarn` (or `npm`):\n\n```console\nyarn add @picovoice/eagle-web\n```\n\n#### Speaker Enrollment\n\nCreate an instance of the `EagleProfiler`:\n\n```typescript\nconst eagleModel = {\n  publicPath: ${MODEL_RELATIVE_PATH},\n  // or\n  base64: ${MODEL_BASE64_STRING},\n}\n\nconst eagleProfiler = await EagleProfiler.create(\n        ${ACCESS_KEY},\n        eagleModel);\n```\n\nReplace `${ACCESS_KEY}` with the AccessKey obtained from Picovoice Console, and the model options with the path to the model file available under [lib/common](./lib/common) or a base64 string of it.\n\nUse `EagleProfiler` to create a new speaker profile:\n```typescript\nfunction getAudioData(numSamples): Int16Array {\n  // get audio frame of size `numSamples`\n}\n\nlet percentage = 0;\nwhile (percentage \u003c 100) {\n  const audioData = getAudioData(eagleProfiler.minEnrollSamples);\n\n  const result: EagleProfilerEnrollResult = await eagleProfiler.enroll(audioData);\n  if (result.feedback === EagleProfilerEnrollFeedback.AUDIO_OK) {\n      // audio is good!\n  } else {\n      // feedback code will tell you why audio was not used in enrollment\n  }\n  percentage = result.percentage;\n}\n\n// export speaker profile\nconst speakerProfile: EagleProfile = eagleProfiler.export();\n```\n\n#### Speaker Recognition\n\nCreate an instance of the engine with one or more speaker profiles created by the `EagleProfiler`:\n\n```typescript\nconst eagle = await Eagle.create(\n        ${ACCESS_KEY},\n        eagleModel,\n        speakerProfile);\n```\n\nProcess audio frames and get speaker scores (i.e. likelihood they are speaking) in real-time:\n```typescript\nfunction getAudioData(numSamples): Int16Array {\n  // get audio frame of size `numSamples`\n}\n\nwhile (true) {\n  const audioData = getAudioData(eagle.frameLength);\n  const scores: number[] = await eagle.process(audioData);\n}\n```\n\n### Node.js\n\nInstall Node.js SDK:\n\n```console\nyarn add @picovoice/eagle-node\n```\n\n#### Speaker Enrollment\n\nCreate an instance of the profiler:\n\n```typescript\nconst { EagleProfiler } = require(\"@picovoice/eagle-node\");\n\nconst accessKey = \"${ACCESS_KEY}\"; // Obtained from the Picovoice Console (https://console.picovoice.ai/)\nconst eagleProfiler = new EagleProfiler(accessKey);\n```\n\nCreate a new speaker profile:\n\n```typescript\nconst { EnrollProgress } = require(\"@picovoice/eagle-node\");\n\nfunction getAudioData(numSamples): Int16Array {\n  // get audio frame of size `numSamples`\n}\n\nlet percentage = 0;\nwhile (percentage \u003c 100) {\n  const audioData = getAudioData(eagleProfiler.minEnrollSamples);\n  \n  const result: EnrollProgress = await eagleProfiler.enroll(audioData);\n  if (result.feedback === EagleProfilerEnrollFeedback.NONE) {\n      // audio is good!\n  } else {\n      // feedback code will tell you why audio was not used in enrollment\n  }\n  percentage = result.percentage;\n}\n```\n\nExport the speaker profile once enrollment is complete:\n\n```typescript\nconst speakerProfile: Uint8Array = eagleProfiler.export();\n```\n\nRelease the resources acquired by the profiler:\n\n```typescript\neagleProfiler.release();\n```\n\n#### Speaker Recognition\n\nCreate an instance of the engine using the speaker profile exported before:\n\n```typescript\nconst { Eagle } = require(\"@picovoice/eagle-node\");\n\nconst accessKey = \"${ACCESS_KEY}\"; // Obtained from the Picovoice Console (https://console.picovoice.ai/)\nconst eagle = new Eagle(accessKey, speakerProfile);\n```\n\nProcess incoming audio frames:\n\n```typescript\nfunction getAudioData(numSamples): Int16Array {\n  // get audio frame of size `numSamples`\n}\n\nwhile (true) {\n  const audioData = getAudioData(eagle.frameLength);\n  const scores: number[] = eagle.process(audioData);\n}\n```\n\nFinally, when done be sure to explicitly release the resources:\n\n```typescript\neagle.release()\n```\n\n## Releases\n\n### v1.0.0 - January 24th, 2024\n\n - Enhanced engine accuracy\n - Improved the enrollment process\n - Added Raspberry Pi 5 support\n - Various bug fixes and improvements\n\n### v0.2.0 - November 24th, 2023\n\n- Improvements to error reporting\n- Upgrades to authorization and authentication system\n- Various bug fixes and improvements\n- Web min support bumped to Node 16\n- iOS support bumped to iOS 13\n\n### v0.1.0 - May 29, 2023\n\n- Beta release\n\n## FAQ\n\nYou can find the FAQ [here](https://picovoice.ai/docs/faq/general/).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpicovoice%2Feagle","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fpicovoice%2Feagle","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpicovoice%2Feagle/lists"}