Files
gradio-webrtc/reference/reply_on_pause/index.html
2025-06-17 12:04:47 +00:00

1781 lines
59 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="canonical" href="https://fastrtc.org/reference/reply_on_pause/">
<link rel="prev" href="../stream/">
<link rel="next" href="../stream_handlers/">
<link rel="icon" href="../../fastrtc_logo.png">
<meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.6.14">
<title>Pause Detection Handlers - FastRTC</title>
<link rel="stylesheet" href="../../assets/stylesheets/main.342714a4.min.css">
<link rel="stylesheet" href="../../assets/stylesheets/palette.06af60db.min.css">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:300,300i,400,400i,700,700i%7CRoboto+Mono:400,400i,700,700i&display=fallback">
<style>:root{--md-text-font:"Roboto";--md-code-font:"Roboto Mono"}</style>
<link rel="stylesheet" href="../../stylesheets/extra.css">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/styles/github-dark.min.css">
<script>__md_scope=new URL("../..",location),__md_hash=e=>[...e].reduce(((e,_)=>(e<<5)-e+_.charCodeAt(0)),0),__md_get=(e,_=localStorage,t=__md_scope)=>JSON.parse(_.getItem(t.pathname+"."+e)),__md_set=(e,_,t=localStorage,a=__md_scope)=>{try{t.setItem(a.pathname+"."+e,JSON.stringify(_))}catch(e){}}</script>
</head>
<body dir="ltr" data-md-color-scheme="fastrtc-dark" data-md-color-primary="indigo" data-md-color-accent="indigo">
<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="#replyonpause-class" class="md-skip">
Skip to content
</a>
</div>
<div data-md-component="announce">
</div>
<header class="md-header md-header--shadow" data-md-component="header">
<nav class="md-header__inner md-grid" aria-label="Header">
<a href="../.." title="FastRTC"
class="md-header__button md-logo" aria-label="FastRTC" data-md-component="logo">
<img src="../../fastrtc_logo.png" alt="logo">
</a>
<label class="md-header__button md-icon" for="__drawer">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M3 6h18v2H3zm0 5h18v2H3zm0 5h18v2H3z"/></svg>
</label>
<div class="md-header__title" data-md-component="header-title">
<div class="md-header__ellipsis">
<div class="md-header__topic">
<span class="md-ellipsis">
FastRTC
</span>
</div>
<div class="md-header__topic" data-md-component="header-topic">
<span class="md-ellipsis">
Pause Detection Handlers
</span>
</div>
</div>
</div>
<div style="display: flex; align-items: center; margin-right: 1rem;">
<a href="https://hf.co/fastrtc" target="_blank" rel="noopener noreferrer">
<img src="/hf-logo.svg"
onerror="this.onerror=null; this.src='https://huggingface.co/datasets/freddyaboulton/bucket/resolve/main/hf-logo.svg';"
style="height: 24px; margin-right: 10px;">
</a>
<a href="https://gradio.app" target="_blank" rel="noopener noreferrer">
<img src="/gradio-logo.svg"
onerror="this.onerror=null; this.src='https://huggingface.co/datasets/freddyaboulton/bucket/resolve/main/gradio-logo.svg';"
style="height: 24px; margin-right: 10px;">
</a>
<a href="https://discord.gg/TSWU7HyaYu" target="_blank" rel="noopener noreferrer">
<img src="/Discord-Symbol-White.svg" style="height: 16px; margin-right: 10px;">
</a>
</div>
<div class="md-header__source">
<a href="https://github.com/gradio-app/fastrtc" title="Go to repository" class="md-source" data-md-component="source">
<div class="md-source__icon md-icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--! Font Awesome Free 6.7.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2024 Fonticons, Inc.--><path d="M439.55 236.05 244 40.45a28.87 28.87 0 0 0-40.81 0l-40.66 40.63 51.52 51.52c27.06-9.14 52.68 16.77 43.39 43.68l49.66 49.66c34.23-11.8 61.18 31 35.47 56.69-26.49 26.49-70.21-2.87-56-37.34L240.22 199v121.85c25.3 12.54 22.26 41.85 9.08 55a34.34 34.34 0 0 1-48.55 0c-17.57-17.6-11.07-46.91 11.25-56v-123c-20.8-8.51-24.6-30.74-18.64-45L142.57 101 8.45 235.14a28.86 28.86 0 0 0 0 40.81l195.61 195.6a28.86 28.86 0 0 0 40.8 0l194.69-194.69a28.86 28.86 0 0 0 0-40.81"/></svg>
</div>
<div class="md-source__repository">
fastrtc
</div>
</a>
</div>
</nav>
</header>
<div class="md-container" data-md-component="container">
<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="sidebar" data-md-type="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="FastRTC" class="md-nav__button md-logo" aria-label="FastRTC" data-md-component="logo">
<img src="../../fastrtc_logo.png" alt="logo">
</a>
FastRTC
</label>
<div class="md-nav__source">
<a href="https://github.com/gradio-app/fastrtc" title="Go to repository" class="md-source" data-md-component="source">
<div class="md-source__icon md-icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--! Font Awesome Free 6.7.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2024 Fonticons, Inc.--><path d="M439.55 236.05 244 40.45a28.87 28.87 0 0 0-40.81 0l-40.66 40.63 51.52 51.52c27.06-9.14 52.68 16.77 43.39 43.68l49.66 49.66c34.23-11.8 61.18 31 35.47 56.69-26.49 26.49-70.21-2.87-56-37.34L240.22 199v121.85c25.3 12.54 22.26 41.85 9.08 55a34.34 34.34 0 0 1-48.55 0c-17.57-17.6-11.07-46.91 11.25-56v-123c-20.8-8.51-24.6-30.74-18.64-45L142.57 101 8.45 235.14a28.86 28.86 0 0 0 0 40.81l195.61 195.6a28.86 28.86 0 0 0 40.8 0l194.69-194.69a28.86 28.86 0 0 0 0-40.81"/></svg>
</div>
<div class="md-source__repository">
fastrtc
</div>
</a>
</div>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../.." class="md-nav__link">
<span class="md-ellipsis">
Home
</span>
</a>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_2" >
<label class="md-nav__link" for="__nav_2" id="__nav_2_label" tabindex="0">
<span class="md-ellipsis">
User Guide
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_2_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_2">
<span class="md-nav__icon md-icon"></span>
User Guide
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../userguide/streams/" class="md-nav__link">
<span class="md-ellipsis">
Core Concepts
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../userguide/audio/" class="md-nav__link">
<span class="md-ellipsis">
Audio Streaming
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../userguide/video/" class="md-nav__link">
<span class="md-ellipsis">
Video Streaming
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../userguide/audio-video/" class="md-nav__link">
<span class="md-ellipsis">
Audio-Video Streaming
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../userguide/gradio/" class="md-nav__link">
<span class="md-ellipsis">
Gradio
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../userguide/api/" class="md-nav__link">
<span class="md-ellipsis">
API
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="../../cookbook/" class="md-nav__link">
<span class="md-ellipsis">
Cookbook
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../deployment/" class="md-nav__link">
<span class="md-ellipsis">
Deployment
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../advanced-configuration/" class="md-nav__link">
<span class="md-ellipsis">
Advanced Configuration
</span>
</a>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_6" >
<label class="md-nav__link" for="__nav_6" id="__nav_6_label" tabindex="0">
<span class="md-ellipsis">
Plugin Ecosystem
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_6_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_6">
<span class="md-nav__icon md-icon"></span>
Plugin Ecosystem
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../text_to_speech_gallery/" class="md-nav__link">
<span class="md-ellipsis">
Text-to-Speech Gallery
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../speech_to_text_gallery/" class="md-nav__link">
<span class="md-ellipsis">
Speech-to-Text Gallery
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../turn_taking_gallery/" class="md-nav__link">
<span class="md-ellipsis">
Turn-taking Gallery
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="../../utils/" class="md-nav__link">
<span class="md-ellipsis">
Utils
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../faq/" class="md-nav__link">
<span class="md-ellipsis">
Frequently Asked Questions
</span>
</a>
</li>
<li class="md-nav__item md-nav__item--active md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_9" checked>
<label class="md-nav__link" for="__nav_9" id="__nav_9_label" tabindex="0">
<span class="md-ellipsis">
API Reference
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_9_label" aria-expanded="true">
<label class="md-nav__title" for="__nav_9">
<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="../stream/" class="md-nav__link">
<span class="md-ellipsis">
Stream
</span>
</a>
</li>
<li class="md-nav__item md-nav__item--active">
<input class="md-nav__toggle md-toggle" type="checkbox" id="__toc">
<label class="md-nav__link md-nav__link--active" for="__toc">
<span class="md-ellipsis">
Pause Detection Handlers
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<a href="./" class="md-nav__link md-nav__link--active">
<span class="md-ellipsis">
Pause Detection Handlers
</span>
</a>
<nav class="md-nav md-nav--secondary" aria-label="Table of contents">
<label class="md-nav__title" for="__toc">
<span class="md-nav__icon md-icon"></span>
Table of contents
</label>
<ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
<li class="md-nav__item">
<a href="#replyonpause-class" class="md-nav__link">
<span class="md-ellipsis">
ReplyOnPause Class
</span>
</a>
<nav class="md-nav" aria-label="ReplyOnPause Class">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#methods" class="md-nav__link">
<span class="md-ellipsis">
Methods
</span>
</a>
<nav class="md-nav" aria-label="Methods">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#__init__" class="md-nav__link">
<span class="md-ellipsis">
__init__
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#receive" class="md-nav__link">
<span class="md-ellipsis">
receive
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#emit" class="md-nav__link">
<span class="md-ellipsis">
emit
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#start_up" class="md-nav__link">
<span class="md-ellipsis">
start_up
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#copy" class="md-nav__link">
<span class="md-ellipsis">
copy
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#determine_pause" class="md-nav__link">
<span class="md-ellipsis">
determine_pause
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#process_audio" class="md-nav__link">
<span class="md-ellipsis">
process_audio
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#reset" class="md-nav__link">
<span class="md-ellipsis">
reset
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#trigger_response" class="md-nav__link">
<span class="md-ellipsis">
trigger_response
</span>
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#replyonstopwords-class" class="md-nav__link">
<span class="md-ellipsis">
ReplyOnStopWords Class
</span>
</a>
<nav class="md-nav" aria-label="ReplyOnStopWords Class">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#methods_1" class="md-nav__link">
<span class="md-ellipsis">
Methods
</span>
</a>
<nav class="md-nav" aria-label="Methods">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#__init___1" class="md-nav__link">
<span class="md-ellipsis">
__init__
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#stop_word_detected" class="md-nav__link">
<span class="md-ellipsis">
stop_word_detected
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#send_stopword" class="md-nav__link">
<span class="md-ellipsis">
send_stopword
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#determine_pause_1" class="md-nav__link">
<span class="md-ellipsis">
determine_pause
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#reset_1" class="md-nav__link">
<span class="md-ellipsis">
reset
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#copy_1" class="md-nav__link">
<span class="md-ellipsis">
copy
</span>
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="../stream_handlers/" class="md-nav__link">
<span class="md-ellipsis">
Stream Handlers
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../utils/" class="md-nav__link">
<span class="md-ellipsis">
Utils
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../credentials/" class="md-nav__link">
<span class="md-ellipsis">
TURN Credentials
</span>
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</div>
</div>
</div>
<div class="md-sidebar md-sidebar--secondary" data-md-component="sidebar" data-md-type="toc" >
<div class="md-sidebar__scrollwrap">
<div class="md-sidebar__inner">
<nav class="md-nav md-nav--secondary" aria-label="Table of contents">
<label class="md-nav__title" for="__toc">
<span class="md-nav__icon md-icon"></span>
Table of contents
</label>
<ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
<li class="md-nav__item">
<a href="#replyonpause-class" class="md-nav__link">
<span class="md-ellipsis">
ReplyOnPause Class
</span>
</a>
<nav class="md-nav" aria-label="ReplyOnPause Class">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#methods" class="md-nav__link">
<span class="md-ellipsis">
Methods
</span>
</a>
<nav class="md-nav" aria-label="Methods">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#__init__" class="md-nav__link">
<span class="md-ellipsis">
__init__
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#receive" class="md-nav__link">
<span class="md-ellipsis">
receive
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#emit" class="md-nav__link">
<span class="md-ellipsis">
emit
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#start_up" class="md-nav__link">
<span class="md-ellipsis">
start_up
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#copy" class="md-nav__link">
<span class="md-ellipsis">
copy
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#determine_pause" class="md-nav__link">
<span class="md-ellipsis">
determine_pause
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#process_audio" class="md-nav__link">
<span class="md-ellipsis">
process_audio
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#reset" class="md-nav__link">
<span class="md-ellipsis">
reset
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#trigger_response" class="md-nav__link">
<span class="md-ellipsis">
trigger_response
</span>
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#replyonstopwords-class" class="md-nav__link">
<span class="md-ellipsis">
ReplyOnStopWords Class
</span>
</a>
<nav class="md-nav" aria-label="ReplyOnStopWords Class">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#methods_1" class="md-nav__link">
<span class="md-ellipsis">
Methods
</span>
</a>
<nav class="md-nav" aria-label="Methods">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#__init___1" class="md-nav__link">
<span class="md-ellipsis">
__init__
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#stop_word_detected" class="md-nav__link">
<span class="md-ellipsis">
stop_word_detected
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#send_stopword" class="md-nav__link">
<span class="md-ellipsis">
send_stopword
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#determine_pause_1" class="md-nav__link">
<span class="md-ellipsis">
determine_pause
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#reset_1" class="md-nav__link">
<span class="md-ellipsis">
reset
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#copy_1" class="md-nav__link">
<span class="md-ellipsis">
copy
</span>
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</div>
</div>
</div>
<div class="md-content" data-md-component="content">
<article class="md-content__inner md-typeset">
<h1>Pause Detection Handlers</h1>
<h2 id="replyonpause-class"><code>ReplyOnPause</code> Class</h2>
<div class="language-python highlight"><pre><span></span><code><span id="__span-0-1"><a id="__codelineno-0-1" name="__codelineno-0-1" href="#__codelineno-0-1"></a><span class="n">ReplyOnPause</span><span class="p">(</span>
</span><span id="__span-0-2"><a id="__codelineno-0-2" name="__codelineno-0-2" href="#__codelineno-0-2"></a> <span class="n">fn</span><span class="p">:</span> <span class="n">ReplyFnGenerator</span><span class="p">,</span>
</span><span id="__span-0-3"><a id="__codelineno-0-3" name="__codelineno-0-3" href="#__codelineno-0-3"></a> <span class="n">startup_fn</span><span class="p">:</span> <span class="n">Callable</span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="__span-0-4"><a id="__codelineno-0-4" name="__codelineno-0-4" href="#__codelineno-0-4"></a> <span class="n">algo_options</span><span class="p">:</span> <span class="n">AlgoOptions</span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="__span-0-5"><a id="__codelineno-0-5" name="__codelineno-0-5" href="#__codelineno-0-5"></a> <span class="n">model_options</span><span class="p">:</span> <span class="n">ModelOptions</span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="__span-0-6"><a id="__codelineno-0-6" name="__codelineno-0-6" href="#__codelineno-0-6"></a> <span class="n">can_interrupt</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">True</span><span class="p">,</span>
</span><span id="__span-0-7"><a id="__codelineno-0-7" name="__codelineno-0-7" href="#__codelineno-0-7"></a> <span class="n">expected_layout</span><span class="p">:</span> <span class="n">Literal</span><span class="p">[</span><span class="s2">&quot;mono&quot;</span><span class="p">,</span> <span class="s2">&quot;stereo&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="s2">&quot;mono&quot;</span><span class="p">,</span>
</span><span id="__span-0-8"><a id="__codelineno-0-8" name="__codelineno-0-8" href="#__codelineno-0-8"></a> <span class="n">output_sample_rate</span><span class="p">:</span> <span class="nb">int</span> <span class="o">=</span> <span class="mi">24000</span><span class="p">,</span>
</span><span id="__span-0-9"><a id="__codelineno-0-9" name="__codelineno-0-9" href="#__codelineno-0-9"></a> <span class="n">output_frame_size</span><span class="p">:</span> <span class="nb">int</span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span> <span class="c1"># Deprecated</span>
</span><span id="__span-0-10"><a id="__codelineno-0-10" name="__codelineno-0-10" href="#__codelineno-0-10"></a> <span class="n">input_sample_rate</span><span class="p">:</span> <span class="nb">int</span> <span class="o">=</span> <span class="mi">48000</span><span class="p">,</span>
</span><span id="__span-0-11"><a id="__codelineno-0-11" name="__codelineno-0-11" href="#__codelineno-0-11"></a> <span class="n">model</span><span class="p">:</span> <span class="n">PauseDetectionModel</span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="__span-0-12"><a id="__codelineno-0-12" name="__codelineno-0-12" href="#__codelineno-0-12"></a><span class="p">)</span>
</span></code></pre></div>
<p>A stream handler that processes incoming audio, detects pauses, and triggers a reply function (<code>fn</code>) when a pause is detected.</p>
<p>This handler accumulates audio chunks, uses a Voice Activity Detection (VAD) model to determine speech segments, and identifies pauses based on configurable thresholds. Once a pause is detected after speech has started, it calls the provided generator function <code>fn</code> with the accumulated audio.</p>
<p>It can optionally run a <code>startup_fn</code> at the beginning and supports interruption of the reply function if new audio arrives.</p>
<h3 id="methods">Methods</h3>
<h4 id="__init__"><code>__init__</code></h4>
<div class="language-python highlight"><pre><span></span><code><span id="__span-1-1"><a id="__codelineno-1-1" name="__codelineno-1-1" href="#__codelineno-1-1"></a><span class="fm">__init__</span><span class="p">(</span>
</span><span id="__span-1-2"><a id="__codelineno-1-2" name="__codelineno-1-2" href="#__codelineno-1-2"></a> <span class="n">fn</span><span class="p">:</span> <span class="n">ReplyFnGenerator</span><span class="p">,</span>
</span><span id="__span-1-3"><a id="__codelineno-1-3" name="__codelineno-1-3" href="#__codelineno-1-3"></a> <span class="n">startup_fn</span><span class="p">:</span> <span class="n">Callable</span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="__span-1-4"><a id="__codelineno-1-4" name="__codelineno-1-4" href="#__codelineno-1-4"></a> <span class="n">algo_options</span><span class="p">:</span> <span class="n">AlgoOptions</span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="__span-1-5"><a id="__codelineno-1-5" name="__codelineno-1-5" href="#__codelineno-1-5"></a> <span class="n">model_options</span><span class="p">:</span> <span class="n">ModelOptions</span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="__span-1-6"><a id="__codelineno-1-6" name="__codelineno-1-6" href="#__codelineno-1-6"></a> <span class="n">can_interrupt</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">True</span><span class="p">,</span>
</span><span id="__span-1-7"><a id="__codelineno-1-7" name="__codelineno-1-7" href="#__codelineno-1-7"></a> <span class="n">expected_layout</span><span class="p">:</span> <span class="n">Literal</span><span class="p">[</span><span class="s2">&quot;mono&quot;</span><span class="p">,</span> <span class="s2">&quot;stereo&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="s2">&quot;mono&quot;</span><span class="p">,</span>
</span><span id="__span-1-8"><a id="__codelineno-1-8" name="__codelineno-1-8" href="#__codelineno-1-8"></a> <span class="n">output_sample_rate</span><span class="p">:</span> <span class="nb">int</span> <span class="o">=</span> <span class="mi">24000</span><span class="p">,</span>
</span><span id="__span-1-9"><a id="__codelineno-1-9" name="__codelineno-1-9" href="#__codelineno-1-9"></a> <span class="n">output_frame_size</span><span class="p">:</span> <span class="nb">int</span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span> <span class="c1"># Deprecated</span>
</span><span id="__span-1-10"><a id="__codelineno-1-10" name="__codelineno-1-10" href="#__codelineno-1-10"></a> <span class="n">input_sample_rate</span><span class="p">:</span> <span class="nb">int</span> <span class="o">=</span> <span class="mi">48000</span><span class="p">,</span>
</span><span id="__span-1-11"><a id="__codelineno-1-11" name="__codelineno-1-11" href="#__codelineno-1-11"></a> <span class="n">model</span><span class="p">:</span> <span class="n">PauseDetectionModel</span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="__span-1-12"><a id="__codelineno-1-12" name="__codelineno-1-12" href="#__codelineno-1-12"></a><span class="p">)</span>
</span></code></pre></div>
<p>Initializes the ReplyOnPause handler.</p>
<p><strong>Args:</strong></p>
<table>
<thead>
<tr>
<th style="text-align: left;">Name</th>
<th style="text-align: left;">Type</th>
<th style="text-align: left;">Description</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align: left;"><code>fn</code></td>
<td style="text-align: left;"><code>ReplyFnGenerator</code></td>
<td style="text-align: left;">The generator function to execute upon pause detection. It receives <code>(sample_rate, audio_array)</code> and optionally <code>*args</code>.</td>
</tr>
<tr>
<td style="text-align: left;"><code>startup_fn</code></td>
<td style="text-align: left;"><code>Callable | None</code></td>
<td style="text-align: left;">An optional function to run once at the beginning.</td>
</tr>
<tr>
<td style="text-align: left;"><code>algo_options</code></td>
<td style="text-align: left;"><code>AlgoOptions | None</code></td>
<td style="text-align: left;">Options for the pause detection algorithm.</td>
</tr>
<tr>
<td style="text-align: left;"><code>model_options</code></td>
<td style="text-align: left;"><code>ModelOptions | None</code></td>
<td style="text-align: left;">Options for the VAD model.</td>
</tr>
<tr>
<td style="text-align: left;"><code>can_interrupt</code></td>
<td style="text-align: left;"><code>bool</code></td>
<td style="text-align: left;">If True, incoming audio during <code>fn</code> execution will stop the generator and process the new audio.</td>
</tr>
<tr>
<td style="text-align: left;"><code>expected_layout</code></td>
<td style="text-align: left;"><code>Literal["mono", "stereo"]</code></td>
<td style="text-align: left;">Expected input audio layout ('mono' or 'stereo').</td>
</tr>
<tr>
<td style="text-align: left;"><code>output_sample_rate</code></td>
<td style="text-align: left;"><code>int</code></td>
<td style="text-align: left;">The sample rate expected for audio yielded by <code>fn</code>.</td>
</tr>
<tr>
<td style="text-align: left;"><code>output_frame_size</code></td>
<td style="text-align: left;"><code>int | None</code></td>
<td style="text-align: left;">Deprecated.</td>
</tr>
<tr>
<td style="text-align: left;"><code>input_sample_rate</code></td>
<td style="text-align: left;"><code>int</code></td>
<td style="text-align: left;">The expected sample rate of incoming audio.</td>
</tr>
<tr>
<td style="text-align: left;"><code>model</code></td>
<td style="text-align: left;"><code>PauseDetectionModel | None</code></td>
<td style="text-align: left;">An optional pre-initialized VAD model instance.</td>
</tr>
</tbody>
</table>
<hr />
<h4 id="receive"><code>receive</code></h4>
<div class="language-python highlight"><pre><span></span><code><span id="__span-2-1"><a id="__codelineno-2-1" name="__codelineno-2-1" href="#__codelineno-2-1"></a><span class="n">receive</span><span class="p">(</span><span class="n">frame</span><span class="p">:</span> <span class="nb">tuple</span><span class="p">[</span><span class="nb">int</span><span class="p">,</span> <span class="n">np</span><span class="o">.</span><span class="n">ndarray</span><span class="p">])</span> <span class="o">-&gt;</span> <span class="kc">None</span>
</span></code></pre></div>
<p>Receives an audio frame from the stream. Processes the audio frame using <code>process_audio</code>. If a pause is detected, it sets the event. If interruption is enabled and a reply is ongoing, it closes the current generator and clears the processing queue.</p>
<p><strong>Args:</strong></p>
<table>
<thead>
<tr>
<th style="text-align: left;">Name</th>
<th style="text-align: left;">Type</th>
<th style="text-align: left;">Description</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align: left;"><code>frame</code></td>
<td style="text-align: left;"><code>tuple[int, np.ndarray]</code></td>
<td style="text-align: left;">A tuple containing the sample rate and the audio frame data.</td>
</tr>
</tbody>
</table>
<hr />
<h4 id="emit"><code>emit</code></h4>
<div class="language-python highlight"><pre><span></span><code><span id="__span-3-1"><a id="__codelineno-3-1" name="__codelineno-3-1" href="#__codelineno-3-1"></a><span class="n">emit</span><span class="p">()</span> <span class="o">-&gt;</span> <span class="n">EmitType</span> <span class="o">|</span> <span class="kc">None</span>
</span></code></pre></div>
<p>Produces the next output chunk from the reply generator (<code>fn</code>).</p>
<p>This method is called repeatedly after a pause is detected (event is set). If the generator is not already running, it initializes it by calling <code>fn</code> with the accumulated audio and any required additional arguments. It then yields the next item from the generator. Handles both sync and async generators. Resets the state upon generator completion or error.</p>
<p><strong>Returns:</strong></p>
<table>
<thead>
<tr>
<th style="text-align: left;">Type</th>
<th style="text-align: left;">Description</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align: left;"><code>EmitType | None</code></td>
<td style="text-align: left;">The next output item from the generator, or None if no pause event has occurred or the generator is exhausted.</td>
</tr>
</tbody>
</table>
<p><strong>Raises:</strong></p>
<ul>
<li><strong><code>Exception</code></strong>: Re-raises exceptions occurring within the <code>fn</code> generator.</li>
</ul>
<hr />
<h4 id="start_up"><code>start_up</code></h4>
<div class="language-python highlight"><pre><span></span><code><span id="__span-4-1"><a id="__codelineno-4-1" name="__codelineno-4-1" href="#__codelineno-4-1"></a><span class="n">start_up</span><span class="p">()</span>
</span></code></pre></div>
<p>Executes the startup function <code>startup_fn</code> if provided. Waits for additional arguments if needed before calling <code>startup_fn</code>.</p>
<hr />
<h4 id="copy"><code>copy</code></h4>
<div class="language-python highlight"><pre><span></span><code><span id="__span-5-1"><a id="__codelineno-5-1" name="__codelineno-5-1" href="#__codelineno-5-1"></a><span class="n">copy</span><span class="p">()</span> <span class="o">-&gt;</span> <span class="n">ReplyOnPause</span>
</span></code></pre></div>
<p>Creates a new instance of ReplyOnPause with the same configuration.</p>
<p><strong>Returns:</strong></p>
<table>
<thead>
<tr>
<th style="text-align: left;">Type</th>
<th style="text-align: left;">Description</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align: left;"><code>ReplyOnPause</code></td>
<td style="text-align: left;">A new <code>ReplyOnPause</code> instance with identical settings.</td>
</tr>
</tbody>
</table>
<hr />
<h4 id="determine_pause"><code>determine_pause</code></h4>
<div class="language-python highlight"><pre><span></span><code><span id="__span-6-1"><a id="__codelineno-6-1" name="__codelineno-6-1" href="#__codelineno-6-1"></a><span class="n">determine_pause</span><span class="p">(</span><span class="n">audio</span><span class="p">:</span> <span class="n">np</span><span class="o">.</span><span class="n">ndarray</span><span class="p">,</span> <span class="n">sampling_rate</span><span class="p">:</span> <span class="nb">int</span><span class="p">,</span> <span class="n">state</span><span class="p">:</span> <span class="n">AppState</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">bool</span>
</span></code></pre></div>
<p>Analyzes an audio chunk to detect if a significant pause occurred after speech.</p>
<p>Uses the VAD model to measure speech duration within the chunk. Updates the application state (<code>state</code>) regarding whether talking has started and accumulates speech segments.</p>
<p><strong>Args:</strong></p>
<table>
<thead>
<tr>
<th style="text-align: left;">Name</th>
<th style="text-align: left;">Type</th>
<th style="text-align: left;">Description</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align: left;"><code>audio</code></td>
<td style="text-align: left;"><code>np.ndarray</code></td>
<td style="text-align: left;">The numpy array containing the audio chunk.</td>
</tr>
<tr>
<td style="text-align: left;"><code>sampling_rate</code></td>
<td style="text-align: left;"><code>int</code></td>
<td style="text-align: left;">The sample rate of the audio chunk.</td>
</tr>
<tr>
<td style="text-align: left;"><code>state</code></td>
<td style="text-align: left;"><code>AppState</code></td>
<td style="text-align: left;">The current application state.</td>
</tr>
</tbody>
</table>
<p><strong>Returns:</strong></p>
<table>
<thead>
<tr>
<th style="text-align: left;">Type</th>
<th style="text-align: left;">Description</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align: left;"><code>bool</code></td>
<td style="text-align: left;">True if a pause satisfying the configured thresholds is detected after speech has started, False otherwise.</td>
</tr>
</tbody>
</table>
<hr />
<h4 id="process_audio"><code>process_audio</code></h4>
<div class="language-python highlight"><pre><span></span><code><span id="__span-7-1"><a id="__codelineno-7-1" name="__codelineno-7-1" href="#__codelineno-7-1"></a><span class="n">process_audio</span><span class="p">(</span><span class="n">audio</span><span class="p">:</span> <span class="nb">tuple</span><span class="p">[</span><span class="nb">int</span><span class="p">,</span> <span class="n">np</span><span class="o">.</span><span class="n">ndarray</span><span class="p">],</span> <span class="n">state</span><span class="p">:</span> <span class="n">AppState</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="kc">None</span>
</span></code></pre></div>
<p>Processes an incoming audio frame. Appends the frame to the buffer, runs pause detection on the buffer, and updates the application state.</p>
<p><strong>Args:</strong></p>
<table>
<thead>
<tr>
<th style="text-align: left;">Name</th>
<th style="text-align: left;">Type</th>
<th style="text-align: left;">Description</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align: left;"><code>audio</code></td>
<td style="text-align: left;"><code>tuple[int, np.ndarray]</code></td>
<td style="text-align: left;">A tuple containing the sample rate and the audio frame data.</td>
</tr>
<tr>
<td style="text-align: left;"><code>state</code></td>
<td style="text-align: left;"><code>AppState</code></td>
<td style="text-align: left;">The current application state to update.</td>
</tr>
</tbody>
</table>
<hr />
<h4 id="reset"><code>reset</code></h4>
<div class="language-python highlight"><pre><span></span><code><span id="__span-8-1"><a id="__codelineno-8-1" name="__codelineno-8-1" href="#__codelineno-8-1"></a><span class="n">reset</span><span class="p">()</span>
</span></code></pre></div>
<p>Resets the handler state to its initial condition. Clears accumulated audio, resets state flags, closes any active generator, and clears the event flag.</p>
<hr />
<h4 id="trigger_response"><code>trigger_response</code></h4>
<div class="language-python highlight"><pre><span></span><code><span id="__span-9-1"><a id="__codelineno-9-1" name="__codelineno-9-1" href="#__codelineno-9-1"></a><span class="n">trigger_response</span><span class="p">()</span>
</span></code></pre></div>
<p>Manually triggers the response generation process. Sets the event flag, effectively simulating a pause detection. Initializes the stream buffer if it's empty.</p>
<hr />
<h2 id="replyonstopwords-class"><code>ReplyOnStopWords</code> Class</h2>
<div class="language-python highlight"><pre><span></span><code><span id="__span-10-1"><a id="__codelineno-10-1" name="__codelineno-10-1" href="#__codelineno-10-1"></a><span class="n">ReplyOnStopWords</span><span class="p">(</span>
</span><span id="__span-10-2"><a id="__codelineno-10-2" name="__codelineno-10-2" href="#__codelineno-10-2"></a> <span class="n">fn</span><span class="p">:</span> <span class="n">ReplyFnGenerator</span><span class="p">,</span>
</span><span id="__span-10-3"><a id="__codelineno-10-3" name="__codelineno-10-3" href="#__codelineno-10-3"></a> <span class="n">stop_words</span><span class="p">:</span> <span class="nb">list</span><span class="p">[</span><span class="nb">str</span><span class="p">],</span>
</span><span id="__span-10-4"><a id="__codelineno-10-4" name="__codelineno-10-4" href="#__codelineno-10-4"></a> <span class="n">startup_fn</span><span class="p">:</span> <span class="n">Callable</span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="__span-10-5"><a id="__codelineno-10-5" name="__codelineno-10-5" href="#__codelineno-10-5"></a> <span class="n">algo_options</span><span class="p">:</span> <span class="n">AlgoOptions</span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="__span-10-6"><a id="__codelineno-10-6" name="__codelineno-10-6" href="#__codelineno-10-6"></a> <span class="n">model_options</span><span class="p">:</span> <span class="n">ModelOptions</span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="__span-10-7"><a id="__codelineno-10-7" name="__codelineno-10-7" href="#__codelineno-10-7"></a> <span class="n">can_interrupt</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">True</span><span class="p">,</span>
</span><span id="__span-10-8"><a id="__codelineno-10-8" name="__codelineno-10-8" href="#__codelineno-10-8"></a> <span class="n">expected_layout</span><span class="p">:</span> <span class="n">Literal</span><span class="p">[</span><span class="s2">&quot;mono&quot;</span><span class="p">,</span> <span class="s2">&quot;stereo&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="s2">&quot;mono&quot;</span><span class="p">,</span>
</span><span id="__span-10-9"><a id="__codelineno-10-9" name="__codelineno-10-9" href="#__codelineno-10-9"></a> <span class="n">output_sample_rate</span><span class="p">:</span> <span class="nb">int</span> <span class="o">=</span> <span class="mi">24000</span><span class="p">,</span>
</span><span id="__span-10-10"><a id="__codelineno-10-10" name="__codelineno-10-10" href="#__codelineno-10-10"></a> <span class="n">output_frame_size</span><span class="p">:</span> <span class="nb">int</span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span> <span class="c1"># Deprecated</span>
</span><span id="__span-10-11"><a id="__codelineno-10-11" name="__codelineno-10-11" href="#__codelineno-10-11"></a> <span class="n">input_sample_rate</span><span class="p">:</span> <span class="nb">int</span> <span class="o">=</span> <span class="mi">48000</span><span class="p">,</span>
</span><span id="__span-10-12"><a id="__codelineno-10-12" name="__codelineno-10-12" href="#__codelineno-10-12"></a> <span class="n">model</span><span class="p">:</span> <span class="n">PauseDetectionModel</span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="__span-10-13"><a id="__codelineno-10-13" name="__codelineno-10-13" href="#__codelineno-10-13"></a><span class="p">)</span>
</span></code></pre></div>
<p>A stream handler that extends <code>ReplyOnPause</code> to trigger based on stop words followed by a pause.</p>
<p>This handler listens to the incoming audio stream, performs Speech-to-Text (STT) to detect predefined stop words. Once a stop word is detected, it waits for a subsequent pause in speech (using the VAD model) before triggering the reply function (<code>fn</code>) with the audio recorded <em>after</em> the stop word.</p>
<h3 id="methods_1">Methods</h3>
<h4 id="__init___1"><code>__init__</code></h4>
<div class="language-python highlight"><pre><span></span><code><span id="__span-11-1"><a id="__codelineno-11-1" name="__codelineno-11-1" href="#__codelineno-11-1"></a><span class="fm">__init__</span><span class="p">(</span>
</span><span id="__span-11-2"><a id="__codelineno-11-2" name="__codelineno-11-2" href="#__codelineno-11-2"></a> <span class="n">fn</span><span class="p">:</span> <span class="n">ReplyFnGenerator</span><span class="p">,</span>
</span><span id="__span-11-3"><a id="__codelineno-11-3" name="__codelineno-11-3" href="#__codelineno-11-3"></a> <span class="n">stop_words</span><span class="p">:</span> <span class="nb">list</span><span class="p">[</span><span class="nb">str</span><span class="p">],</span>
</span><span id="__span-11-4"><a id="__codelineno-11-4" name="__codelineno-11-4" href="#__codelineno-11-4"></a> <span class="n">startup_fn</span><span class="p">:</span> <span class="n">Callable</span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="__span-11-5"><a id="__codelineno-11-5" name="__codelineno-11-5" href="#__codelineno-11-5"></a> <span class="n">algo_options</span><span class="p">:</span> <span class="n">AlgoOptions</span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="__span-11-6"><a id="__codelineno-11-6" name="__codelineno-11-6" href="#__codelineno-11-6"></a> <span class="n">model_options</span><span class="p">:</span> <span class="n">ModelOptions</span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="__span-11-7"><a id="__codelineno-11-7" name="__codelineno-11-7" href="#__codelineno-11-7"></a> <span class="n">can_interrupt</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">True</span><span class="p">,</span>
</span><span id="__span-11-8"><a id="__codelineno-11-8" name="__codelineno-11-8" href="#__codelineno-11-8"></a> <span class="n">expected_layout</span><span class="p">:</span> <span class="n">Literal</span><span class="p">[</span><span class="s2">&quot;mono&quot;</span><span class="p">,</span> <span class="s2">&quot;stereo&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="s2">&quot;mono&quot;</span><span class="p">,</span>
</span><span id="__span-11-9"><a id="__codelineno-11-9" name="__codelineno-11-9" href="#__codelineno-11-9"></a> <span class="n">output_sample_rate</span><span class="p">:</span> <span class="nb">int</span> <span class="o">=</span> <span class="mi">24000</span><span class="p">,</span>
</span><span id="__span-11-10"><a id="__codelineno-11-10" name="__codelineno-11-10" href="#__codelineno-11-10"></a> <span class="n">output_frame_size</span><span class="p">:</span> <span class="nb">int</span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span> <span class="c1"># Deprecated</span>
</span><span id="__span-11-11"><a id="__codelineno-11-11" name="__codelineno-11-11" href="#__codelineno-11-11"></a> <span class="n">input_sample_rate</span><span class="p">:</span> <span class="nb">int</span> <span class="o">=</span> <span class="mi">48000</span><span class="p">,</span>
</span><span id="__span-11-12"><a id="__codelineno-11-12" name="__codelineno-11-12" href="#__codelineno-11-12"></a> <span class="n">model</span><span class="p">:</span> <span class="n">PauseDetectionModel</span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="__span-11-13"><a id="__codelineno-11-13" name="__codelineno-11-13" href="#__codelineno-11-13"></a><span class="p">)</span>
</span></code></pre></div>
<p>Initializes the ReplyOnStopWords handler.</p>
<p><strong>Args:</strong></p>
<p><em>(Inherits Args from <code>ReplyOnPause.__init__</code>)</em></p>
<table>
<thead>
<tr>
<th style="text-align: left;">Name</th>
<th style="text-align: left;">Type</th>
<th style="text-align: left;">Description</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align: left;"><code>stop_words</code></td>
<td style="text-align: left;"><code>list[str]</code></td>
<td style="text-align: left;">A list of strings (words or phrases) to listen for. Detection is case-insensitive and ignores punctuation.</td>
</tr>
</tbody>
</table>
<hr />
<h4 id="stop_word_detected"><code>stop_word_detected</code></h4>
<div class="language-python highlight"><pre><span></span><code><span id="__span-12-1"><a id="__codelineno-12-1" name="__codelineno-12-1" href="#__codelineno-12-1"></a><span class="n">stop_word_detected</span><span class="p">(</span><span class="n">text</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">bool</span>
</span></code></pre></div>
<p>Checks if any of the configured stop words are present in the text. Performs a case-insensitive search, treating multi-word stop phrases correctly and ignoring basic punctuation.</p>
<p><strong>Args:</strong></p>
<table>
<thead>
<tr>
<th style="text-align: left;">Name</th>
<th style="text-align: left;">Type</th>
<th style="text-align: left;">Description</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align: left;"><code>text</code></td>
<td style="text-align: left;"><code>str</code></td>
<td style="text-align: left;">The text transcribed from the audio.</td>
</tr>
</tbody>
</table>
<p><strong>Returns:</strong></p>
<table>
<thead>
<tr>
<th style="text-align: left;">Type</th>
<th style="text-align: left;">Description</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align: left;"><code>bool</code></td>
<td style="text-align: left;">True if a stop word is found, False otherwise.</td>
</tr>
</tbody>
</table>
<hr />
<h4 id="send_stopword"><code>send_stopword</code></h4>
<div class="language-python highlight"><pre><span></span><code><span id="__span-13-1"><a id="__codelineno-13-1" name="__codelineno-13-1" href="#__codelineno-13-1"></a><span class="n">send_stopword</span><span class="p">()</span>
</span></code></pre></div>
<p>Sends a 'stopword' message asynchronously via the communication channel (if configured).</p>
<hr />
<h4 id="determine_pause_1"><code>determine_pause</code></h4>
<div class="language-python highlight"><pre><span></span><code><span id="__span-14-1"><a id="__codelineno-14-1" name="__codelineno-14-1" href="#__codelineno-14-1"></a><span class="n">determine_pause</span><span class="p">(</span><span class="n">audio</span><span class="p">:</span> <span class="n">np</span><span class="o">.</span><span class="n">ndarray</span><span class="p">,</span> <span class="n">sampling_rate</span><span class="p">:</span> <span class="nb">int</span><span class="p">,</span> <span class="n">state</span><span class="p">:</span> <span class="n">ReplyOnStopWordsState</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">bool</span>
</span></code></pre></div>
<p>Analyzes an audio chunk to detect stop words and subsequent pauses. Overrides the <code>ReplyOnPause.determine_pause</code> method. First, it performs STT on the audio buffer to detect stop words. Once a stop word is detected (<code>state.stop_word_detected</code> is True), it then uses the VAD model to detect a pause in the audio <em>following</em> the stop word.</p>
<p><strong>Args:</strong></p>
<table>
<thead>
<tr>
<th style="text-align: left;">Name</th>
<th style="text-align: left;">Type</th>
<th style="text-align: left;">Description</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align: left;"><code>audio</code></td>
<td style="text-align: left;"><code>np.ndarray</code></td>
<td style="text-align: left;">The numpy array containing the audio chunk.</td>
</tr>
<tr>
<td style="text-align: left;"><code>sampling_rate</code></td>
<td style="text-align: left;"><code>int</code></td>
<td style="text-align: left;">The sample rate of the audio chunk.</td>
</tr>
<tr>
<td style="text-align: left;"><code>state</code></td>
<td style="text-align: left;"><code>ReplyOnStopWordsState</code></td>
<td style="text-align: left;">The current application state (ReplyOnStopWordsState).</td>
</tr>
</tbody>
</table>
<p><strong>Returns:</strong></p>
<table>
<thead>
<tr>
<th style="text-align: left;">Type</th>
<th style="text-align: left;">Description</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align: left;"><code>bool</code></td>
<td style="text-align: left;">True if a stop word has been detected and a subsequent pause satisfying the configured thresholds is detected, False otherwise.</td>
</tr>
</tbody>
</table>
<hr />
<h4 id="reset_1"><code>reset</code></h4>
<div class="language-python highlight"><pre><span></span><code><span id="__span-15-1"><a id="__codelineno-15-1" name="__codelineno-15-1" href="#__codelineno-15-1"></a><span class="n">reset</span><span class="p">()</span>
</span></code></pre></div>
<p>Resets the handler state to its initial condition. Clears accumulated audio, resets state flags (including stop word state), closes any active generator, and clears the event flag.</p>
<hr />
<h4 id="copy_1"><code>copy</code></h4>
<div class="language-python highlight"><pre><span></span><code><span id="__span-16-1"><a id="__codelineno-16-1" name="__codelineno-16-1" href="#__codelineno-16-1"></a><span class="n">copy</span><span class="p">()</span> <span class="o">-&gt;</span> <span class="n">ReplyOnStopWords</span>
</span></code></pre></div>
<p>Creates a new instance of ReplyOnStopWords with the same configuration.</p>
<p><strong>Returns:</strong></p>
<table>
<thead>
<tr>
<th style="text-align: left;">Type</th>
<th style="text-align: left;">Description</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align: left;"><code>ReplyOnStopWords</code></td>
<td style="text-align: left;">A new <code>ReplyOnStopWords</code> instance with identical settings.</td>
</tr>
</tbody>
</table>
<p><em>(Inherits other public methods like <code>start_up</code>, <code>process_audio</code>, <code>receive</code>, <code>trigger_response</code>, <code>async_iterate</code>, <code>emit</code> from <code>ReplyOnPause</code>)</em></p>
</article>
</div>
<script>var target=document.getElementById(location.hash.slice(1));target&&target.name&&(target.checked=target.name.startsWith("__tabbed_"))</script>
</div>
</main>
<footer class="md-footer">
<div class="md-footer-meta md-typeset">
<div class="md-footer-meta__inner md-grid">
<div class="md-copyright">
Made with
<a href="https://squidfunk.github.io/mkdocs-material/" target="_blank" rel="noopener">
Material for MkDocs
</a>
</div>
</div>
</div>
</footer>
</div>
<div class="md-dialog" data-md-component="dialog">
<div class="md-dialog__inner md-typeset"></div>
</div>
<script id="__config" type="application/json">{"base": "../..", "features": ["content.code.copy", "content.code.annotate", "navigation.indexes"], "search": "../../assets/javascripts/workers/search.d50fe291.min.js", "tags": null, "translations": {"clipboard.copied": "Copied to clipboard", "clipboard.copy": "Copy to clipboard", "search.result.more.one": "1 more on this page", "search.result.more.other": "# more on this page", "search.result.none": "No matching documents", "search.result.one": "1 matching document", "search.result.other": "# matching documents", "search.result.placeholder": "Type to start searching", "search.result.term.missing": "Missing", "select.version": "Select version"}, "version": null}</script>
<script src="../../assets/javascripts/bundle.13a4f30d.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/marked/marked.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/highlight.min.js"></script>
</body>
</html>