avs-device-sdk/srcs/extension/avs-weakup-sdk/docs/getting-started/api-samples/api-sample-v1.html

1660 lines
62 KiB
HTML

<!doctype html>
<html lang="en" class="no-js">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<link rel="shortcut icon" href="../../resources/images/alexa-favicon-02.png">
<meta name="generator" content="mkdocs-1.1.2, mkdocs-material-6.0.2">
<title>API v1 - Amazon Wake Word Engine</title>
<link rel="stylesheet" href="../../assets/stylesheets/main.38780c08.min.css">
<link rel="stylesheet" href="../../assets/stylesheets/palette.3f72e892.min.css">
<link href="https://fonts.gstatic.com" rel="preconnect" crossorigin>
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:300,400,400i,700%7CRoboto+Mono&display=fallback">
<style>body,input{font-family:"Roboto",-apple-system,BlinkMacSystemFont,Helvetica,Arial,sans-serif}code,kbd,pre{font-family:"Roboto Mono",SFMono-Regular,Consolas,Menlo,monospace}</style>
<link rel="stylesheet" href="../../resources/stylesheets/extra.css">
</head>
<body dir="ltr" data-md-color-scheme="default" data-md-color-primary="" data-md-color-accent="">
<input class="md-toggle" data-md-toggle="drawer" type="checkbox" id="__drawer" autocomplete="off">
<input class="md-toggle" data-md-toggle="search" type="checkbox" id="__search" autocomplete="off">
<label class="md-overlay" for="__drawer"></label>
<div data-md-component="skip">
<a href="#api-sample-v1-api" class="md-skip">
Skip to content
</a>
</div>
<div data-md-component="announce">
</div>
<header class="md-header" data-md-component="header">
<nav class="md-header-nav md-grid" aria-label="Header">
<a href="../.." title="Amazon Wake Word Engine" class="md-header-nav__button md-logo" aria-label="Amazon Wake Word Engine">
<img src="../../resources/images/logo-alexa-blue-ring.png" alt="logo">
</a>
<label class="md-header-nav__button md-icon" for="__drawer">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M3 6h18v2H3V6m0 5h18v2H3v-2m0 5h18v2H3v-2z"/></svg>
</label>
<div class="md-header-nav__title" data-md-component="header-title">
<div class="md-header-nav__ellipsis">
<span class="md-header-nav__topic md-ellipsis">
Amazon Wake Word Engine
</span>
<span class="md-header-nav__topic md-ellipsis">
API v1
</span>
</div>
</div>
<label class="md-header-nav__button md-icon" for="__search">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0116 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.516 6.516 0 019.5 16 6.5 6.5 0 013 9.5 6.5 6.5 0 019.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5z"/></svg>
</label>
<div class="md-search" data-md-component="search" role="dialog">
<label class="md-search__overlay" for="__search"></label>
<div class="md-search__inner" role="search">
<form class="md-search__form" name="search">
<input type="text" class="md-search__input" name="query" aria-label="Search" placeholder="Search" autocapitalize="off" autocorrect="off" autocomplete="off" spellcheck="false" data-md-component="search-query" data-md-state="active">
<label class="md-search__icon md-icon" for="__search">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0116 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.516 6.516 0 019.5 16 6.5 6.5 0 013 9.5 6.5 6.5 0 019.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5z"/></svg>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11h12z"/></svg>
</label>
<button type="reset" class="md-search__icon md-icon" aria-label="Clear" data-md-component="search-reset" tabindex="-1">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12 19 6.41z"/></svg>
</button>
</form>
<div class="md-search__output">
<div class="md-search__scrollwrap" data-md-scrollfix>
<div class="md-search-result" data-md-component="search-result">
<div class="md-search-result__meta">
Initializing search
</div>
<ol class="md-search-result__list"></ol>
</div>
</div>
</div>
</div>
</div>
</nav>
</header>
<div class="md-container" data-md-component="container">
<nav class="md-tabs md-tabs--active" aria-label="Tabs" data-md-component="tabs">
<div class="md-tabs__inner md-grid">
<ul class="md-tabs__list">
<li class="md-tabs__item">
<a href="../../index.html" class="md-tabs__link">
Home
</a>
</li>
<li class="md-tabs__item">
<a href="index.html" class="md-tabs__link md-tabs__link--active">
Getting Started
</a>
</li>
<li class="md-tabs__item">
<a href="../../features/wakeword/overview.html" class="md-tabs__link">
Features
</a>
</li>
<li class="md-tabs__item">
<a href="../../avs-device-sdk/index.html" class="md-tabs__link">
AVS Device SDK
</a>
</li>
<li class="md-tabs__item">
<a href="../../api-reference/index.html" class="md-tabs__link">
API Reference
</a>
</li>
<li class="md-tabs__item">
<a href="../../support/getting-help.html" class="md-tabs__link">
Support
</a>
</li>
</ul>
</div>
</nav>
<main class="md-main" data-md-component="main">
<div class="md-main__inner md-grid">
<div class="md-sidebar md-sidebar--primary" data-md-component="navigation">
<div class="md-sidebar__scrollwrap">
<div class="md-sidebar__inner">
<nav class="md-nav md-nav--primary" aria-label="Navigation" data-md-level="0">
<label class="md-nav__title" for="__drawer">
<a href="../.." title="Amazon Wake Word Engine" class="md-nav__button md-logo" aria-label="Amazon Wake Word Engine">
<img src="../../resources/images/logo-alexa-blue-ring.png" alt="logo">
</a>
Amazon Wake Word Engine
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="nav-1" type="checkbox" id="nav-1">
<label class="md-nav__link" for="nav-1">
Home
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="Home" data-md-level="1">
<label class="md-nav__title" for="nav-1">
<span class="md-nav__icon md-icon"></span>
Home
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../index.html" class="md-nav__link">
Welcome
</a>
</li>
<li class="md-nav__item">
<a href="../../general-architecture.html" class="md-nav__link">
General Architecture
</a>
</li>
<li class="md-nav__item">
<a href="../../api-versions-features.html" class="md-nav__link">
API Versions & Features
</a>
</li>
<li class="md-nav__item">
<a href="../../wrappers-sdk-integrations.html" class="md-nav__link">
Wrappers & SDK Integrations
</a>
</li>
<li class="md-nav__item">
<a href="../../supported-architectures.html" class="md-nav__link">
Supported Architectures
</a>
</li>
<li class="md-nav__item">
<a href="../../release-history.html" class="md-nav__link">
Release History
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--active md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="nav-2" type="checkbox" id="nav-2" checked>
<label class="md-nav__link" for="nav-2">
Getting Started
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="Getting Started" data-md-level="1">
<label class="md-nav__title" for="nav-2">
<span class="md-nav__icon md-icon"></span>
Getting Started
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item md-nav__item--active md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="nav-2-1" type="checkbox" id="nav-2-1" checked>
<label class="md-nav__link" for="nav-2-1">
API Usage Samples
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="API Usage Samples" data-md-level="2">
<label class="md-nav__title" for="nav-2-1">
<span class="md-nav__icon md-icon"></span>
API Usage Samples
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="index.html" class="md-nav__link">
Overview
</a>
</li>
<li class="md-nav__item md-nav__item--active">
<input class="md-nav__toggle md-toggle" data-md-toggle="toc" type="checkbox" id="__toc">
<a href="api-sample-v1.html" class="md-nav__link md-nav__link--active">
API v1
</a>
</li>
<li class="md-nav__item">
<a href="api-sample-v2.html" class="md-nav__link">
API v2
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="../release-contents/index.html" class="md-nav__link">
Release Contents
</a>
</li>
<li class="md-nav__item">
<a href="../model-selection.html" class="md-nav__link">
Model Selection
</a>
</li>
<li class="md-nav__item">
<a href="../filesim.html" class="md-nav__link">
File Simulators
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="nav-3" type="checkbox" id="nav-3">
<label class="md-nav__link" for="nav-3">
Features
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="Features" data-md-level="1">
<label class="md-nav__title" for="nav-3">
<span class="md-nav__icon md-icon"></span>
Features
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="nav-3-1" type="checkbox" id="nav-3-1">
<label class="md-nav__link" for="nav-3-1">
Wake Word
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="Wake Word" data-md-level="2">
<label class="md-nav__title" for="nav-3-1">
<span class="md-nav__icon md-icon"></span>
Wake Word
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../features/wakeword/overview.html" class="md-nav__link">
Overview
</a>
</li>
<li class="md-nav__item">
<a href="../../features/wakeword/performance.html" class="md-nav__link">
Wake Word Performance
</a>
</li>
<li class="md-nav__item">
<a href="../../features/wakeword/detection-threshold.html" class="md-nav__link">
Detection Threshold
</a>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="nav-3-1-4" type="checkbox" id="nav-3-1-4">
<label class="md-nav__link" for="nav-3-1-4">
Media Wake Suppression
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="Media Wake Suppression" data-md-level="3">
<label class="md-nav__title" for="nav-3-1-4">
<span class="md-nav__icon md-icon"></span>
Media Wake Suppression
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../features/wakeword/media-wakes/media-wakes.html" class="md-nav__link">
Overview
</a>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="nav-3-1-4-2" type="checkbox" id="nav-3-1-4-2">
<label class="md-nav__link" for="nav-3-1-4-2">
Fingerprinting
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="Fingerprinting" data-md-level="4">
<label class="md-nav__title" for="nav-3-1-4-2">
<span class="md-nav__icon md-icon"></span>
Fingerprinting
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../features/wakeword/media-wakes/fingerprinting/overview.html" class="md-nav__link">
Overview
</a>
</li>
<li class="md-nav__item">
<a href="../../features/wakeword/media-wakes/fingerprinting/integration-guide.html" class="md-nav__link">
Integration Guide
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="nav-3-1-4-3" type="checkbox" id="nav-3-1-4-3">
<label class="md-nav__link" for="nav-3-1-4-3">
Watermarking
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="Watermarking" data-md-level="4">
<label class="md-nav__title" for="nav-3-1-4-3">
<span class="md-nav__icon md-icon"></span>
Watermarking
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../features/wakeword/media-wakes/watermarking/overview.html" class="md-nav__link">
Overview
</a>
</li>
<li class="md-nav__item">
<a href="../../features/wakeword/media-wakes/watermarking/integration.html" class="md-nav__link">
Integration Guide
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="../../features/wakeword/self-wake/self-wake-overview.html" class="md-nav__link">
Self-Wake Suppression
</a>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="nav-3-1-6" type="checkbox" id="nav-3-1-6">
<label class="md-nav__link" for="nav-3-1-6">
Pre-roll
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="Pre-roll" data-md-level="3">
<label class="md-nav__title" for="nav-3-1-6">
<span class="md-nav__icon md-icon"></span>
Pre-roll
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../features/wakeword/preroll/preroll-overview.html" class="md-nav__link">
Overview
</a>
</li>
<li class="md-nav__item">
<a href="../../features/wakeword/preroll/preroll-integration-guide.html" class="md-nav__link">
Integration Guide
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="../../features/wakeword/cascade-mode.html" class="md-nav__link">
Cascade Mode
</a>
</li>
<li class="md-nav__item">
<a href="../../features/wakeword/client-properties.html" class="md-nav__link">
Client Properties
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="nav-3-2" type="checkbox" id="nav-3-2">
<label class="md-nav__link" for="nav-3-2">
Diagnostic Information (WWDI)
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="Diagnostic Information (WWDI)" data-md-level="2">
<label class="md-nav__title" for="nav-3-2">
<span class="md-nav__icon md-icon"></span>
Diagnostic Information (WWDI)
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../features/wwdi/overview.html" class="md-nav__link">
Overview
</a>
</li>
<li class="md-nav__item">
<a href="../../features/wwdi/integration-guide.html" class="md-nav__link">
Integration Guide
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="nav-3-3" type="checkbox" id="nav-3-3">
<label class="md-nav__link" for="nav-3-3">
Standalone Voice Activity Detection (VAD)
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="Standalone Voice Activity Detection (VAD)" data-md-level="2">
<label class="md-nav__title" for="nav-3-3">
<span class="md-nav__icon md-icon"></span>
Standalone Voice Activity Detection (VAD)
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../features/vad/overview.html" class="md-nav__link">
Overview
</a>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="nav-3-3-2" type="checkbox" id="nav-3-3-2">
<label class="md-nav__link" for="nav-3-3-2">
Energy Detection
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="Energy Detection" data-md-level="3">
<label class="md-nav__title" for="nav-3-3-2">
<span class="md-nav__icon md-icon"></span>
Energy Detection
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../features/vad/energydetection/overview.html" class="md-nav__link">
Overview
</a>
</li>
<li class="md-nav__item">
<a href="../../features/vad/energydetection/integration-guide.html" class="md-nav__link">
Integration Guide
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="nav-3-4" type="checkbox" id="nav-3-4">
<label class="md-nav__link" for="nav-3-4">
Device Artifact Vending Service (DAVS)
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="Device Artifact Vending Service (DAVS)" data-md-level="2">
<label class="md-nav__title" for="nav-3-4">
<span class="md-nav__icon md-icon"></span>
Device Artifact Vending Service (DAVS)
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../features/davs/overview.html" class="md-nav__link">
Overview
</a>
</li>
<li class="md-nav__item">
<a href="../../features/davs/integration-guide.html" class="md-nav__link">
Integration Guide
</a>
</li>
<li class="md-nav__item">
<a href="../../features/davs/davs-filters.html" class="md-nav__link">
DAVS filters in wakeword engine package
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="nav-4" type="checkbox" id="nav-4">
<label class="md-nav__link" for="nav-4">
AVS Device SDK
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="AVS Device SDK" data-md-level="1">
<label class="md-nav__title" for="nav-4">
<span class="md-nav__icon md-icon"></span>
AVS Device SDK
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../avs-device-sdk/index.html" class="md-nav__link">
Overview
</a>
</li>
<li class="md-nav__item">
<a href="../../avs-device-sdk/integration-guide.html" class="md-nav__link">
Integration Guide
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="nav-5" type="checkbox" id="nav-5">
<label class="md-nav__link" for="nav-5">
API Reference
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="API Reference" data-md-level="1">
<label class="md-nav__title" for="nav-5">
<span class="md-nav__icon md-icon"></span>
API Reference
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../api-reference/index.html" class="md-nav__link">
API Reference
</a>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="nav-5-2" type="checkbox" id="nav-5-2">
<label class="md-nav__link" for="nav-5-2">
Wrappers
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="Wrappers" data-md-level="2">
<label class="md-nav__title" for="nav-5-2">
<span class="md-nav__icon md-icon"></span>
Wrappers
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="nav-5-2-1" type="checkbox" id="nav-5-2-1">
<label class="md-nav__link" for="nav-5-2-1">
Java
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="Java" data-md-level="3">
<label class="md-nav__title" for="nav-5-2-1">
<span class="md-nav__icon md-icon"></span>
Java
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../api-reference/wrappers/java/java-binding-overview.html" class="md-nav__link">
Overview
</a>
</li>
<li class="md-nav__item">
<a href="../../api-reference/wrappers/java/java-binding-reference.html" class="md-nav__link">
Reference
</a>
</li>
<li class="md-nav__item">
<a href="../../api-reference/wrappers/java/java-binding-engine-reference.html" class="md-nav__link">
Engine API
</a>
</li>
<li class="md-nav__item">
<a href="../../api-reference/wrappers/java/java-binding-wake-word-reference.html" class="md-nav__link">
Wake Word API
</a>
</li>
<li class="md-nav__item">
<a href="../../api-reference/wrappers/java/java-binding-fingerprinting-reference.html" class="md-nav__link">
Fingerprinting API
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="../../api-reference/wrappers/swift/index.html" class="md-nav__link">
Swift
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="nav-6" type="checkbox" id="nav-6">
<label class="md-nav__link" for="nav-6">
Support
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="Support" data-md-level="1">
<label class="md-nav__title" for="nav-6">
<span class="md-nav__icon md-icon"></span>
Support
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../support/getting-help.html" class="md-nav__link">
Getting Help
</a>
</li>
<li class="md-nav__item">
<a href="../../support/faq/index.html" class="md-nav__link">
FAQ
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</div>
</div>
</div>
<div class="md-sidebar md-sidebar--secondary" data-md-component="toc">
<div class="md-sidebar__scrollwrap">
<div class="md-sidebar__inner">
<nav class="md-nav md-nav--secondary" aria-label="Table of contents">
</nav>
</div>
</div>
</div>
<div class="md-content">
<article class="md-content__inner md-typeset">
<h1 id="api-sample-v1-api">API Sample (V1 API)</h1>
<hr />
<p>The following code demonstrates the general operation of the Wake Word Engine using the V1 API.</p>
<div class="highlight"><pre><span></span><code><span class="c1">///////////////////////////////////////////////////////////////////////////</span>
<span class="c1">// Copyright 2017 Amazon.com, Inc. or its affiliates. All Rights Reserved.</span>
<span class="c1">///////////////////////////////////////////////////////////////////////////</span>
<span class="cp">#include</span><span class="w"> </span><span class="cpf">&lt;string.h&gt;</span><span class="cp"></span>
<span class="cp">#include</span><span class="w"> </span><span class="cpf">&lt;stdio.h&gt;</span><span class="cp"></span>
<span class="cp">#include</span><span class="w"> </span><span class="cpf">&lt;stdlib.h&gt;</span><span class="cp"></span>
<span class="cp">#include</span><span class="w"> </span><span class="cpf">&quot;pryon_lite.h&quot;</span><span class="cp"></span>
<span class="cp">#define SAMPLES_PER_FRAME (160)</span>
<span class="c1">// global flag to stop processing, set by application</span>
<span class="k">static</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">quit</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">0</span><span class="p">;</span><span class="w"></span>
<span class="c1">// decoder handle</span>
<span class="k">static</span><span class="w"> </span><span class="n">PryonLiteDecoderHandle</span><span class="w"> </span><span class="n">sDecoder</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nb">NULL</span><span class="p">;</span><span class="w"></span>
<span class="c1">// binary model buffer, allocated by application</span>
<span class="c1">// this buffer can be read-only memory as PryonLite will not modify the contents</span>
<span class="cp">#define ALIGN(n) __attribute__((aligned(n)))</span>
<span class="n">ALIGN</span><span class="p">(</span><span class="mi">4</span><span class="p">)</span><span class="w"> </span><span class="k">static</span><span class="w"> </span><span class="k">const</span><span class="w"> </span><span class="kt">char</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="n">modelBuffer</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="p">};</span><span class="w"> </span><span class="c1">// should be an array large enough to hold the largest model</span>
<span class="k">static</span><span class="w"> </span><span class="kt">char</span><span class="o">*</span><span class="w"> </span><span class="n">decoderBuffer</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="p">};</span><span class="w"> </span><span class="c1">// should be an array large enough to hold the largest decoder</span>
<span class="c1">//---- Application functions to be implemented by the client -------------------</span>
<span class="k">static</span><span class="w"> </span><span class="kt">void</span><span class="w"> </span><span class="nf">loadModel</span><span class="p">(</span><span class="k">const</span><span class="w"> </span><span class="kt">char</span><span class="w"> </span><span class="o">**</span><span class="n">model</span><span class="p">,</span><span class="w"> </span><span class="kt">size_t</span><span class="w"> </span><span class="o">*</span><span class="n">sizeofModel</span><span class="p">)</span><span class="w"></span>
<span class="p">{</span><span class="w"></span>
<span class="w"> </span><span class="c1">// In order to detect keywords, the decoder uses a model which defines the parameters,</span>
<span class="w"> </span><span class="c1">// neural network weights, classifiers, etc that are used at runtime to process the audio</span>
<span class="w"> </span><span class="c1">// and give detection results.</span>
<span class="w"> </span><span class="c1">// Each model is packaged in two formats:</span>
<span class="w"> </span><span class="c1">// 1. A .bin file that can be loaded from disk (via fopen, fread, etc)</span>
<span class="w"> </span><span class="c1">// *sizeofModel will be the size of the binary model byte array</span>
<span class="w"> </span><span class="c1">// *model will be a pointer to the model read into memory</span>
<span class="w"> </span><span class="c1">//</span>
<span class="w"> </span><span class="c1">// 2. A .cpp file that can be hard-coded at compile time</span>
<span class="w"> </span><span class="c1">// *sizeofModel will be prlBinaryModelLen</span>
<span class="w"> </span><span class="c1">// *model will be prlBinaryModelData</span>
<span class="w"> </span><span class="o">*</span><span class="n">sizeofModel</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">1</span><span class="p">;</span><span class="w"> </span><span class="c1">// example value, will be the size of the binary model byte array</span>
<span class="w"> </span><span class="o">*</span><span class="n">model</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">modelBuffer</span><span class="p">;</span><span class="w"> </span><span class="c1">// pointer to model in memory</span>
<span class="p">}</span><span class="w"></span>
<span class="c1">// client implemented function to read audio samples</span>
<span class="k">static</span><span class="w"> </span><span class="kt">void</span><span class="w"> </span><span class="nf">readAudio</span><span class="p">(</span><span class="kt">short</span><span class="o">*</span><span class="w"> </span><span class="n">samples</span><span class="p">,</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">sampleCount</span><span class="p">)</span><span class="w"></span>
<span class="p">{</span><span class="w"></span>
<span class="w"> </span><span class="c1">// todo - read samples from file, audio system, etc.</span>
<span class="p">}</span><span class="w"></span>
<span class="c1">//---- Decoder callback functions to be implemented by the client --------------</span>
<span class="c1">///</span>
<span class="c1">/// @brief Callback function triggered by the decoder when a wake word is detected.</span>
<span class="c1">///</span>
<span class="c1">/// @param handle [in] Handle for the decoder which detected the wake word</span>
<span class="c1">/// @param result [in] Result structure indicating which information about the wake word detection</span>
<span class="c1">/// See pryon_lite_ww.h for a full description of this structure</span>
<span class="c1">///</span>
<span class="c1">/// @return void</span>
<span class="c1">///</span>
<span class="k">static</span><span class="w"> </span><span class="kt">void</span><span class="w"> </span><span class="nf">detectionCallback</span><span class="p">(</span><span class="n">PryonLiteDecoderHandle</span><span class="w"> </span><span class="n">handle</span><span class="p">,</span><span class="w"> </span><span class="k">const</span><span class="w"> </span><span class="n">PryonLiteResult</span><span class="o">*</span><span class="w"> </span><span class="n">result</span><span class="p">)</span><span class="w"></span>
<span class="p">{</span><span class="w"></span>
<span class="w"> </span><span class="n">printf</span><span class="p">(</span><span class="s">&quot;Detected keyword &#39;%s&#39;&quot;</span><span class="p">,</span><span class="w"> </span><span class="n">result</span><span class="o">-&gt;</span><span class="n">keyword</span><span class="p">);</span><span class="w"></span>
<span class="p">}</span><span class="w"></span>
<span class="c1">///</span>
<span class="c1">/// @brief Callback function triggered by the decoder when a VAD state transition is detected.</span>
<span class="c1">///</span>
<span class="c1">/// @param handle [in] Handle for the decoder which detected the VAD state transition</span>
<span class="c1">/// @param vadEvent [in] Result structure indicating the current VAD state</span>
<span class="c1">///</span>
<span class="c1">/// @return void</span>
<span class="c1">///</span>
<span class="k">static</span><span class="w"> </span><span class="kt">void</span><span class="w"> </span><span class="nf">vadCallback</span><span class="p">(</span><span class="n">PryonLiteDecoderHandle</span><span class="w"> </span><span class="n">handle</span><span class="p">,</span><span class="w"> </span><span class="k">const</span><span class="w"> </span><span class="n">PryonLiteVadEvent</span><span class="o">*</span><span class="w"> </span><span class="n">vadEvent</span><span class="p">)</span><span class="w"></span>
<span class="p">{</span><span class="w"></span>
<span class="w"> </span><span class="n">printf</span><span class="p">(</span><span class="s">&quot;VAD state %d</span>
<span class="s">&quot;, (int) vadEvent-&gt;vadState);</span>
<span class="p">}</span><span class="w"></span>
<span class="c1">//---- Main processing loop ----------------------------------------------------</span>
<span class="c1">// The main loop below shows the full life cycle of the wake word engine. This</span>
<span class="c1">// life cycle is broken down into 3 phases.</span>
<span class="c1">//</span>
<span class="c1">// Phase 1 - Initialization</span>
<span class="c1">// STEP 1.1 - Load the model</span>
<span class="c1">// STEP 1.2 - Query for the size of instance memory required by the decoder</span>
<span class="c1">// STEP 1.3 - Allocate/Check decoder buffer</span>
<span class="c1">// STEP 1.4 - Configure Decoder</span>
<span class="c1">// STEP 1.5 - Initialize Decoder</span>
<span class="c1">// STEP 1.6 - Optional - Runtime configuration functions</span>
<span class="c1">// Phase 2 - Audio Processing</span>
<span class="c1">// STEP 2.1 - Gather audio</span>
<span class="c1">// STEP 2.2 - Push audio to Decoder</span>
<span class="c1">// STEP 2.3 - Handle Decoder events</span>
<span class="c1">// Phase 3 - Cleanup</span>
<span class="c1">//</span>
<span class="c1">// The sample below is for a single locale/model. To change the locale/model</span>
<span class="c1">// being used, complete Phase 3 - Cleanup for the engine instance and then</span>
<span class="c1">// create a new instance by going back through Phase 1 - Initialization with</span>
<span class="c1">// the new model.</span>
<span class="kt">int</span><span class="w"> </span><span class="n">main</span><span class="p">(</span><span class="kt">int</span><span class="w"> </span><span class="n">argc</span><span class="p">,</span><span class="w"> </span><span class="kt">char</span><span class="w"> </span><span class="o">**</span><span class="n">argv</span><span class="p">)</span><span class="w"></span>
<span class="p">{</span><span class="w"></span>
<span class="w"> </span><span class="c1">// Start Phase 1 - Initialization</span>
<span class="w"> </span><span class="c1">//</span>
<span class="w"> </span><span class="c1">// The initialization phase begins with nothing and ends with a fully</span>
<span class="w"> </span><span class="c1">// initialized instance of the wake word engine.</span>
<span class="w"> </span><span class="c1">//</span>
<span class="w"> </span><span class="c1">// STEP 1.1 - Load the model</span>
<span class="w"> </span><span class="c1">// This step covers loading the model data from source. Models are</span>
<span class="w"> </span><span class="c1">// delivered in two different forms, a C file with an array</span>
<span class="w"> </span><span class="c1">// containing the model source or a separate bin file. If using</span>
<span class="w"> </span><span class="c1">// the C file, the model source and size are already defined. If</span>
<span class="w"> </span><span class="c1">// using the bin file, the model source needs to be read into an</span>
<span class="w"> </span><span class="c1">// array and the length needs to be calculated.</span>
<span class="w"> </span><span class="k">const</span><span class="w"> </span><span class="kt">char</span><span class="w"> </span><span class="o">*</span><span class="n">model</span><span class="p">;</span><span class="w"></span>
<span class="w"> </span><span class="kt">size_t</span><span class="w"> </span><span class="n">sizeofModel</span><span class="p">;</span><span class="w"></span>
<span class="w"> </span><span class="n">loadModel</span><span class="p">(</span><span class="o">&amp;</span><span class="n">model</span><span class="p">,</span><span class="w"> </span><span class="o">&amp;</span><span class="n">sizeofModel</span><span class="p">);</span><span class="w"></span>
<span class="w"> </span><span class="c1">// STEP 1.2 - Query for the size of instance memory required by the decoder</span>
<span class="w"> </span><span class="c1">// The wake word engine initialization requires a buffer be passed</span>
<span class="w"> </span><span class="c1">// in which is owned by the application layer. The size of this</span>
<span class="w"> </span><span class="c1">// buffer is dynamic depending on the model being used. Use the</span>
<span class="w"> </span><span class="c1">// PryonLite_GetModelAttributes function below to determine the</span>
<span class="w"> </span><span class="c1">// size of the decoder buffer needed.</span>
<span class="w"> </span><span class="n">PryonLiteModelAttributes</span><span class="w"> </span><span class="n">modelAttributes</span><span class="p">;</span><span class="w"></span>
<span class="w"> </span><span class="n">PryonLiteError</span><span class="w"> </span><span class="n">status</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">PryonLite_GetModelAttributes</span><span class="p">(</span><span class="n">model</span><span class="p">,</span><span class="w"> </span><span class="n">sizeofModel</span><span class="p">,</span><span class="w"> </span><span class="o">&amp;</span><span class="n">modelAttributes</span><span class="p">);</span><span class="w"></span>
<span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">status</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="n">PRYON_LITE_ERROR_OK</span><span class="p">)</span><span class="w"></span>
<span class="w"> </span><span class="p">{</span><span class="w"></span>
<span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="mi">-1</span><span class="p">;</span><span class="w"></span>
<span class="w"> </span><span class="p">}</span><span class="w"></span>
<span class="w"> </span><span class="c1">// STEP 1.3 - Allocate/Check decoder buffer</span>
<span class="w"> </span><span class="c1">// Once the size of the decoder buffer has been determined, the</span>
<span class="w"> </span><span class="c1">// application layer must create the buffer. This example uses</span>
<span class="w"> </span><span class="c1">// a statically defined buffer. If applicable to the device,</span>
<span class="w"> </span><span class="c1">// this buffer can be dynamically allocated as well. The</span>
<span class="w"> </span><span class="c1">// requirement is that a buffer that is at least</span>
<span class="w"> </span><span class="c1">// modelAttributes.requiredDecoderMem size, in bytes, is created.</span>
<span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">modelAttributes</span><span class="p">.</span><span class="n">requiredDecoderMem</span><span class="w"> </span><span class="o">&gt;</span><span class="w"> </span><span class="k">sizeof</span><span class="p">(</span><span class="n">decoderBuffer</span><span class="p">))</span><span class="w"></span>
<span class="w"> </span><span class="p">{</span><span class="w"></span>
<span class="w"> </span><span class="c1">// handle error</span>
<span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="mi">-1</span><span class="p">;</span><span class="w"></span>
<span class="w"> </span><span class="p">}</span><span class="w"></span>
<span class="w"> </span><span class="c1">// STEP 1.4 - Configure Decoder</span>
<span class="w"> </span><span class="c1">// PryonLiteDecoderConfig is used to configure the wake word engine.</span>
<span class="w"> </span><span class="c1">// Use PryonLiteDecodeConfig_Default to set up this structure with</span>
<span class="w"> </span><span class="c1">// default values. There are required fields which must be set</span>
<span class="w"> </span><span class="c1">// after the default values, see the example below.</span>
<span class="w"> </span><span class="n">PryonLiteDecoderConfig</span><span class="w"> </span><span class="n">config</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">PryonLiteDecoderConfig_Default</span><span class="p">;</span><span class="w"></span>
<span class="w"> </span><span class="c1">// Required fields: model, sizeofModel loaded in STEP 1</span>
<span class="w"> </span><span class="n">config</span><span class="p">.</span><span class="n">model</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">model</span><span class="p">;</span><span class="w"></span>
<span class="w"> </span><span class="n">config</span><span class="p">.</span><span class="n">sizeofModel</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">sizeofModel</span><span class="p">;</span><span class="w"></span>
<span class="w"> </span><span class="c1">// Required fields: decoderMem, sizeofDecoderMem created in STEP 3</span>
<span class="w"> </span><span class="n">config</span><span class="p">.</span><span class="n">decoderMem</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">decoderBuffer</span><span class="p">;</span><span class="w"></span>
<span class="w"> </span><span class="n">config</span><span class="p">.</span><span class="n">sizeofDecoderMem</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">modelAttributes</span><span class="p">.</span><span class="n">requiredDecoderMem</span><span class="p">;</span><span class="w"></span>
<span class="w"> </span><span class="c1">// Required field: resultCallback, callback function which handles wake word detections</span>
<span class="w"> </span><span class="n">config</span><span class="p">.</span><span class="n">resultCallback</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">detectionCallback</span><span class="p">;</span><span class="w"></span>
<span class="w"> </span><span class="c1">// Optional fields: VAD Configuration</span>
<span class="w"> </span><span class="c1">// Enabling will use VAD in the wake word engine. If the</span>
<span class="w"> </span><span class="c1">// vadCallback is configured, it will be called whenever</span>
<span class="w"> </span><span class="c1">// there is a VAD state transition identified.</span>
<span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">enableVad</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">0</span><span class="p">;</span><span class="w"> </span><span class="c1">// disable voice activity detector, set to 1 to enable</span>
<span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">enableVad</span><span class="p">)</span><span class="w"></span>
<span class="w"> </span><span class="p">{</span><span class="w"></span>
<span class="w"> </span><span class="n">config</span><span class="p">.</span><span class="n">vadCallback</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">vadCallback</span><span class="p">;</span><span class="w"> </span><span class="c1">// register VAD handler</span>
<span class="w"> </span><span class="c1">// this parameter is optional,</span>
<span class="w"> </span><span class="c1">// and may be set to NULL when VAD is enabled</span>
<span class="w"> </span><span class="n">config</span><span class="p">.</span><span class="n">useVad</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">1</span><span class="p">;</span><span class="w"> </span><span class="c1">// enable voice activity detector</span>
<span class="w"> </span><span class="p">}</span><span class="w"></span>
<span class="w"> </span><span class="c1">// STEP 1.5 - Initialize Decoder</span>
<span class="w"> </span><span class="c1">// Pass the configuration from STEP 4 to PryonLiteDecoder_Initialize</span>
<span class="w"> </span><span class="c1">// to create an instance of the wake word engine. After this function</span>
<span class="w"> </span><span class="c1">// is called, the decoder instance pointed to by sDecoder is fully</span>
<span class="w"> </span><span class="c1">// functional.</span>
<span class="w"> </span><span class="n">PryonLiteSessionInfo</span><span class="w"> </span><span class="n">sessionInfo</span><span class="p">;</span><span class="w"></span>
<span class="w"> </span><span class="n">status</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">PryonLiteDecoder_Initialize</span><span class="p">(</span><span class="o">&amp;</span><span class="n">config</span><span class="p">,</span><span class="w"> </span><span class="o">&amp;</span><span class="n">sessionInfo</span><span class="p">,</span><span class="w"> </span><span class="o">&amp;</span><span class="n">sDecoder</span><span class="p">);</span><span class="w"></span>
<span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">status</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="n">PRYON_LITE_ERROR_OK</span><span class="p">)</span><span class="w"></span>
<span class="w"> </span><span class="p">{</span><span class="w"></span>
<span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="mi">-1</span><span class="p">;</span><span class="w"></span>
<span class="w"> </span><span class="p">}</span><span class="w"></span>
<span class="w"> </span><span class="c1">// STEP 1.6 - Optional - Runtime configuration functions</span>
<span class="w"> </span><span class="c1">// The optional functions below allow for the runtime overrides of</span>
<span class="w"> </span><span class="c1">// configuration options. These functions can be called on a decoder</span>
<span class="w"> </span><span class="c1">// instance any time after a successful PryonLiteDecoder_Initialize</span>
<span class="w"> </span><span class="c1">// and before PryonLiteDecoder_Destroy.</span>
<span class="w"> </span><span class="c1">// Set detection threshold for all keywords</span>
<span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">detectionThreshold</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">500</span><span class="p">;</span><span class="w"></span>
<span class="w"> </span><span class="n">status</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">PryonLiteDecoder_SetDetectionThreshold</span><span class="p">(</span><span class="n">sDecoder</span><span class="p">,</span><span class="w"> </span><span class="nb">NULL</span><span class="p">,</span><span class="w"> </span><span class="n">detectionThreshold</span><span class="p">);</span><span class="w"></span>
<span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">status</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="n">PRYON_LITE_ERROR_OK</span><span class="p">)</span><span class="w"></span>
<span class="w"> </span><span class="p">{</span><span class="w"></span>
<span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="mi">-1</span><span class="p">;</span><span class="w"></span>
<span class="w"> </span><span class="p">}</span><span class="w"></span>
<span class="w"> </span><span class="c1">// End Phase 1 - Initialization</span>
<span class="w"> </span><span class="c1">// allocate buffer to hold audio samples</span>
<span class="w"> </span><span class="kt">short</span><span class="w"> </span><span class="n">samples</span><span class="p">[</span><span class="n">SAMPLES_PER_FRAME</span><span class="p">];</span><span class="w"></span>
<span class="w"> </span><span class="c1">// run decoder</span>
<span class="w"> </span><span class="k">while</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span><span class="w"></span>
<span class="w"> </span><span class="p">{</span><span class="w"></span>
<span class="w"> </span><span class="c1">// Start Phase 2 - Audio Processing</span>
<span class="w"> </span><span class="c1">//</span>
<span class="w"> </span><span class="c1">// The audio processing phase is where audio is pushed into an initialized</span>
<span class="w"> </span><span class="c1">// decoder instance and decoder events are handled.</span>
<span class="w"> </span><span class="c1">//</span>
<span class="w"> </span><span class="c1">// STEP 2.1 - Gather audio</span>
<span class="w"> </span><span class="c1">// Audio must be gathered into frames of length</span>
<span class="w"> </span><span class="c1">// sessionInfo.samplesPerFrame before sending to the decoder.</span>
<span class="w"> </span><span class="n">readAudio</span><span class="p">(</span><span class="n">samples</span><span class="p">,</span><span class="w"> </span><span class="n">sessionInfo</span><span class="p">.</span><span class="n">samplesPerFrame</span><span class="p">);</span><span class="w"></span>
<span class="w"> </span><span class="c1">// STEP 2.2 - Push audio to Decoder</span>
<span class="w"> </span><span class="c1">// Once an appropriate amount of audio has been gathered, push</span>
<span class="w"> </span><span class="c1">// the frame into the decoder using the PushAudioSamples. This</span>
<span class="w"> </span><span class="c1">// tells the decoder to process the audio and trigger any</span>
<span class="w"> </span><span class="c1">// generated events through the callback functions.</span>
<span class="w"> </span><span class="n">status</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">PryonLiteDecoder_PushAudioSamples</span><span class="p">(</span><span class="n">sDecoder</span><span class="p">,</span><span class="w"> </span><span class="n">samples</span><span class="p">,</span><span class="w"> </span><span class="n">sessionInfo</span><span class="p">.</span><span class="n">samplesPerFrame</span><span class="p">);</span><span class="w"></span>
<span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">status</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="n">PRYON_LITE_ERROR_OK</span><span class="p">)</span><span class="w"></span>
<span class="w"> </span><span class="p">{</span><span class="w"></span>
<span class="w"> </span><span class="c1">// handle error</span>
<span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="mi">-1</span><span class="p">;</span><span class="w"></span>
<span class="w"> </span><span class="p">}</span><span class="w"></span>
<span class="w"> </span><span class="c1">// STEP 2.3 - Handle Decoder events</span>
<span class="w"> </span><span class="c1">// The decoder passes back event information to the application</span>
<span class="w"> </span><span class="c1">// layer through the callback functions configured in Phase 1.</span>
<span class="w"> </span><span class="c1">// Different event types trigger different callback functions.</span>
<span class="w"> </span><span class="c1">// This sample supports two different events, see the callback</span>
<span class="w"> </span><span class="c1">// function documnentation for more information.</span>
<span class="w"> </span><span class="c1">// Event | Callback</span>
<span class="w"> </span><span class="c1">// Wake Word Detection | detectionCallback</span>
<span class="w"> </span><span class="c1">// VAD State Change | vadCallback</span>
<span class="w"> </span><span class="c1">//</span>
<span class="w"> </span><span class="c1">// End Phase 2 - Audio Processing</span>
<span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">quit</span><span class="p">)</span><span class="w"></span>
<span class="w"> </span><span class="p">{</span><span class="w"></span>
<span class="w"> </span><span class="c1">// Start Phase 3 - Cleanup</span>
<span class="w"> </span><span class="c1">//</span>
<span class="w"> </span><span class="c1">// Cleanup should only be run when there is no more use for the</span>
<span class="w"> </span><span class="c1">// decoder. This will flush any unprocessed audio that has been</span>
<span class="w"> </span><span class="c1">// pushed and destroy the decoder instance.</span>
<span class="w"> </span><span class="n">status</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">PryonLiteDecoder_Destroy</span><span class="p">(</span><span class="o">&amp;</span><span class="n">sDecoder</span><span class="p">);</span><span class="w"></span>
<span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">status</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="n">PRYON_LITE_ERROR_OK</span><span class="p">)</span><span class="w"></span>
<span class="w"> </span><span class="p">{</span><span class="w"></span>
<span class="w"> </span><span class="c1">// handle error</span>
<span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="mi">-1</span><span class="p">;</span><span class="w"></span>
<span class="w"> </span><span class="p">}</span><span class="w"></span>
<span class="w"> </span><span class="k">break</span><span class="p">;</span><span class="w"></span>
<span class="w"> </span><span class="c1">// End Phase 3 - Cleanup</span>
<span class="w"> </span><span class="p">}</span><span class="w"></span>
<span class="w"> </span><span class="p">}</span><span class="w"></span>
<span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="mi">0</span><span class="p">;</span><span class="w"></span>
<span class="p">}</span><span class="w"></span>
</code></pre></div>
</article>
</div>
</div>
</main>
<footer class="md-footer">
<div class="md-footer-nav">
<nav class="md-footer-nav__inner md-grid" aria-label="Footer">
<a href="index.html" class="md-footer-nav__link md-footer-nav__link--prev" rel="prev">
<div class="md-footer-nav__button md-icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11h12z"/></svg>
</div>
<div class="md-footer-nav__title">
<div class="md-ellipsis">
<span class="md-footer-nav__direction">
Previous
</span>
Overview
</div>
</div>
</a>
<a href="api-sample-v2.html" class="md-footer-nav__link md-footer-nav__link--next" rel="next">
<div class="md-footer-nav__title">
<div class="md-ellipsis">
<span class="md-footer-nav__direction">
Next
</span>
API v2
</div>
</div>
<div class="md-footer-nav__button md-icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M4 11v2h12l-5.5 5.5 1.42 1.42L19.84 12l-7.92-7.92L10.5 5.5 16 11H4z"/></svg>
</div>
</a>
</nav>
</div>
<div class="md-footer-meta md-typeset">
<div class="md-footer-meta__inner md-grid">
<div class="md-footer-copyright">
<div class="md-footer-copyright__highlight">
AMAZON CONFIDENTIAL. Copyright &copy; 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved.
</div>
Made with
<a href="https://squidfunk.github.io/mkdocs-material/" target="_blank" rel="noopener">
Material for MkDocs
</a>
</div>
</div>
</div>
</footer>
</div>
<script src="../../assets/javascripts/vendor.77e55a48.min.js"></script>
<script src="../../assets/javascripts/bundle.9554a270.min.js"></script><script id="__lang" type="application/json">{"clipboard.copy": "Copy to clipboard", "clipboard.copied": "Copied to clipboard", "search.config.lang": "en", "search.config.pipeline": "trimmer, stopWordFilter", "search.config.separator": "[\\s\\-]+", "search.result.placeholder": "Type to start searching", "search.result.none": "No matching documents", "search.result.one": "1 matching document", "search.result.other": "# matching documents", "search.result.more.one": "1 more on this page", "search.result.more.other": "# more on this page", "search.result.term.missing": "Missing"}</script>
<script src="https://unpkg.com/iframe-worker/polyfill"></script>
<script src="../../search/search_index.js"></script>
<script>
app = initialize({
base: "../..",
features: ['navigation.tabs', 'navigation.expand'],
search: Object.assign({
worker: "../../assets/javascripts/worker/search.4ac00218.min.js"
}, typeof search !== "undefined" && search)
})
</script>
<script src="../../resources/javascripts/MathJax.min.js"></script>
</body>
</html>