I found this script that works fine for real-time speech recognition, but my requirement is to listen the microphone first and when the user stops talking the microphone should be disabled and the audio input should be transcribed in text and I can perform some other actions on that text when all things are done the microphone should be enabled again and the record audio should be executed. I have tried different ways like disable_microphone flag, Using independent functions but nothing worked. Here is the base code that needs to be modified. import io from pydub import AudioSegment import speech_recognition as sr import whisper import queue import tempfile import os import threading import click import torch import numpy as np @click.command() @click.option("--model", default="base", help="Model to use", type=click.Choice(["tiny","base", "small","medium","large"])) @click.option("--english", default=False, help="Whether to use English model",is_flag=True, type=bool) @click.option("--verbose", default=False, help="Whether to print verbose output", is_flag=True,type=bool) @click.option("--energy", default=300, help="Energy level for mic to detect", type=int) @click.option("--dynamic_energy", default=False,is_flag=True, help="Flag to enable dynamic engergy", type=bool) @click.option("--pause", default=0.8, help="Pause time before entry ends", type=float) @click.option("--save_file",default=False, help="Flag to save file", is_flag=True,type=bool) def main(model, english,verbose, energy, pause,dynamic_energy,save_file): temp_dir = tempfile.mkdtemp() if save_file else None #there are no english models for large if model != "large" and english: model = model + ".en" audio_model = whisper.load_model(model) audio_queue = queue.Queue() result_queue = queue.Queue() threading.Thread(target=record_audio, args=(audio_queue, energy, pause, dynamic_energy, save_file, temp_dir)).start() threading.Thread(target=transcribe_forever, args=(audio_queue, result_queue, audio_model, english, verbose, save_file)).start() while True: print(result_queue.get()) def record_audio(audio_queue, energy, pause, dynamic_energy, save_file, temp_dir): #load the speech recognizer and set the initial energy threshold and pause threshold r = sr.Recognizer() r.energy_threshold = energy r.pause_threshold = pause r.dynamic_energy_threshold = dynamic_energy with sr.Microphone(sample_rate=16000) as source: print("Say something!") i = 0 while True: #get and save audio to wav file audio = r.listen(source) if save_file: data = io.BytesIO(audio.get_wav_data()) audio_clip = AudioSegment.from_file(data) filename = os.path.join(temp_dir, f"temp{i}.wav") audio_clip.export(filename, format="wav") audio_data = filename else: torch_audio = torch.from_numpy(np.frombuffer(audio.get_raw_data(), np.int16).flatten().astype(np.float32) / 32768.0) audio_data = torch_audio audio_queue.put_nowait(audio_data) i += 1 def transcribe_forever(audio_queue, result_queue, audio_model, english, verbose, save_file): while True: audio_data = audio_queue.get() if english: result = audio_model.transcribe(audio_data,language='english') else: result = audio_model.transcribe(audio_data) if not verbose: predicted_text = result["text"] result_queue.put_nowait("You said: " + predicted_text) else: result_queue.put_nowait(result) if save_file: os.remove(audio_data) main() For now we can simply ask user either the transcripted text is correct or not? just to create a pause between Turning microphone off and on again. I have tried different ways like disable_microphone flag, Using independent functions instead of Threads to simply record and transcribe the audio but it didn't work also. Continue reading...