Загрузка данных


import tkinter as tk
from tkinter import messagebox, scrolledtext
import sounddevice as sd
from scipy.io import wavfile
import whisper
import os

FILENAME = "voice_record.wav"
TXT_FILENAME = "result.txt"
FS = 44100

def on_click_start():
    try:
        duration = int(entry_time.get())
        if duration <= 0: raise ValueError
    except ValueError:
        messagebox.showwarning("Внимание", "Введите корректное число секунд!")
        return

    btn_start.config(state=tk.DISABLED)
    lbl_status.config(text=f"Статус: Идет запись ({duration} сек)...")
    root.update()
    
    try:
        # device=None заставляет систему использовать микрофон по умолчанию из Windows
        audio_data = sd.rec(int(duration * FS), samplerate=FS, channels=1, dtype='int16', device=None)
        sd.wait()
        wavfile.write(FILENAME, FS, audio_data)
    except Exception as e:
        messagebox.showerror("Ошибка", f"Ошибка записи: {e}\nПроверьте, подключен ли микрофон!")
        btn_start.config(state=tk.NORMAL)
        return

    lbl_status.config(text="Статус: Расшифровка текста нейросетью...")
    root.update()
    
    try:
        model = whisper.load_model("base")
        # Добавили параметр beam_size для более точного и качественного подбора слов
        result = model.transcribe(FILENAME, language="ru", fp16=False, beam_size=5)
        text_output = result["text"].strip()
        
        with open(TXT_FILENAME, "w", encoding="utf-8") as f:
            f.write(text_output)
            
        if os.path.exists(FILENAME):
            os.remove(FILENAME)
            
        txt_area.delete(1.0, tk.END)
        txt_area.insert(tk.END, text_output)
        lbl_status.config(text=f"Статус: Готово! Сохранено в {TXT_FILENAME}")
        messagebox.showinfo("Успех", f"Текст сохранен в {TXT_FILENAME}!")
    except Exception as e:
        messagebox.showerror("Ошибка", f"Ошибка распознавания: {e}")
        lbl_status.config(text="Статус: Ошибка")
    finally:
        btn_start.config(state=tk.NORMAL)

root = tk.Tk()
root.title("Конвертер речи в текст")
root.geometry("500x450")
root.resizable(False, False)

lbl_time = tk.Label(root, text="Сколько секунд записывать:", font=("Arial", 11))
lbl_time.pack(pady=10)

entry_time = tk.Entry(root, font=("Arial", 11), width=10, justify="center")
entry_time.insert(0, "5")
entry_time.pack()

btn_start = tk.Button(root, text="Начать запись", font=("Arial", 12, "bold"), bg="#4CAF50", fg="white", command=on_click_start, padx=20, pady=5)
btn_start.pack(pady=15)

lbl_status = tk.Label(root, text="Статус: Ожидание", font=("Arial", 10, "italic"), fg="gray")
lbl_status.pack(pady=5)

lbl_result = tk.Label(root, text="Распознанный текст:", font=("Arial", 11, "bold"))
lbl_result.pack(pady=5)

txt_area = scrolledtext.ScrolledText(root, width=55, height=12, font=("Arial", 10))
txt_area.pack(pady=5, padx=10)

root.mainloop()