From bccbb15177137f5ea7246b2211791f2481c41279 Mon Sep 17 00:00:00 2001 From: Tijs Zwinkels Date: Wed, 20 Mar 2024 16:29:01 +0100 Subject: [PATCH 1/5] Move creation of OnlineASRProcessor inside the factory method Preventing more code duplication between whisper_online.py and whisper_online_server.py --- whisper_online.py | 35 ++++++++++++++++++----------------- whisper_online_server.py | 17 +---------------- 2 files changed, 19 insertions(+), 33 deletions(-) diff --git a/whisper_online.py b/whisper_online.py index a00547e..c4a90e3 100644 --- a/whisper_online.py +++ b/whisper_online.py @@ -551,7 +551,7 @@ def add_shared_args(parser): def asr_factory(args, logfile=sys.stderr): """ - Creates and configures an ASR instance based on the specified backend and arguments. + Creates and configures an ASR and ASR Online instance based on the specified backend and arguments. """ backend = args.backend if backend == "openai-api": @@ -576,8 +576,23 @@ def asr_factory(args, logfile=sys.stderr): print("Setting VAD filter", file=logfile) asr.use_vad() - return asr + language = args.lan + if args.task == "translate": + asr.set_translate_task() + tgt_language = "en" # Whisper translates into English + else: + tgt_language = language # Whisper transcribes in this language + # Create the tokenizer + if args.buffer_trimming == "sentence": + tokenizer = create_tokenizer(tgt_language) + else: + tokenizer = None + + # Create the OnlineASRProcessor + online = OnlineASRProcessor(asr,tokenizer,logfile=logfile,buffer_trimming=(args.buffer_trimming, args.buffer_trimming_sec)) + + return asr, online ## main: if __name__ == "__main__": @@ -605,22 +620,8 @@ if __name__ == "__main__": duration = len(load_audio(audio_path))/SAMPLING_RATE print("Audio duration is: %2.2f seconds" % duration, file=logfile) - asr = asr_factory(args, logfile=logfile) - language = args.lan - if args.task == "translate": - asr.set_translate_task() - tgt_language = "en" # Whisper translates into English - else: - tgt_language = language # Whisper transcribes in this language - - + asr, online = asr_factory(args, logfile=logfile) min_chunk = args.min_chunk_size - if args.buffer_trimming == "sentence": - tokenizer = create_tokenizer(tgt_language) - else: - tokenizer = None - online = OnlineASRProcessor(asr,tokenizer,logfile=logfile,buffer_trimming=(args.buffer_trimming, args.buffer_trimming_sec)) - # load the audio into the LRU cache before we start the timer a = load_audio_chunk(audio_path,0,1) diff --git a/whisper_online_server.py b/whisper_online_server.py index 7f81caa..188038a 100644 --- a/whisper_online_server.py +++ b/whisper_online_server.py @@ -23,24 +23,9 @@ SAMPLING_RATE = 16000 size = args.model language = args.lan - -asr = asr_factory(args) -if args.task == "translate": - asr.set_translate_task() - tgt_language = "en" -else: - tgt_language = language - +asr, online = asr_factory(args) min_chunk = args.min_chunk_size -if args.buffer_trimming == "sentence": - tokenizer = create_tokenizer(tgt_language) -else: - tokenizer = None -online = OnlineASRProcessor(asr,tokenizer,buffer_trimming=(args.buffer_trimming, args.buffer_trimming_sec)) - - - demo_audio_path = "cs-maji-2.16k.wav" if os.path.exists(demo_audio_path): # load the audio into the LRU cache before we start the timer From 70bc57180c172f1829eaccff81e3d90132282cc4 Mon Sep 17 00:00:00 2001 From: Alex Young Date: Sun, 14 Apr 2024 19:29:46 +0100 Subject: [PATCH 2/5] Add a --warmup-file option to pass in a path --- whisper_online_server.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/whisper_online_server.py b/whisper_online_server.py index b2f5120..9a4cc0b 100644 --- a/whisper_online_server.py +++ b/whisper_online_server.py @@ -10,6 +10,8 @@ parser = argparse.ArgumentParser() parser.add_argument("--host", type=str, default='localhost') parser.add_argument("--port", type=int, default=43007) +parser.add_argument("--warmup-file", type=str, dest="warmup_file") + # options from whisper_online add_shared_args(parser) @@ -61,10 +63,9 @@ online = OnlineASRProcessor(asr,tokenizer,buffer_trimming=(args.buffer_trimming, -demo_audio_path = "cs-maji-2.16k.wav" -if os.path.exists(demo_audio_path): +if os.path.exists(args.warmup_file): # load the audio into the LRU cache before we start the timer - a = load_audio_chunk(demo_audio_path,0,1) + a = load_audio_chunk(args.warmup_file,0,1) # TODO: it should be tested whether it's meaningful # warm up the ASR, because the very first transcribe takes much more time than the other From fc4b3cd5188664e1ca64475594909b8820762448 Mon Sep 17 00:00:00 2001 From: Alex Young Date: Sun, 14 Apr 2024 19:38:41 +0100 Subject: [PATCH 3/5] Check whether we are passed a warmup file before trying to see if it exists --- whisper_online_server.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/whisper_online_server.py b/whisper_online_server.py index 9a4cc0b..fdd6a46 100644 --- a/whisper_online_server.py +++ b/whisper_online_server.py @@ -63,7 +63,7 @@ online = OnlineASRProcessor(asr,tokenizer,buffer_trimming=(args.buffer_trimming, -if os.path.exists(args.warmup_file): +if args.warmup_file and os.path.exists(args.warmup_file): # load the audio into the LRU cache before we start the timer a = load_audio_chunk(args.warmup_file,0,1) From e0f5d42b134988996f668ad2ac1b30fb6d5d6420 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dominik=20Mach=C3=A1=C4=8Dek?= Date: Wed, 17 Apr 2024 14:49:12 +0200 Subject: [PATCH 4/5] better documentation, help message and logging prints --- README.md | 2 +- whisper_online.py | 2 +- whisper_online_server.py | 27 +++++++++++++-------------- 3 files changed, 15 insertions(+), 16 deletions(-) diff --git a/README.md b/README.md index 707e58d..e3a7a27 100644 --- a/README.md +++ b/README.md @@ -183,7 +183,7 @@ online.init() # refresh if you're going to re-use the object for the next audio ### Server -- real-time from mic -`whisper_online_server.py` has the same model options as `whisper_online.py`, plus `--host` and `--port` of the TCP connection. See help message (`-h` option). +`whisper_online_server.py` has the same model options as `whisper_online.py`, plus `--host` and `--port` of the TCP connection and the `--warmup-file`. See the help message (`-h` option). Client example: diff --git a/whisper_online.py b/whisper_online.py index a00547e..c872b23 100644 --- a/whisper_online.py +++ b/whisper_online.py @@ -625,7 +625,7 @@ if __name__ == "__main__": # load the audio into the LRU cache before we start the timer a = load_audio_chunk(audio_path,0,1) - # warm up the ASR, because the very first transcribe takes much more time than the other + # warm up the ASR because the very first transcribe takes much more time than the other asr.transcribe(a) beg = args.start_at diff --git a/whisper_online_server.py b/whisper_online_server.py index e7ad3f2..263ab75 100644 --- a/whisper_online_server.py +++ b/whisper_online_server.py @@ -10,8 +10,8 @@ parser = argparse.ArgumentParser() # server options parser.add_argument("--host", type=str, default='localhost') parser.add_argument("--port", type=int, default=43007) - -parser.add_argument("--warmup-file", type=str, dest="warmup_file") +parser.add_argument("--warmup-file", type=str, dest="warmup_file", + help="The path to a speech audio wav file to warm up Whisper so that the very first chunk processing is fast. It can be e.g. https://github.com/ggerganov/whisper.cpp/raw/master/samples/jfk.wav .") # options from whisper_online @@ -41,19 +41,18 @@ else: tokenizer = None online = OnlineASRProcessor(asr,tokenizer,buffer_trimming=(args.buffer_trimming, args.buffer_trimming_sec)) - - -if args.warmup_file and os.path.exists(args.warmup_file): - # load the audio into the LRU cache before we start the timer - a = load_audio_chunk(args.warmup_file,0,1) - - # TODO: it should be tested whether it's meaningful - # warm up the ASR, because the very first transcribe takes much more time than the other - asr.transcribe(a) +# warm up the ASR because the very first transcribe takes more time than the others. +# Test results in https://github.com/ufal/whisper_streaming/pull/81 +msg = "Whisper is not warmed up. The first chunk processing may take longer." +if args.warmup_file: + if os.path.isfile(args.warmup_file): + a = load_audio_chunk(args.warmup_file,0,1) + asr.transcribe(a) + print("INFO: Whisper is warmed up.",file=sys.stderr) + else: + print("WARNING: The warm up file is not available. "+msg,file=sys.stderr) else: - print("Whisper is not warmed up",file=sys.stderr) - - + print("WARNING: " + msg, file=sys.stderr) ######### Server objects From dcddb17de832510562e84f92d29a1d9402c1acfb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dominik=20Mach=C3=A1=C4=8Dek?= Date: Wed, 17 Apr 2024 15:25:19 +0200 Subject: [PATCH 5/5] UEDIN ack in line_packet.py --- line_packet.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/line_packet.py b/line_packet.py index 364ade2..e73845a 100644 --- a/line_packet.py +++ b/line_packet.py @@ -2,8 +2,6 @@ """Functions for sending and receiving individual lines of text over a socket. -Used by marian-server-server.py to communicate with the Marian worker. - A line is transmitted using one or more fixed-size packets of UTF-8 bytes containing: @@ -11,6 +9,7 @@ containing: - Zero or more \0 bytes as required to pad the packet to PACKET_SIZE +Originally from the UEDIN team of the ELITR project. """ PACKET_SIZE = 65536