ASSISTANT
Для выполнения вашего задания по суммаризации видеороликов с Яндекс.Диска и созданию собственного API, предлагаю разбить процесс на три основных подзадачи, как вы и указали. Ниже я предоставлю подробное руководство по каждой из них с примерами кода на языке Python.
## Подзадача 1: Реализовать скрипт для работы с API Яндекс.Диска
### Шаг 1. Получение OAuth-токена
Для взаимодействия с API Яндекс.Диска вам понадобится OAuth-токен. Вы можете получить его следующим образом:
1. Перейдите по [ссылке для получения токена](https://yandex.ru/dev/disk/poligon/).
2. Авторизуйтесь с вашим Яндекс-аккаунтом.
3. Разрешите доступ для приложения.
4. Скопируйте полученный токен.
### Шаг 2. Установка необходимых библиотек
Убедитесь, что у вас установлена библиотека `requests`. Если нет, установите ее:
```bash
pip install requests
```
### Шаг 3. Пример скрипта для взаимодействия с Яндекс.Диском
Ниже приведен пример скрипта, который выполняет основные операции: получение списка файлов, загрузка и скачивание файлов.
```python
import requests
import os
# Ваш OAuth-токен
TOKEN = 'YOUR_YANDEX_DISK_OAUTH_TOKEN'
# Базовый URL API
API_URL = 'https://cloud-api.yandex.net:443/v1/disk/'
headers = {
'Authorization': f'OAuth {TOKEN}',
}
def list_files(path=''):
"""Получить список файлов в указанной папке"""
url = API_URL + 'resources'
params = {'path': path}
response = requests.get(url, headers=headers, params=params)
if response.status_code == 200:
return response.json()['_embedded']['items']
else:
print(f"Ошибка при получении списка файлов: {response.status_code}")
return None
def download_file(file_path, save_path):
"""Скачать файл с Яндекс.Диска"""
url = API_URL + 'resources/download'
params = {'path': file_path}
response = requests.get(url, headers=headers, params=params)
if response.status_code == 200:
download_url = response.json()['href']
download_response = requests.get(download_url)
with open(save_path, 'wb') as f:
f.write(download_response.content)
print(f"Файл скачан и сохранен как {save_path}")
else:
print(f"Ошибка при получении ссылки на скачивание: {response.status_code}")
def upload_file(file_path, ya_disk_path):
"""Загрузить файл на Яндекс.Диск"""
url = API_URL + 'resources/upload'
params = {'path': ya_disk_path, 'overwrite': 'true'}
response = requests.get(url, headers=headers, params=params)
if response.status_code == 200:
upload_url = response.json()['href']
with open(file_path, 'rb') as f:
upload_response = requests.put(upload_url, data=f)
if upload_response.status_code == 201:
print(f"Файл {file_path} успешно загружен на {ya_disk_path}")
else:
print(f"Ошибка при загрузке файла: {upload_response.status_code}")
else:
print(f"Ошибка при получении ссылки на загрузку: {response.status_code}")
if __name__ == "__main__":
# Пример использования функций
files = list_files()
if files:
for file in files:
print(file['name'])
# Скачивание файла
# download_file('path/to/file/on/yadisk.mp4', 'local_file.mp4')
# Загрузка файла
# upload_file('local_file.mp4', 'path/on/yadisk.mp4')
```
### Пояснения
- **list_files**: Получает список файлов в корневой или указанной директории Яндекс.Диска.
- **download_file**: Скачивает файл по указанному пути и сохраняет его локально.
- **upload_file**: Загружает локальный файл на Яндекс.Диск по указанному пути.
## Подзадача 2: Реализовать скрипт для суммаризации текста из видеороликов
Для суммаризации текста из видео нам необходимо выполнить следующие шаги:
1. **Транскрибирование видео**: Преобразование речи из видео в текст.
2. **Суммаризация текста**: Сокращение транскрибированного текста до ключевых моментов.
### Шаг 1. Транскрибирование видео
Для транскрибирования видео вы можете использовать такие сервисы, как **Google Speech-to-Text**, **DeepSpeech**, **Whisper от OpenAI** и другие. В данном примере я покажу использование модели **Whisper** от OpenAI, так как она проста в использовании и поддерживает множество языков, включая русский.
#### Установка Whisper
```bash
pip install -U openai-whisper
pip install torch # Если у вас нет установленного PyTorch
```
#### Пример скрипта для транскрибирования
```python
import whisper
def transcribe_video(video_path, language='ru'):
model = whisper.load_model("base") # Вы можете выбрать другую модель: tiny, base, small, medium, large
result = model.transcribe(video_path, language=language)
return result['text']
if __name__ == "__main__":
video_file = "path/to/video.mp4"
transcription = transcribe_video(video_file)
print("Транскрибированный текст:")
print(transcription)
```
### Шаг 2. Суммаризация текста
Для суммаризации текста можно использовать библиотеку **Transformers** от Hugging Face с предобученной моделью для суммаризации, такой как **T5** или **BART**.
#### Установка необходимых библиотек
```bash
pip install transformers
pip install torch
```
#### Пример скрипта для суммаризации
```python
from transformers import pipeline
def summarize_text(text, max_length=150, min_length=40):
summarizer = pipeline("summarization", model="facebook/bart-large-cnn")
summary = summarizer(text, max_length=max_length, min_length=min_length, do_sample=False)
return summary[0]['summary_text']
if __name__ == "__main__":
transcription = """Вставьте сюда длинный транскрибированный текст из видео."""
summary = summarize_text(transcription)
print("Суммаризация текста:")
print(summary)
```
### Объединение транскрипции и суммаризации
Можно объединить оба шага в один скрипт:
```python
import whisper
from transformers import pipeline
def transcribe_video(video_path, language='ru'):
model = whisper.load_model("base")
result = model.transcribe(video_path, language=language)
return result['text']
def summarize_text(text, max_length=150, min_length=40):
summarizer = pipeline("summarization", model="facebook/bart-large-cnn")
# Для больших текстов необходимо разбивать на части
# Здесь представлен пример для небольших текстов
summary = summarizer(text, max_length=max_length, min_length=min_length, do_sample=False)
return summary[0]['summary_text']
if __name__ == "__main__":
video_file = "path/to/video.mp4"
print("Начало транскрибирования...")
transcription = transcribe_video(video_file)
print("Транскрибирование завершено.")
print("Начало суммаризации...")
summary = summarize_text(transcription)
print("Суммаризация завершена.")
print("Итоговая сводка:")
print(summary)
```
**Примечание:** Для больших объемов текста модель суммаризации может не справиться с ограничением длины входного текста. В этом случае потребуется разбивать текст на части и суммировать каждую часть отдельно, а затем при необходимости суммировать полученные сводки.
## Подзадача 3: Реализовать собственный API
Для создания собственного API мы можем воспользоваться фреймворками, такими как **Flask** или **FastAPI**. В данном примере я покажу использование **FastAPI**, так как он более современный и обеспечивает лучшую производительность.
### Шаг 1. Установка FastAPI и Uvicorn
```bash
pip install fastapi
pip install "uvicorn[standard]"
```
### Шаг 2. Создание API
Ниже приведен пример создания API, который принимает ссылку на файл на Яндекс.Диске, скачивает его, транскрибирует и суммирует текст.
```python
from fastapi import FastAPI, HTTPException
from pydantic import BaseModel
import requests
import whisper
from transformers import pipeline
import tempfile
import os
app = FastAPI()
# Ваш OAuth-токен Яндекс.Диска
TOKEN = 'YOUR_YANDEX_DISK_OAUTH_TOKEN'
API_URL = 'https://cloud-api.yandex.net:443/v1/disk/'
headers = {
'Authorization': f'OAuth {TOKEN}',
}
class VideoRequest(BaseModel):
yadisk_path: str # Путь к видео на Яндекс.Диске
def download_file(file_path):
url = API_URL + 'resources/download'
params = {'path': file_path}
response = requests.get(url, headers=headers, params=params)
if response.status_code == 200:
download_url = response.json()['href']
download_response = requests.get(download_url)
if download_response.status_code == 200:
temp_file = tempfile.NamedTemporaryFile(delete=False, suffix='.mp4')
with open(temp_file.name, 'wb') as f:
f.write(download_response.content)
return temp_file.name
return None
def transcribe_video(video_path, language='ru'):
model = whisper.load_model("base")
result = model.transcribe(video_path, language=language)
return result['text']
def summarize_text(text, max_length=150, min_length=40):
summarizer = pipeline("summarization", model="facebook/bart-large-cnn")
summary = summarizer(text, max_length=max_length, min_length=min_length, do_sample=False)
return summary[0]['summary_text']
@app.post("/summarize_video/")
def summarize_video(request: VideoRequest):
# Скачивание видео
video_local_path = download_file(request.yadisk_path)
if not video_local_path:
raise HTTPException(status_code=400, detail="Не удалось скачать файл с Яндекс.Диска.")
try:
# Транскрибирование
transcription = transcribe_video(video_local_path)
# Суммаризация
summary = summarize_text(transcription)
return {"summary": summary}
except Exception as e:
raise HTTPException(status_code=500, detail=str(e))
finally:
# Удаление временного файла
if os.path.exists(video_local_path):
os.remove(video_local_path)
if __name__ == "__main__":
import uvicorn
uvicorn.run(app, host="0.0.0.0", port=8000)
```
### Пояснения
1. **Model Loading**: При каждом запросе модели загружаются заново, что неэффективно. Рекомендуется загрузить модели один раз при инициализации приложения.
2. **Асинхронность**: Для улучшения производительности можно сделать функции асинхронными.
3. **Безопасность**: Убедитесь, что ваш API защищен и токен Яндекс.Диска не доступен публично.
### Оптимизированная версия с загрузкой моделей при старте
```python
from fastapi import FastAPI, HTTPException
from pydantic import BaseModel
import requests
import whisper
from transformers import pipeline
import tempfile
import os
app = FastAPI()
# Ваш OAuth-токен Яндекс.Диска
TOKEN = 'YOUR_YANDEX_DISK_OAUTH_TOKEN'
API_URL = 'https://cloud-api.yandex.net:443/v1/disk/'
headers = {
'Authorization': f'OAuth {TOKEN}',
}
class VideoRequest(BaseModel):
yadisk_path: str # Путь к видео на Яндекс.Диске
# Загрузка моделей при старте приложения
print("Загрузка модели Whisper...")
whisper_model = whisper.load_model("base")
print("Загрузка модели для суммаризации...")
summarizer = pipeline("summarization", model="facebook/bart-large-cnn")
def download_file(file_path):
url = API_URL + 'resources/download'
params = {'path': file_path}
response = requests.get(url, headers=headers, params=params)
if response.status_code == 200:
download_url = response.json()['href']
download_response = requests.get(download_url)
if download_response.status_code == 200:
temp_file = tempfile.NamedTemporaryFile(delete=False, suffix='.mp4')
with open(temp_file.name, 'wb') as f:
f.write(download_response.content)
return temp_file.name
return None
def transcribe_video(video_path, language='ru'):
result = whisper_model.transcribe(video_path, language=language)
return result['text']
def summarize_text(text, max_length=150, min_length=40):
summary = summarizer(text, max_length=max_length, min_length=min_length, do_sample=False)
return summary[0]['summary_text']
@app.post("/summarize_video/")
def summarize_video(request: VideoRequest):
# Скачивание видео
video_local_path = download_file(request.yadisk_path)
if not video_local_path:
raise HTTPException(status_code=400, detail="Не удалось скачать файл с Яндекс.Диска.")
try:
# Транскрибирование
transcription = transcribe_video(video_local_path)
# Суммаризация
summary = summarize_text(transcription)
return {"summary": summary}
except Exception as e:
raise HTTPException(status_code=500, detail=str(e))
finally:
# Удаление временного файла
if os.path.exists(video_local_path):
os.remove(video_local_path)
if __name__ == "__main__":
import uvicorn
uvicorn.run(app, host="0.0.0.0", port=8000)
```
### Запуск API
Сохраните файл, например, как `main.py`, и запустите сервер командой:
```bash
python main.py
```
API будет доступен по адресу `http://0.0.0.0:8000`. Вы можете протестировать его с помощью инструмента **cURL**, **Postman** или встроенного **Swagger UI** по адресу `http://0.0.0.0:8000/docs`.
### Пример запроса через cURL
```bash
curl -X POST "http://0.0.0.0:8000/summarize_video/" -H "Content-Type: application/json" -d '{"yadisk_path": "/path/to/video.mp4"}'
```
**Ответ:**
```json
{
"summary": "Краткое содержание видео..."
}
```
## Дополнительные рекомендации
1. **Обработка больших видео**: Для больших видео процесс транскрибирования и суммаризации может потребовать значительных ресурсов и времени. Рассмотрите возможность выполнения этих задач асинхронно или через фоновые задачи (например, с использованием Celery).
2. **Кэширование**: Для часто запрашиваемых видео целесообразно кэшировать результаты транскрибирования и суммаризации, чтобы ускорить ответы API.
3. **Безопасность API**: Добавьте аутентификацию и авторизацию для вашего API, чтобы предотвратить несанкционированный доступ.
4. **Логирование и мониторинг**: Внедрите систему логирования и мониторинга для отслеживания состояния приложения и быстрого выявления проблем.
5. **Оптимизация моделей**: Для улучшения производительности можно использовать более легкие модели или оптимизировать существующие (например, используя ONNX, токенизацию батчами и т.д.).
## Заключение
В этом руководстве мы рассмотрели, как реализовать скрипт для работы с API Яндекс.Диска, транскрибировать и суммаризировать текст из видеороликов, а также создать собственный API для этих задач с использованием FastAPI. Вы можете адаптировать приведенные примеры под свои потребности, добавлять новые функции и оптимизировать существующие для повышения эффективности и масштабируемости.
Если у вас возникнут дополнительные вопросы или потребуется помощь в реализации конкретных частей проекта, не стесняйтесь обращаться!