@@ -24,14 +24,42 @@ def __init__(self, energy_threshold=1000, phrase_timeout=3.0, record_timeout=30)
24
24
self .data_queue = Queue ()
25
25
self .mic_dev_index = None
26
26
27
- def listen (self ):
27
+ def listen (self , ready_callback = None ):
28
+ self .phrase_complete = False
29
+ start = datetime .utcnow ()
30
+ self .start_listening ()
31
+ if ready_callback :
32
+ ready_callback ()
33
+ while (
34
+ self .listener_handle
35
+ and not self .speech_waiting ()
36
+ or not self .phrase_complete
37
+ ):
38
+ if self .phrase_time and start - self .phrase_time > timedelta (
39
+ seconds = self .phrase_timeout
40
+ ):
41
+ self .last_sample = bytes ()
42
+ self .phrase_complete = True
43
+ self .phrase_time = start
44
+ self .stop_listening ()
45
+
46
+ def start_listening (self ):
28
47
if not self .listener_handle :
29
48
with sr .Microphone () as source :
30
- print (source .stream )
31
49
self .recognizer .adjust_for_ambient_noise (source )
32
- audio = self .recognizer .listen (source , timeout = self .record_timeout )
33
- data = audio .get_raw_data ()
34
- self .data_queue .put (data )
50
+ self .listener_handle = self .recognizer .listen_in_background (
51
+ sr .Microphone (),
52
+ self .record_callback ,
53
+ phrase_time_limit = self .record_timeout ,
54
+ )
55
+
56
+ def stop_listening (self , wait_for_stop = False ):
57
+ if self .listener_handle :
58
+ self .listener_handle (wait_for_stop = wait_for_stop )
59
+ self .listener_handle = None
60
+
61
+ def is_listening (self ):
62
+ return self .listener_handle is not None
35
63
36
64
def record_callback (self , _ , audio : sr .AudioData ) -> None :
37
65
# Grab the raw bytes and push it into the thread safe queue.
0 commit comments