Created
December 16, 2024 21:14
-
-
Save localzet/476638bb85c8453032bb24825ebb6a5a to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
""" | |
Для работы с аудиофайлами рекомендую использовать ffmpeg | |
Скачать его для Windows: https://www.gyan.dev/ffmpeg/builds/ffmpeg-git-full.7z | |
После скачивания распаковать в любую папу и записать путь до неё в переменную ffmpeg_path | |
Для использования распознавания текста используем vosk | |
Установка: pip install vosk | |
""" | |
import os # Для работы с файловой системой | |
import sys # Для получения аргументов | |
import subprocess # Для выполнения команд | |
import json # Для рработы с json | |
from vosk import KaldiRecognizer, Model # оффлайн-распознавание от Vosk | |
# Путь до папки ffmpeg (в этой папке должен лежать файл ffmpeg.exe) | |
ffmpeg_path = "путь до папки ffmpeg" | |
# Путь до модели vosk | |
model_path = "путь до папки модели" | |
try: | |
""" | |
FFMPEG | |
""" | |
if not os.path.exists(ffmpeg_path + "/ffmpeg"): | |
# Если папка ffmpeg не существует | |
print("err: Не найден ffmpeg") | |
exit(1) | |
else: | |
# Добавляем к пути название файла (без .exe) | |
ffmpeg_path = ffmpeg_path + "/ffmpeg" | |
""" | |
VOSK | |
""" | |
if not os.path.exists(model_path): | |
# Если папка модели не существует | |
print("err: Не найдена модель vosk") | |
exit(1) | |
else: | |
# Загрузим в vosk языковую модель | |
model = Model(model_path) | |
""" | |
Голосовое сообщение | |
""" | |
if not sys.argv[1] or not os.path.exists(sys.argv[1]): | |
# Если аудиофайл не существует | |
print("err: Не найден аудиофайл") | |
exit(1) | |
else: | |
# Путь до аудиофайла из аргумента | |
voice_file = sys.argv[1] | |
# Конвертация аудио в wav и результат в process.stdout | |
process = subprocess.Popen( | |
[ | |
ffmpeg_path, # Путь до программы ffmpeg | |
"-loglevel", "quiet", # "Тихий" режим для логов | |
"-i", voice_file, # Имя входного файла | |
"-ar", "16000", # Частота выборки | |
"-ac", "1", # Кол-во каналов | |
"-f", "s16le", # Кодек для перекодирования, у нас wav | |
"-" # Имя выходного файла нет, т.к. читаем из stdout | |
], | |
stdout=subprocess.PIPE | |
) | |
# Используя модель создаём распознаватель | |
offline_recognizer = KaldiRecognizer(model, 16000) | |
offline_recognizer.SetWords(True) | |
# Чтение данных частями и распознование | |
while True: | |
data = process.stdout.read(4000) | |
if len(data) == 0: | |
break | |
if offline_recognizer.AcceptWaveform(data): | |
pass | |
# Возвращаем распознанный текст в виде str | |
result_json = offline_recognizer.FinalResult() # это json в виде str | |
result_dict = json.loads(result_json) # это dict | |
print("suc: " + result_dict["text"]) | |
except: | |
print("err: Неизвестная ошибка") |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment