停止処理を5秒たったら終了させる
import numpy as np import sounddevice as sd import os import configparser import errno class Recorderconfig: def __init__(self, config_ini_path='./configs/config.ini'): # iniファイルの読み込み self.config_ini = configparser.ConfigParser() # 指定したiniファイルが存在しない場合、エラー発生 if not os.path.exists(config_ini_path): raise FileNotFoundError(errno.ENOENT, os.strerror(errno.ENOENT), config_ini_path) self.config_ini.read(config_ini_path, encoding='utf-8') Recorder_items = self.config_ini.items('Recorder') self.Recorder_config_dict = dict(Recorder_items) class Recorder: def __init__(self, config_ini_path='./configs/config.ini'): Recorder_config = Recorderconfig(config_ini_path=config_ini_path) config_dict = Recorder_config.Recorder_config_dict self.fs = int(config_dict["fs"]) self.silence_threshold = float(config_dict["silence_threshold"]) self.min_duration = float(config_dict["min_duration"]) self.amplitude_threshold = float(config_dict["amplitude_threshold"]) self.start_threshold = float(config_dict["start_threshold"]) def speech2audio(self): record_Flag = False non_recorded_data = [] recorded_audio = [] silent_time = 0 input_time = 0 start_threshold = 0.3 all_time = 0 with sd.InputStream(samplerate=self.fs, channels=1) as stream: while True: data, overflowed = stream.read(int(self.fs * self.min_duration)) all_time += 1 if all_time == 10: print("stand by ready OK") elif all_time >= 10: if np.max(np.abs(data)) > self.amplitude_threshold and not record_Flag: input_time += self.min_duration if input_time >= start_threshold: record_Flag = True print("recording...") recorded_audio = non_recorded_data[int(-1*start_threshold*10)-2:] else: input_time = 0 if overflowed: print("Overflow occurred. Some samples might have been lost.") if record_Flag: recorded_audio.append(data) else: non_recorded_data.append(data) # 無音が10秒以上続いたらループを抜ける if np.all(np.abs(data) < self.amplitude_threshold): silent_time += self.min_duration if silent_time >= 10: # 無音が10秒続いたらNoneを返す print("finished") record_Flag = False return None else: silent_time = 0 # 録音データが存在しない場合はNoneを返す if len(recorded_audio) == 0: return None audio_data = np.concatenate(recorded_audio, axis=0) return audio_data
として
from module.module_whisper import FasterWhisperModel from module.module_recorder import Recorder def main(): recorder = Recorder() # Recorderのインスタンス作成 fasterWhispermodel = FasterWhisperModel() # FasterWhisperModelのインスタンス作成 while True: audio_data = recorder.speech2audio() # 音声の取得 if audio_data is None: print("5秒以上の無音状態が続いたため、ループを終了します。") break # 無音5秒以上でループを抜ける text = fasterWhispermodel.audio2text(audio_data) # 音声をテキストに変換 print(text) # テキストを表示 if __name__ == "__main__": main()
としたが
[2024-09-05 06:19:29.705] [ctranslate2] [thread 17518403] [warning] The compute type inferred from the saved model is float16, but the target device or backend do not support efficient float16 computation. The model weights have been automatically converted to use the float32 compute type instead. stand by ready OK recording... finished 5秒以上の無音状態が続いたため、ループを終了します。
となるが今度は入力ができなくなった
単純に
import sounddevice as sd from module.module_whisper import FasterWhisperModel from module.module_recorder import Recorder import time def main(): recorder = Recorder() fasterWhispermodel = FasterWhisperModel() while True: start_time = time.time() # 処理開始時刻を記録 audio_data = recorder.speech2audio() # 処理が10秒間行われなかった場合はループを抜ける if time.time() - start_time >= 5: print("10秒間音声が入力されなかったため、ループを終了します。") break if audio_data is None: print("5秒以上の無音状態が続いたため、ループを終了します。") break # 無音5秒以上でループを抜ける text = fasterWhispermodel.audio2text(audio_data) print(text) if __name__ == "__main__": main()
としたら停止するが実際には10秒以上かかっている
これを五秒程度にしたらうまく動く
次は line notify でこの文章を送信してみる