Последнее время участились случаи супер-пупер-важных бесконечных голосовых созвонов - открытых и публичных стримов, из-за которых ну просто невозможно сосредоточиться на сложной интеллектуальной работе. Слушаешь час разговора, из которых 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

Мой код на GitHub

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

Комментарии (7)


  1. martyncev
    19.11.2023 16:18
    +8

    Может просто надо начать совещания строго по делу проводить, а не вот это вот все с растеканием по древу на час?


    1. evia Автор
      19.11.2023 16:18
      +1

      это в идеале, конечно же!


    1. saege5b
      19.11.2023 16:18
      +1

      Подобные совещания очень хорошо размазывают ответственность.


      1. martyncev
        19.11.2023 16:18
        +1

        Ну и все это ведет к тому, от чего так уходили - никто не хочет брать на себя ответственность, а следовательно всякие разумные инициативы которые могли бы предложить свежие умы будут или блокироваться или их принятие/не принятие будет размазано во времени. Ибо "абы чего не случилось", но т.к. у нас 21 век сказать "иди к черту и не выделывайся" - нельзя, зато можно "ваше мнение очень важно для вас" и мусолить месяцами потенциально полезную "рацуху", а потом закопать ее в рутине.

        Простите за сумбур - для меня это, как для руководителя, очень больная тема. Нежелание брать ответственность, проявлять здоровую инициативу - это бич. Сколько людям не плати, каких плюшек не давай(


  1. ilnurjick
    19.11.2023 16:18

    В итоге аудиозапись совещания прогоняли через ИИ?)


    1. evia Автор
      19.11.2023 16:18

      NDA не нарушали)))))) только открытые и публичные встречи, конечно же, поправлю, чтобы читалось и понималось нормально


  1. Airtrain
    19.11.2023 16:18

    Отправить текст совещания сначала негрософтам, а потом опенаи.... double penetration от безопасников неизбежно.