Прошла важная онлайн-встреча, задачи распределены, идеи обсуждены, а кто что сказал — уже и не помню. Кажется, что чтобы ничего не упустить, нужен отдельный человек, который записывает все за всеми и делает отчеты. Хороший вариант — обернуть это в скрипт, что мы с вами и сделаем.
В этом туториале я покажу, как создать приложение для автоматического анализа встреч и составления отчетов с использованием API BotHub (Whisper-1 + Claude 3.5 Sonnet). Это приложение будет распознавать речь с аудиозаписей, выделять ключи — кто что сказал и какие задачи в целом обсудили — и составит отчет, включая формат ПДФ.
Приятного прочтения (:
Установка зависимостей и настройка проекта
Прежде чем начать, убедимся, что у нас установлены все нужные компоненты, такие как Python и библиотеки для работы с API и аудиофайлами. Мы установим следующие библиотеки:
os
иpathlib.Path
: для работы с переменными окружения и файловыми путями;dotenv
: для загрузки конфиденциальных данных из.env
файла;fpdf
: для генерации PDF-файлов;openai
: для работы с API BotHub.
pip install openai python-dotenv fpdf openai
Также нам понадобится logging
для логирования процесса выполнения программы. Логирование поможет нам отслеживать процесс выполнения программы, а также фиксировать любые ошибки или важные сообщения. Мы настроим базовое логирование на уровне INFO
.
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(name)
Чтобы взаимодействовать с BotHub API, необходимо сначала зарегистрироваться на платформе BotHub и получить API-ключ. Этот ключ служит для аутентификации запросов, которые мы будем отправлять.
После получения ключа для обеспечения безопасности хранения, мы создаем файл .env
в корневой папке нашего проекта и помещаем туда API-ключ, который мы сгенерировали.
BOTHUB_API_KEY=наш_ключ
Далее, используя библиотеку dotenv
, с помощью load_dotenv()
загружаем данные из .env
, чтобы сделать их доступными для нашего кода.
load_dotenv()
Для работы с API BotHub создаем экземпляр OpenAI
, в который передаем api_key
и base_url
для сервиса BotHub. API-ключ подгружается из окружения, используя os.getenv('BOTHUB_API_KEY')
client = OpenAI(
api_key=os.getenv('BOTHUB_API_KEY'),
base_url='https://bothub.chat/api/v2/openai/v1'
)
Основная функция для обработки аудио
На этом этапе мы создаем функцию, которая выполняет транскрипцию аудиофайла в текст. Используем BotHub API и Whisper-1 для распознавания речи. Открываем аудиофайл в режиме rb
(чтение в бинарном режиме), затем используем метод client.audio.transcriptions.create
для отправки аудиофайла на сервер для обработки. В ответ мы получаем текстовую транскрипцию. Если транскрипция проходит успешно, выводится сообщение Транскрипция завершена, и текст возвращается для дальнейшей обработки. В случае ошибки логируем сообщение об ошибке.
def transcribe_audio(audio_file_path):
try:
with open(audio_file_path, "rb") as audio_file:
transcript = client.audio.transcriptions.create(
model="whisper-1",
file=audio_file
)
logger.info("Транскрипция завершена.")
return transcript.text
except Exception as e:
logger.error(f"Ошибка при транскрипции аудио: {e}")
return None
Извлечение ключевых моментов
После транскрипции у нас есть текст нашей встречи. Теперь наша цель — выделить ключевые моменты, такие как обсуждаемые задачи, принятые решения и проблемы. С помощью client.chat.completions.create
создаем запрос на выделение ключевых моментов, указывая модель, текст встречи, и запрос в формате messages
, где описано, что необходимо выделить основные задачи и проблемы. Функция возвращает список ключевых моментов в случае успешного выполнения.
def extract_key_points(meeting_text):
try:
response = client.chat.completions.create(
model="claude-3.5-sonnet",
messages=[
{
"role": "user",
"content": f"Проанализируй текст встречи и выдели ключевые моменты, такие как задачи, решения и обсуждаемые проблемы:\n\n{meeting_text}"
}
]
)
logger.info("Извлечение ключевых моментов завершено.")
return response.choices[0].message.content
except Exception as e:
logger.error(f"Ошибка при извлечении ключевых моментов: {e}")
return None
Тональность
Мы также можем проанализирвоать тональность текста встречи, также, как и в extract_key_points
, используется client.chat.completions.create
, где мы запрашиваем анализ тональности переданного текста. Функция возвращает результат тонального анализа или сообщение об ошибке.
def analyze_sentiment(meeting_text):
try:
response = client.chat.completions.create(
model="claude-3.5-sonnet",
messages=[
{
"role": "user",
"content": f"Проанализируй тональность текста:\n\n{meeting_text}"
}
]
)
logger.info("Анализ тональности завершен.")
return response.choices[0].message.content
except Exception as e:
logger.error(f"Ошибка при анализе тональности: {e}")
return None
Генерация отчета
ККогда ключевые моменты выделены и проведен анализ тональности, нам нужно собрать из них отчет. Этот отчет должен быть логичным, последовательным и кратким. Используется client.chat.completions.create
, куда передаем запрос с перечисленными ключевыми моментами и анализом тональности, чтобы API сгенерировало готовый текст отчета. В случае успешного завершения функция возвращает текст отчета.
def generate_report(key_points, sentiment):
try:
content = f"Составь отчет по встрече с учетом следующих ключевых моментов и анализа тональности:\n\nКлючевые моменты:\n{key_points}\n\nТональность:\n{sentiment}"
report = client.chat.completions.create(
model="claude-3.5-sonnet",
messages=[
{
"role": "user",
"content": content
}
]
)
logger.info("Генерация отчета завершена.")
return report.choices[0].message.content
except Exception as e:
logger.error(f"Ошибка при генерации отчета: {e}")
return None
Чтобы отчет было удобно хранить и пересылать, сохраняем его в формате PDF. Для создания PDF используется библиотека FPDF
. Мы добавляем страницу, устанавливаем автоматический перенос текста по строкам (multi_cell
). Добавляем шрифт, который поддерживает кириллицу, если это необходимо (в примере используется DejaVu Sans), и устанавливаем размер шрифта для основного текста. После создания страницы и заполнения ее текстом сохраняем отчет с помощью output(file_path)
.
def save_report_as_pdf(report_text, file_path="meeting_report.pdf"):
pdf = FPDF()
pdf.add_page()
pdf.set_auto_page_break(auto=True, margin=15)
pdf.add_font("DejaVu", "", "путь/к/DejaVuSans.ttf", uni=True)
pdf.set_font("DejaVu", size=12)
pdf.multi_cell(0, 10, report_text)
pdf.output(file_path)
logger.info(f"Отчет сохранен как {file_path}")
Основная функция
Эта функция объединяет все предыдущие шаги. В начале выполняется транскрипция аудио: если она завершилась неудачно, выводится сообщение об ошибке, и функция завершает выполнение. Затем запускается функция для выделения ключевых моментов. При возникновении ошибки она также возвращает соответствующее сообщение. Аналогично выполняется анализ тональности и, в случае успеха, генерация текста отчета. Если все шаги успешно завершены, вызывается save_report_as_pdf
для сохранения отчета в формате PDF. В конце функция возвращает текст отчета.
def analyze_meeting(audio_file_path):
meeting_text = transcribe_audio(audio_file_path)
if not meeting_text:
return "Ошибка при транскрипции аудио."
key_points = extract_key_points(meeting_text)
if not key_points:
return "Ошибка при извлечении ключевых моментов."
sentiment = analyze_sentiment(meeting_text)
if not sentiment:
return "Ошибка при анализе тональности текста."
report_text = generate_report(key_points)
if not report_text:
return "Ошибка при генерации отчета."
save_report_as_pdf(report_text)
return report_text
Итого, вместе с вами мы сделали небольшое приложение, которое способно сделать ваши дни более продуктивными и помочь управлять своим временем более эффективно. Мы реализовали с вами порядок основных функций, а именно транскрипцию аудио, выделение ключевых моментов, составление отчета и его сохранение в формате PDF. Такой инструмент позволит не терять важные идеи и задачи, экономя время и усилия.
Спасибо за прочтение(:
Комментарии (5)
abcdsash
09.11.2024 17:14вообще обычно ведется протокол встречи, который потом всем участникам рассылается.
ну или даже просто запись встречи.
Dynasaur
То есть всё содержание ваших корпоративных встреч будет утекать в БотХаб и там ещё и расшифровываться? Не знаю что написано в вашем NDA, в приличных компаниях за такое десять лет расстрела.
ENick
или десять лет без права переписки, по эл почте
d-sh
В большинстве компаний пароль от почты на мониторе пришпилен и вайфай закрыт паролем типа 8888888...
Но какую задачу решает ботхаб не понятно. У юзеров есть запрос на конвертацию своих рублей в реальных деньги для оплаты сервисов типа чатгпт или опенроутера а ботхаб им вместо этого свою кривую гпт прокси сует. Зачем?
omgiafs
А через BotHub оно будет утекать ко владельцам LLM, ведь BotHub по сути - просто прокси-сервер до эндпоинтов данных LLM.