От звука к смыслу: распознавание речи в видеоконтенте

04d284414679701a56924b9692c0caee.jpg

Распознавание речи из видео — это одна из ключевых задач в области обработки естественного языка, которая находит свое широкое применение в различных сферах, начиная от развлекательной индустрии и заканчивая научными приложениями.

Технология распознавания речи широко используется в области здравоохранения, применяется для создания голосовых ассистентов, системы умного дома, автоматического создания субтитров, искусственного интеллекта и чат-ботов. С развитием технологий глубокого обучения и искусственного интеллекта стали доступны новые методы и подходы к распознаванию речи из видео, что существенно улучшает точность и эффективность этого процесса.

В данной статье мы рассмотрим проект по распознаванию речи из видео, преимущества и недостатки данной разработки, а также посмотрим на то, как ее внедрение помогло ускорить работу аналитиков и разработчиков на проекте.

Для чего нужен инструмент распознавания речи из видео?

  • Улучшение пользовательского опыта — для эффективного и удобного взаимодействия с контентом;

  • Автоматизация процессов: позволяет автоматизировать процессы транскрибирования и анализа видео-контента. Это может быть полезно для составления протоколов рабочих встреч, так как существенно сокращает время получения и обработки информации по сравнению с полным просмотром видео;

  • Поиск и анализ нужной информации в видеоматериалах. Благодаря тому, что добавлены в расшифрованную речь тайминги — с какого по какой период была распознана речь — это облегчает извлечение ценной информации.

На рынке уже есть готовые решения для распознавания речи из видео, но они платные: например, сервисы Писец, VEED, Yandex SpeechKit. В каждом из них присутствует бесплатная версия, но есть ограничения по длительности видео, его качеству и размеру файлов. Помимо этого, пользователь отправляет видео на сторонний сервис, что небезопасно с точки зрения конфиденциальности данных. Из-за специфики компании и политики безопасности было решено разрабатывать локальный проект, которому не нужен доступ в интернет.

На проекте, который мы рассмотрим в статье, было огромное количество материалов онбординга и записанных встреч — все это необходимо было просмотреть. Продолжительность многих видео более двух часов. Стоит также добавить, что некоторые встречи с заказчиками или встречи с другими отделами записывались для того, чтобы не забыть, о чем была встреча, так как она длятся в среднем более 40 минут.

Стек технологий проекта по распознаванию речи из видео

Для разработки проекта был выбран Python. Данный язык имеет богатую коллекцию различных библиотек с аудио и видео файлами.

В проекте используются библиотеки Python:

  • moviepy — работает с видео файлами и необходима для извлечения аудиодорожки;

  • pydub — для обрезки аудиодорожки на аудио фрагменты;

  • whisper — предобученная модель от OpenAI для распознавания речи из видео и аудиофайлов.

Нужно отметить, что whisper может самостоятельно распознавать видео и аудиофайлы, а также делить аудиодорожку на фрагменты, но на это затрачивается большое количество времени и ресурсов. Для «облегчения» проекта было принято решение «подставлять» в whisper готовые фрагменты. В результате удалось ускорить работу на 20%.

ПОЧЕМУ БЫЛ ВЫБРАН WHISPER?

Whisper предлагает очень простой и интуитивно понятный API, который позволяет легко и быстро реализовывать распознавание речи в своем коде. Поэтому даже новички в программировании могут с легкостью освоить библиотеку и начать использовать ее для своих проектов. Благодаря открытому коду вы можете свободно модифицировать и расширять функционал библиотеки под свои нужды, а также внести свой вклад в развитие сообщества и улучшение качества программного обеспечения. Whisper может работать без доступа к интернету, что позволяет не беспокоиться о конфиденциальности и безопасности данных.

Принцип работы проекта по распознаванию речи из видео

Блок-схема работа с проектом по распознаванию речи из видео

Блок-схема работа с проектом по распознаванию речи из видео

Блок-схема работа проекта по распознаванию речи из видео

