From bc6de735d85d49500d7ec1bddad9192401c40b0c Mon Sep 17 00:00:00 2001 From: dimitrievgs Date: Wed, 29 Apr 2026 23:55:33 +0300 Subject: [PATCH] basic transcribe for vosk --- ...transcribe.py => run-transcribe-parsing.py | 0 run-transcribe-vosk.py | 68 +++++++++++++++++++ 2 files changed, 68 insertions(+) rename run-transcribe.py => run-transcribe-parsing.py (100%) create mode 100644 run-transcribe-vosk.py diff --git a/run-transcribe.py b/run-transcribe-parsing.py similarity index 100% rename from run-transcribe.py rename to run-transcribe-parsing.py diff --git a/run-transcribe-vosk.py b/run-transcribe-vosk.py new file mode 100644 index 0000000..050deb8 --- /dev/null +++ b/run-transcribe-vosk.py @@ -0,0 +1,68 @@ +import sounddevice as sd +from vosk import Model, KaldiRecognizer +import json +import sys +import numpy as np + +# 1. Настройки +MODEL_PATH = r"D:\Work\Software_Development\Projects\vosk\vosk-model-small-ru-0.22" +# Попробуйте 48000, если снова будет ошибка -9997 +SAMPLERATE = 48000 + +model = Model(MODEL_PATH) + +# 2. Поиск ID (Potato использует имена B1 и B2) +def find_devices(): + id_gm = None # VoiceMeeter B1 + id_pcs = None # VoiceMeeter B2 + for i, d in enumerate(sd.query_devices()): + if "Voicemeeter Out B1" in d['name']: id_gm = i + if "Voicemeeter Out B2" in d['name']: id_pcs = i + return id_gm, id_pcs + +id_gm, id_pcs = find_devices() + +if id_gm is None or id_pcs is None: + print("Ошибка: Устройства B1 или B2 не найдены!") + sys.exit() + +# 3. Распознаватели +rec_gm = KaldiRecognizer(model, SAMPLERATE) +rec_pcs = KaldiRecognizer(model, SAMPLERATE) + +def create_callback(rec, role): + def callback(indata, frames, time, status): + # Если звук тихий, не мучаем Vosk + if np.max(np.abs(indata)) < 0.001: + return + + if rec.AcceptWaveform(bytes(indata)): + text = json.loads(rec.Result())['text'] + if text: + print(f"[{role}]: {text}") + '''else: + # Частичный результат для динамики + partial = json.loads(rec.PartialResult())['partial'] + if partial: + # Используем \b для удаления "слышит" при финальном результате + sys.stdout.write(f"\r[{role} говорит...]: {partial}".ljust(60)) + sys.stdout.flush()''' + return callback + +# 4. Параллельный запуск +print(f"--- ЗАПУСК ТРАНСКРИБАЦИИ TTRPG ---") +print(f"GM (Микрофон B1) ID: {id_gm}") +print(f"PCs (Система B2) ID: {id_pcs}") + +try: + with sd.RawInputStream(samplerate=SAMPLERATE, blocksize=8000, device=id_gm, + dtype='int16', channels=1, callback=create_callback(rec_gm, "GM")), \ + sd.RawInputStream(samplerate=SAMPLERATE, blocksize=8000, device=id_pcs, + dtype='int16', channels=1, callback=create_callback(rec_pcs, "PCs")): + + print("\nСистема готова. GM может начинать сессию, PCs могут перебивать.") + while True: + sd.sleep(1000) + +except Exception as e: + print(f"\nОшибка: {e}")