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()