停止処理を5秒たったら録音を終了させる

停止処理を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 でこの文章を送信してみる

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です