Skip to content

Instantly share code, notes, and snippets.

@localzet
Created December 16, 2024 21:14
Show Gist options
  • Save localzet/476638bb85c8453032bb24825ebb6a5a to your computer and use it in GitHub Desktop.
Save localzet/476638bb85c8453032bb24825ebb6a5a to your computer and use it in GitHub Desktop.
"""
Для работы с аудиофайлами рекомендую использовать 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