Последнее время участились случаи супер-пупер-важных бесконечных голосовых созвонов - открытых и публичных стримов, из-за которых ну просто невозможно сосредоточиться на сложной интеллектуальной работе. Слушаешь час разговора, из которых 5 минут эффективные, а остальное – тоже важная, но не для меня, модераторская работа, дискуссия и выработка какого-то общего заключения. А потом еще сиди конспектируй сказанное и вычленяй важное. А что, если попробовать переложить эти функции на искусственный интеллект?
PS: Прокомментирую, (после публикации встретила абсолютно обоснованные удивления), что NDA не нарушаем, конечно же, только публичные открытые встречи и стримы. Слово "совещания" окрашивает информацию в закрытый формат)))
Часть 1: подготовка к работе
Совещания дело сугубо закрытое, поэтому в качестве примера возьмем доброе видео со всеми любимым Николаем Дроздовым о кошках. Файл как раз типичный для совещаний в зуме: почти 30 минут, весит довольно много даже после сжатия 54 Мб. Да, бывают и многочасовые разговоры, но там по факту ничего не изменится, кроме времени обработки материала.
Писать будем на Python 3.11: стандартно разворачиваем виртуальное окружение, устанавливаем необходимые библиотеки.
Использовать будем библиотеки двух "китов" этой сферы Microsoft (SpeechRecognition) и OpenAI (openai)
from openai import OpenAI
from pydub import AudioSegment
from moviepy.editor import VideoFileClip
import speech_recognition as sr
Подробно про подключение OpenAI написано в руководстве, мне на Windows 11 достаточно было прописать API-ключ в переменных окружения
setx OPENAI_API_KEY "your-api-key-here"
Часть 2: конвертируем видео в текст
Первый вариант перевода речи в текст с помощью модели "whisper-1" от OpenAI, код будет выглядеть так:
def convert_speech_to_text(file_path):
audio_file= open(file_path, "rb")
transcript = client.audio.transcriptions.create(
model="whisper-1",
file=audio_file
)
print(transcript)
with open("text.txt", "w", encoding="utf-8") as file:
file.write(transcript)
Модель может обработать сразу видео в формате "mp4" размером не более 26 Мб. Если больше - надо дробить файл на кусочки.
Второй вариант с использованием SpeechRecognition, где сначала надо из видеофайла вытащить аудиодорожку, затем разбить на кусочки и уже потом постепенно скармливать их в модель перевода из речи в текст.
Конвертируем из видео в аудио формат:
def convert_mp4_to_wav(input_file, output_file):
# Загружаем видеофайл
video_clip = VideoFileClip(input_file)
# Извлекаем аудиодорожку
audio_clip = video_clip.audio
# Сохраняем аудио в формате wav
audio_clip.write_audiofile(output_file, codec='pcm_s16le')
Разбиваем аудио файл на кусочки (chunks) и подаем их на обработку в модель SpeechRecognition, обязательно не забываем указать, что распознается русский язык.
# Функция для распознавания речи в аудиофайле с использованием библиотеки SpeechRecognition
def recognize_audio(audio_file_path, chunk_duration_ms=10000):
# Загрузка аудио файла
audio = AudioSegment.from_wav(audio_file_path)
# Инициализация объекта Recognizer из библиотеки SpeechRecognition
recognizer = sr.Recognizer()
# Пустая строка для хранения распознанного текста
text = ""
# Определение размера куска аудио в миллисекундах
chunk_size = int(chunk_duration_ms)
# Разделение аудио на куски заданного размера
chunks = [audio[i:i + chunk_size] for i in range(0, len(audio), chunk_size)]
# Итерация по каждому куску аудио
for i, chunk in enumerate(chunks):
# Создание временного файла для текущего куска
chunk_path = f"chunk_{i}.wav"
chunk.export(chunk_path, format="wav")
# Использование AudioFile из SpeechRecognition для открытия временного файла
with sr.AudioFile(chunk_path) as source:
# Запись аудио из файла
chunk_audio = recognizer.record(source)
try:
# Попытка распознавания речи с использованием Google Speech Recognition
chunk_text = recognizer.recognize_google(chunk_audio, language="ru-RU")
# Добавление распознанного текста к общему тексту
text += chunk_text + " "
# Вывод распознанного текста для текущего куска
print(chunk_text)
print("")
except sr.UnknownValueError:
# Обработка случая, когда Google Speech Recognition не может распознать аудио
print(f"Google Speech Recognition не смог распознать аудио для куска {i}")
# Возврат общего распознанного текста
return text
Не забываем сохранять общий результат. Из файла в 51 Мб у меня вышло 157 аудио-кусочков. Это можно настраивать через переменную chunk_duration_ms
Файл result.txt
с исходным текстом сохранила в гитхабе. Всего вышло 2661 слово.
Часть 3: из текста
Приступаем к самому интересному, сделаем саммари (как модно нынче говорить) или, другими словами, выделим основные тезисы текста. Использовать будем модель OpenAI gpt-3.5-turbo
С появлением ИИ возникло новое искусство создания промтов - правильных формулировок на естественном языке, которые могут корректно поставить задачу ИИ, именно ту, которую человек хочет решить. Например, в нашем случае, задача может звучать так:
prompt = " напиши важные тезисы из текста "
или так
prompt = " выдели только самые важные тезисы очень кратко "
В запросе к OpenAI API есть особые параметры, которые влияют на генерацию текста:
temperature - контролирует степень разнообразия и случайности ответа. Более высокая температура (например, 0.8) делает ответы более разнообразными, но менее предсказуемыми. Более низкая температура (например, 0.2) делает ответы более фокусированными и предсказуемыми,
stop - может использоваться для указания строки, при достижении которой генерация текста прекращается,
n - указывает количество альтернативных ответов, которые вы хотите получить от модели.
Используем только параметр "температуры". Пусть в первом случае он будет равен 0.5. Аналогично аудио делим текст на кусочки и подаем их в модель
# Функция для генерации краткого содержания текста с использованием OpenAI GPT-3
def generate_summary(text, max_chunk_size=2048):
# Разбивка входного текста на куски с заданным максимальным размером
input_chunks = split_text(text, max_chunk_size)
print("Text split ")
print(len(input_chunks))
# Список для хранения сгенерированных кусков текста
output_chunks = []
# Задание промпта для модели
prompt = "напиши важные тезисы из текста "
# Итерация по каждому куску входного текста
for i, chunk in enumerate(input_chunks):
# Запрос к модели GPT-3 для генерации тезисов на основе текущего куска текста
response = client.chat.completions.create(
model="gpt-3.5-turbo",
messages=[
{"role": "user", "content": prompt + chunk}
],
temperature=0.5
)
# Извлечение сгенерированного ответа от модели
answer = response.choices[0].message.content
# Вывод информации о текущем куске
print(f"chunk {i+1} from {len(input_chunks)}")
print(answer)
# Добавление сгенерированного куска в список
output_chunks.append(answer)
# Объединение сгенерированных кусков в одну строку и возврат результата
return " ".join(output_chunks)
Итого, текст мы разбили на 4 блока. Не забываем сохранить результаты. У нас получилось весьма краткое изложение текста, в гитхабе файл summary.txt
получилось 27 пунктов
Зверь, о котором идет речь, является частью нашей окружающей среды.
Он обладает уникальными адаптивными способностями.
Этот зверь может быть опасным для людей, если его не понимать и не уважать.
Он играет важную роль в экосистеме и взаимодействует с другими животными.
Для сохранения баланса природы, необходимо учиться сосуществовать с этим зверем. - Кошка является одним из самых загадочных и удивительных животных на планете.
Ученые спорят о том, кто приручил кого - мы кошек или они нас.
Кошки и собаки имеют общего предка, который жил примерно 55 миллионов лет назад.
История взаимоотношений семейства кошачьих и людей напоминает остросюжетный детектив.
Некоторые дикие кошки, такие как тигры и львы, представляют опасность для людей.
Домашние кошки остаются опасными хищниками и способны пройти большие расстояния в поисках добычи.
Кошки имеют развитые охотничьи инструменты, такие как лапы, уши и усы, которые помогают им охотиться эффективно.
Кошки могут принести свою добычу своим владельцам в качестве демонстрации своих охотничьих навыков. - Одомашнивание кошек началось около 10 000 лет назад.
Кошка является одним из немногих одиночных животных.
Кошка была приручена для борьбы с грызунами, которые угрожали запасам зерна.
Степная кошка стала хищником, который приближался к жилищу человека.
Наш контакт с кошками произошел на территории плодородного полумесяца.
Кошки были приручены раньше, чем коровы и козы.
Кошки распространились по всей Азии и другим частям мира.
Доказательства свидетельствуют о том, что кошки были приручены в Древнем Египте.
Египтяне почитали кошек и наделили их божественным статусом. - Процесс мумификации кошек в Древнем Египте был идентичен процессу мумификации людей.
Мумифицированные кошки были значимыми и пользовались огромным уважением в египетском обществе.
Кошки были священными животными и символизировали материнство и хищничество.
В разных культурах кошки были почитаемы как спутницы богинь охоты, покровительницы любви, колдуньи и т.д.
Кошки эволюционировали и научились манипулировать людьми, используя свои способы коммуникации.
В разных странах и городах существуют традиции почитания кошек и у них есть особый статус.
Кошки помогали бороться с грызунами и спасали от угрозы голода.
Кошки до сих пор остаются одними из самых популярных домашних животных и оказывают положительное влияние на нашу жизнь.
Или при втором вариант промта с более строгой задачей и другими параметрами температуры (0.1) получилось гораздо меньше - 17 пунктов.
Зверь живет рядом с нами.
Кошка является одним из самых загадочных и удивительных животных на планете.
Ученые спорят о том, кто приручил кого - мы кошку или она нас.
Семейство кошачьих и псовых имеет общего предка, который жил около 55 млн лет назад.
Кошки и собаки - наши друзья и союзники с древних времен.
Кошки имеют развитый охотничий арсенал, включая острые когти, чувствительные уши и волоски на лапах и усах.
Домашние кошки все еще сохраняют свои охотничьи инстинкты и могут пройти значительные расстояния за ночь.
Кошки могут быть опасными для мелкой фауны и способны истребить птиц, мышей и насекомых.
Кошки могут принести свою добычу в дар хозяину, проявляя свой природный инстинкт и уча охотничьим приемам своих котят. - Одомашнивание кошек началось около 10 000 лет назад.
Кошка стала одиночным хищником, который помогал человеку в борьбе с грызунами.
Кошка начала приближаться к жилищам людей и была принята ими как союзник.
Первые контакты между кошками и людьми произошли на территории плодородного полумесяца.
Египтяне особенно уважали кошек и даже наделили их божественным статусом. - Мумификация кошек в Древнем Египте была связана с их священным статусом и значимостью для египетского народа.
Кошки были изображены в облике божеств в Древнем Египте, что подчеркивало их роль в материнстве и защите семьи.
Кошки имели способность изменять свой голос, чтобы коммуницировать с людьми, что сделало их более близкими и понятными для человека.
В разных культурах кошки были почитаемы и связывались с различными богинями, такими как богиня охоты Артемида или богиня Гера.
В разных странах и городах по сей день существуют традиции почитания и уважения к кошкам, например, коты Стамбула или эрмитажные коты в Санкт-Петербурге.
Вместо заключения
На OpenAI очень большое количество разнообразных моделей, для разнообразных целей применения.
Источники
Implementing text summarization using OpenAI’s GPT-3 API.
How to format inputs to ChatGPT models
https://platform.openai.com/docs/overviewOpenAI API
Практический пример использования модели детекции изображений