Блок-схема работа проекта по распознаванию речи из видео

Для удобства использования и анализа были добавлены тайминги в распознанную речь для того, чтобы пользователь мог при необходимости прослушать фрагмент.

Работа проекта

Работа проекта

Проверка работы проекта по распознаванию речи из видео

Проект проверялся на записях встреч. Результат оказался положительным, распознанная речь приближена к оригинальному видео. Здесь мы демонстрируем результаты распознанной речи, по которым можно убедиться в том, что вместе с русской речью распознаются еще и английские слова, но стоит сказать, что не всегда правильно.

Пример распознанной речи из записи встреч

Пример распознанной речи из записи встреч

Недостатки проекта по распознаванию речи из видео

Как и у всех продуктов проект по распознаванию речи из видео имеет недостатки:

  • Медленное распознавание речи. Это связано с тем, что для работы необходимы ресурсы для ускорения (например, видео длительностью 1 час будет распознаваться около 30 минут);

  • При нечеткой речи диктора распознавание может отличаться;

  • Заедание слов. Если диктор часто делает длительные паузы, то может продублировать последнее слово;

  • Невозможность whisper использовать аудио фрагменты, которые хранятся в памяти, а не файлом. Из-за этого аудио файлы сохраняются локально и потом используются.

Неправильно распознанное слово deposit rate из-за нечеткой дикции

Неправильно распознанное слово deposit rate из-за нечеткой дикции

Заедание слова из-за долгой паузы диктора

Заедание слова из-за долгой паузы диктора

Вывод

Рассмотренный в статье кейс по распознаванию речи из видео продемонстрировал, как внедрение данной технологии позволило команде упростить работу на проекте за счет эффективного анализа встреч и конференций, а бизнесу — ускорить процесс принятия решений.

Инструкция по установке проекта: https://github.com/OnvoKoder/SpeechRecognitionFromVideo

Пример кода проекта

import whisper
import moviepy.editor as mp
from pydub import AudioSegment
import os
from datetime import datetime

def extract_audio(video_path:str) -> str:
    video = mp.VideoFileClip(video_path)
    audio_path = video_path.replace('.mp4', '.wav')
    video.audio.write_audiofile(audio_path)
    return audio_path

def split_audio(audio_path:str, interval:int) -> list[str]:
    audio = AudioSegment.from_file(audio_path)
    chunk:AudioSegment
    chunks_name:str = ''
    history = []
    for i in range(0, len(audio), interval):
        chunks_name = f'chunk{i}.wav'
        chunk = audio[i : i + interval]
        chunk.export(chunks_name, format = 'wav')
        history.append(chunks_name)
    return history

def extract_text(chunk:str, language:str) -> str:
    model = whisper.load_model('small')
    print(f'[{datetime.now()}] {chunk} start recognition')
    audio_text = model.transcribe(chunk, language = language[0:2])
    print(f'[{datetime.now()}] {chunk} complete recognition')
    os.remove(chunk)
    return audio_text['text']

def upload_video(video_path:str, interval:int, language:str) -> str:
    audio_path:str = extract_audio(video_path)
    chunks:list[str] = split_audio(audio_path, interval)
    result = []
    for chunk in chunks:
        result.append(extract_text(chunk, language))
    tmp:str = '' 
    for index in range(0, len(result)):
        tmp += f'\ntime:{index} - {index + 1} minutes\n'
        tmp += result[index] 
    return tmp

current_dir = os.getcwd()
for filename in os.listdir(current_dir):
    if filename.endswith('.mp4') and filename.startswith('recognition!') == False:
        print(f'[{datetime.now()}] {filename} start recognition')
        text =  from_video(filename, 60000)
        file = open(filename.replace('.mp4', '.txt'), 'w')
        file.write(text)
        file.close()
        os.rename(filename,f'recognition!{filename}')
        print(f'[{datetime.now()}] {filename} finish recognition')

© Habrahabr.ru