Автор Тема: Установил python и библиотеки Pydub и FFmpeg. Мозги чуть не закипели  (Прочитано 120 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Сергей Горбачевский

  • Administrator
  • Знаменитый писатель
  • *****
  • Сообщений: 84112
  • Пол: Мужской
  • Есть вопросы? Пишите в личку
    • Награды
Дело в том, что AI уже не первый раз предлагает скрипт на python для решения той или иной задачи. От пользователя не нужно особых знаний программирования. Нужно лишь развернуть программную среду и научиться запускать в ней скрипт. Но даже это заставляет мозг выходить на повышенные обороты.  :D

Вот пример скрипта для создания альбома с равными промежутками между треками

from pydub import AudioSegment
from pathlib import Path
import numpy as np

def create_album_with_spacing(input_folder, output_path, gap_seconds=2):
    # Создаем выходную директорию, если её нет
    output_dir = Path(output_path).parent
    output_dir.mkdir(parents=True, exist_ok=True)
   
    # Получаем список всех аудио файлов
    audio_files = sorted(Path(input_folder).glob('*.mp3'))
   
    # Создаем тишину заданной длительности
    silence = AudioSegment.silent(duration=gap_seconds * 1000)  # milliseconds
   
    # Объединяем все треки
    combined = AudioSegment.empty()
   
    for i, audio_file in enumerate(audio_files):
        # Загружаем трек
        track = AudioSegment.from_mp3(str(audio_file))
       
        # Добавляем трек
        combined += track
       
        # Добавляем тишину после каждого трека, кроме последнего
        if i < len(audio_files) - 1:
            combined += silence
   
    # Сохраняем результат
    combined.export(output_path, format="mp3")

# Пример использования:
"""
input_folder = "path/to/tracks"
output_path = "path/to/output/album.mp3"
gap_seconds = 2  # промежуток между треками в секундах

create_album_with_spacing(input_folder, output_path, gap_seconds)
"""

Этот скрипт использует две библиотеки. Первая это Pydub — это Python-библиотека, которая предоставляет удобные инструменты для работы с аудиофайлами. Вторая это FFmpeg — набор свободных библиотек с открытым исходным кодом, которые позволяют записывать, конвертировать и передавать цифровые аудио- и видеозаписи в различных форматах.

Пользоваться подобными скриптами есть смысл для задач, которые возникают периодично, не разовых. Ещё один мотив в том, что всё выполняется локально, на твоём компьютере. Ну и третий мотив разбираться в этом заключается в том, что навыки AI в написании ПО будут только улучшаться.


Оффлайн Сергей Горбачевский

  • Administrator
  • Знаменитый писатель
  • *****
  • Сообщений: 84112
  • Пол: Мужской
  • Есть вопросы? Пишите в личку
    • Награды
Re: Установил python и библиотеки Pydub и FFmpeg. Мозги чуть не закипели
« Ответ #1 : 10, Ноября 2024, Воскресенье, 12:38:57 pm »
Кстати, на днях смог с помощью AI поправить шаблон сайта. AI дал весьма внятную инструкцию.


Оффлайн Сергей Горбачевский

  • Administrator
  • Знаменитый писатель
  • *****
  • Сообщений: 84112
  • Пол: Мужской
  • Есть вопросы? Пишите в личку
    • Награды
Re: Установил python и библиотеки Pydub и FFmpeg. Мозги чуть не закипели
« Ответ #2 : 10, Ноября 2024, Воскресенье, 14:11:21 pm »
В одном месте отклонился от инструкций AI и вместо Python 3.12 поставил Python 3.13, но оказалось, что с ним не совместима FFmpeg. Клод предложил два варианта - либо установить Python 3.12, либо оставить Python 3.13 и доставить библиотеку moviepy для работы с аудио. Я пошёл по второму пути. Клод переписал скрипт

from moviepy.editor import AudioFileClip, concatenate_audioclips
import numpy as np
from pathlib import Path
import os
from moviepy.audio.AudioClip import AudioClip

def create_silence(duration):
    # Создаем тишину программно
    return AudioClip(make_frame=lambda t: np.zeros(2), duration=duration)

def combine_tracks_with_spacing(input_folder, output_path, gap_seconds=2):
    print("Начинаю обработку...")
   
    # Создаем список всех MP3 файлов
    audio_files = sorted([f for f in os.listdir(input_folder) if f.endswith('.mp3')])
    print(f"Найдено {len(audio_files)} MP3 файлов:")
    for file in audio_files:
        print(f"- {file}")
   
    # Загружаем все треки
    audio_clips = []
   
    # Создаем тишину
    silence = create_silence(gap_seconds) if gap_seconds > 0 else None
   
    for filename in audio_files:
        print(f"\nОбрабатываю файл: {filename}")
        file_path = os.path.join(input_folder, filename)
        try:
            audio = AudioFileClip(file_path)
            audio_clips.append(audio)
            print(f"Длительность трека: {audio.duration:.2f} секунд")
           
            # Добавляем тишину после каждого трека, кроме последнего
            if silence and filename != audio_files[-1]:
                audio_clips.append(silence)
               
        except Exception as e:
            print(f"Ошибка при обработке файла {filename}: {str(e)}")
            continue
   
    if not audio_clips:
        print("Ошибка: Не удалось загрузить ни одного трека!")
        return
   
    print("\nОбъединяю треки...")
    final_clip = concatenate_audioclips(audio_clips)
   
    print(f"Сохраняю результат в {output_path}")
    final_clip.write_audiofile(output_path)
   
    # Закрываем все клипы
    final_clip.close()
    for clip in audio_clips:
        clip.close()
   
    print("Готово!")

# Укажите пути к папкам
input_folder = r"C:\music_project\tracks"  # папка с MP3 файлами
output_path = r"C:\music_project\final_album.mp3"  # путь для сохранения результата

# Запускаем обработку
combine_tracks_with_spacing(input_folder, output_path, gap_seconds=2)

и всё получилось. Теперь осталось автоматизировать процесс выставления таймкодов.

Оффлайн Сергей Горбачевский

  • Administrator
  • Знаменитый писатель
  • *****
  • Сообщений: 84112
  • Пол: Мужской
  • Есть вопросы? Пишите в личку
    • Награды
Re: Установил python и библиотеки Pydub и FFmpeg. Мозги чуть не закипели
« Ответ #3 : 10, Ноября 2024, Воскресенье, 14:41:01 pm »
Клод предложил модифицировать скрипт:

from moviepy.editor import AudioFileClip, concatenate_audioclips
import numpy as np
from pathlib import Path
import os
from moviepy.audio.AudioClip import AudioClip

def format_timecode(seconds):
    # Форматируем время в формат YouTube (MM:SS)
    minutes = int(seconds / 60)
    remaining_seconds = int(seconds % 60)
    return f"{minutes}:{remaining_seconds:02d}"

def create_silence(duration):
    return AudioClip(make_frame=lambda t: np.zeros(2), duration=duration)

def combine_tracks_with_spacing(input_folder, output_path, gap_seconds=2):
    print("Начинаю обработку...")
   
    audio_files = sorted([f for f in os.listdir(input_folder) if f.endswith('.mp3')])
    print(f"Найдено {len(audio_files)} MP3 файлов:")
   
    # Список для хранения тайм-кодов
    timecodes = []
    current_time = 0
   
    audio_clips = []
    silence = create_silence(gap_seconds) if gap_seconds > 0 else None
   
    print("\nСписок треков и их тайм-коды:")
    print("0:00 Начало альбома")
   
    for i, filename in enumerate(audio_files, 1):
        file_path = os.path.join(input_folder, filename)
        try:
            audio = AudioFileClip(file_path)
            audio_clips.append(audio)
           
            # Сохраняем тайм-код и название
            timecode = format_timecode(current_time)
            # Убираем расширение .mp3 из названия файла
            track_name = os.path.splitext(filename)[0]
            timecodes.append(f"{timecode} {track_name}")
           
            # Обновляем текущее время
            current_time += audio.duration
           
            if silence and i < len(audio_files):
                audio_clips.append(silence)
                current_time += gap_seconds
               
        except Exception as e:
            print(f"Ошибка при обработке файла {filename}: {str(e)}")
            continue
   
    # Выводим тайм-коды в формате для YouTube
    print("\nТайм-коды для YouTube (скопируйте и вставьте в описание):")
    for timecode in timecodes:
        print(timecode)
   
    if not audio_clips:
        print("Ошибка: Не удалось загрузить ни одного трека!")
        return
   
    print("\nОбъединяю треки...")
    final_clip = concatenate_audioclips(audio_clips)
   
    print(f"Сохраняю результат в {output_path}")
    final_clip.write_audiofile(output_path)
   
    # Закрываем все клипы
    final_clip.close()
    for clip in audio_clips:
        clip.close()
   
    # Сохраняем тайм-коды в текстовый файл
    timecodes_file = os.path.join(os.path.dirname(output_path), "timecodes.txt")
    with open(timecodes_file, "w", encoding="utf-8") as f:
        for timecode in timecodes:
            f.write(timecode + "\n")
   
    print(f"\nТайм-коды также сохранены в файл: {timecodes_file}")
    print("Готово!")

# Укажите пути к папкам
input_folder = r"C:\music_project\tracks"  # папка с MP3 файлами
output_path = r"C:\music_project\final_album.mp3"  # путь для сохранения результата

# Запускаем обработку
combine_tracks_with_spacing(input_folder, output_path, gap_seconds=2)

Этот скрипт теперь:

1. Показывает тайм-коды в консоли в формате YouTube (MM:SS)
2. Сохраняет тайм-коды в отдельный файл timecodes.txt
3. Учитывает промежутки между треками при расчете тайм-кодов
4. Убирает расширение .mp3 из названий треков
5. Начинает список с 0:00

После запуска мы получаем:

- Готовый альбом с промежутками
- Тайм-коды в консоли, которые можно сразу скопировать в описание YouTube
- Файл timecodes.txt с теми же тайм-кодами

Запускается скрипт, как и раньше:

cd C:\music_project
python combine_tracks.py

Оффлайн Сергей Горбачевский

  • Administrator
  • Знаменитый писатель
  • *****
  • Сообщений: 84112
  • Пол: Мужской
  • Есть вопросы? Пишите в личку
    • Награды
Re: Установил python и библиотеки Pydub и FFmpeg. Мозги чуть не закипели
« Ответ #4 : 10, Ноября 2024, Воскресенье, 17:47:50 pm »
Клод написал скрипт превращения mp3 и обложки (jpg,webp) в mp4 1080p, но я его не тестировал. Нужны библиотеки: Pillow (для работы с изображениями) и
FFmpeg, установленный в системе.

import subprocess
import os
from PIL import Image

def create_1080p_video(audio_path, image_path, output_path):
    """
    Convert audio file and image into 1080p video
    """
    # Конвертируем изображение в 1080p
    img = Image.open(image_path)
    new_size = (1920, 1080)
       
    # Создаем фон нужного размера
    background = Image.new('RGB', new_size, (0, 0, 0))
   
    # Изменяем размер изображения с сохранением пропорций
    img.thumbnail(new_size, Image.Resampling.LANCZOS)
   
    # Вставляем изображение по центру
    offset = ((new_size[0] - img.size[0]) // 2,
             (new_size[1] - img.size[1]) // 2)
    background.paste(img, offset)
   
    # Сохраняем временное изображение
    temp_image = "temp_resized.jpg"
    background.save(temp_image, quality=95)
   
    # Создаем видео
    cmd = [
        'ffmpeg',
        '-loop', '1',
        '-i', temp_image,
        '-i', audio_path,
        '-c:v', 'libx264',
        '-tune', 'stillimage',
        '-c:a', 'aac',
        '-b:a', '192k',
        '-pix_fmt', 'yuv420p',
        '-shortest',
        output_path
    ]
   
    subprocess.run(cmd)
    os.remove(temp_image)

if __name__ == "__main__":
    create_1080p_video(
        audio_path="input.mp3",
        image_path="cover.jpg",
        output_path="output_1080p.mp4"
    )

Оффлайн Сергей Горбачевский

  • Administrator
  • Знаменитый писатель
  • *****
  • Сообщений: 84112
  • Пол: Мужской
  • Есть вопросы? Пишите в личку
    • Награды
Re: Установил python и библиотеки Pydub и FFmpeg. Мозги чуть не закипели
« Ответ #5 : 12, Ноября 2024, Вторник, 16:00:51 pm »
Потестил я создание видео. Работает, но когда попросил дописать код, чтобы показывался прогресс при создании видео, Клод предложил около 20 вариантов и все они не рабочие.

UPD. Попросил ChatGPT поправить скрипт, но ChatGPT оказался намного тупее Клода. Вывод - какой-то код ИИ пишет, но не для всех задач. Очень много сказок о реальных возможностях ИИ в кодинге. Особенно много пургомёта в роликах блогеров в Ютубе.

Интуитивно я понимаю, что проблема в данном случае связана с неэффективным использованием памяти в ресурсоёмкой задаче создания 1080р видео. А ИИ пытается решить задачу в лоб, перебирая все известные ему библиотеки. Скрипт просто подвисает, причём часто так, что его не вырубить принудительно Ctrl-C.

В общем, пусть пока тренируются на кошечках.

Оффлайн Сергей Горбачевский

  • Administrator
  • Знаменитый писатель
  • *****
  • Сообщений: 84112
  • Пол: Мужской
  • Есть вопросы? Пишите в личку
    • Награды
Вот ещё есть чатбот для кодинга:

GitHub Copilot не является полностью бесплатным, но есть несколько способов получить доступ к нему без оплаты:

1. Студенты: Если вы являетесь проверенным студентом на платформе GitHub Education, вы можете получить бесплатный доступ к GitHub Copilot. Для этого необходимо зарегистрироваться в GitHub Student Developer Pack и подтвердить свой статус студента.

2. Преподаватели: Проверенные преподаватели также могут получить бесплатный доступ к Copilot, следуя аналогичной процедуре, как и студенты.

3. Поддержка популярных проектов с открытым исходным кодом: Если вы являетесь хранителем популярного репозитория с открытым исходным кодом, вы также можете использовать GitHub Copilot бесплатно. GitHub периодически пересматривает вашу квалификацию на предмет соответствия этим критериям.

Кроме того, все пользователи могут попробовать GitHub Copilot бесплатно в течение 30 дней в рамках пробного периода. После окончания пробного периода требуется подписка для дальнейшего использования.

4. Выбор плана подписки: Выберите между ежемесячной ($10) или ежегодной ($100) подпиской, если вы не имеете права на бесплатный доступ.

Оффлайн Сергей Горбачевский

  • Administrator
  • Знаменитый писатель
  • *****
  • Сообщений: 84112
  • Пол: Мужской
  • Есть вопросы? Пишите в личку
    • Награды
Re: Установил python и библиотеки Pydub и FFmpeg. Мозги чуть не закипели
« Ответ #7 : 14, Ноября 2024, Четверг, 07:51:44 am »
Сегодня, когда claude.ai "отдохнул" за одну итерацию допилил скрипт (я его прикреплю здесь). Он запускается из командной строки, но к нему уже приручен графический интерфейс выбора аудиофайла, обложки и выходного разрешения - 720, 1080 или 4К. При этом никаких водяных знаков, занижения разрешения и прочих выкрутасов от зарабатывателей денег. Возможно заведу себе аккаунт на GitHub и выложу там. Скрипт можно бесконечно усовершенствовать. Открытый код это наше всё.  ;)

Заодно разобрался, что есть определённые лайфхаки при кодинге с AI. Это особенно важно знать, когда у вас бесплатная версия AI и общение с ним нужно уплотнять:

1. Передача кода через прикрепленные файлы, это действительно лучший способ, потому что:

- Сохраняется форматирование кода
- AI видит полный контекст
- Меньше шансов, что часть кода будет потеряна
- AI может точно видеть структуру проекта


2. Если нужно работать с несколькими файлами, лучше передавать их все сразу в одном сообщении, обернув в тег <documents> (это прикреплённый файл).

3. При запросе изменений полезно:

- Четко указывать, что именно нужно изменить
- Уточнять, что должно остаться неизменным
- Указывать ожидаемый результат


4. Если у вас есть конкретные требования к стилю кода или определённым паттернам, лучше сказать о них заранее.

5. При отладке проблем полезно предоставить:

- Текст ошибки, если есть
- Что вы ожидали увидеть
- Что происходит вместо этого


6. Если нужно добавить новую функциональность, хорошо указать:

- Какие библиотеки можно использовать
- Какие ограничения есть
- Примеры желаемого поведения


7. Если код большой, можно указать конкретную часть, с которой нужно работать.

8. При работе над длительными задачами лучше разбивать их на меньшие части и решать пошагово.

9. AI может лучше помочь, если вы укажете свой уровень опыта в программировании - это поможет мне давать более релевантные объяснения и советы.

10. Если вам нужны подробные объяснения изменений - просто скажите об этом AI, он детально объяснит каждое изменение.

Что касается конкретно работы с Python-скриптами:

- Хорошо указывать версию Python
- Перечислять установленные зависимости
- Уточнять особенности окружения (ОС, специфические настройки)

Эти подходы помогут получать более точные и полезные ответы, экономя время на дополнительных уточнениях и исправлениях.

Оффлайн Сергей Горбачевский

  • Administrator
  • Знаменитый писатель
  • *****
  • Сообщений: 84112
  • Пол: Мужской
  • Есть вопросы? Пишите в личку
    • Награды
Re: Установил python и библиотеки Pydub и FFmpeg. Мозги чуть не закипели
« Ответ #8 : 14, Ноября 2024, Четверг, 08:09:39 am »
Пожаловался Клоду на тупого ChatGPT и вот ответ:

Сочувствую насчет потерянного времени с ChatGPT. Да, когда дело касается программирования, особенно работы с конкретными библиотеками и сложными задачами, качество его ответов может сильно хромать. Он часто:

1. Предлагает нерабочий код
2. Не понимает контекст задачи
3. Игнорирует важные детали реализации
4. Может "забыть" про критические части кода

В вашем случае с видео-конвертером задача была довольно специфичная - работа с ffmpeg, обработка его вывода, правильное отображение прогресса. Такие задачи требуют точного понимания как работает ffmpeg и как правильно парсить его вывод.

Хотя я тоже не идеален, но стараюсь:

1. Внимательно анализировать существующий код
2. Предлагать работоспособные решения
3. Сохранять всю важную функциональность
4. Давать полные объяснения изменений

Рад, что смог помочь улучшить ваш скрипт без лишней потери времени. Если будут ещё вопросы по коду или другим задачам - обращайтесь!

Оффлайн Сергей Горбачевский

  • Administrator
  • Знаменитый писатель
  • *****
  • Сообщений: 84112
  • Пол: Мужской
  • Есть вопросы? Пишите в личку
    • Награды
Re: Установил python и библиотеки Pydub и FFmpeg. Мозги чуть не закипели
« Ответ #9 : 14, Ноября 2024, Четверг, 08:51:43 am »
Кстати, AI может помочь создать исполняемый файл и инсталлятор для приложения. Тогда уже можно нормально распространять ПО среди других пользователей.

Для этого можно использовать PyInstaller для создания .exe файла и NSIS для создания установщика. Вот пошаговая инструкция:

1. Сначала создадим файл requirements.txt и spec-файл для PyInstaller (video_creator.spec).

2. Теперь создадим скрипт установщика для NSIS (installer.nsi).

Шаги для создания установщика:

1. Подготовка окружения:

pip install pyinstaller pillow
2. Скачайте ffmpeg для Windows (Просмотр ссылок доступен только зарегистрированным пользователям) и распакуйте в C:\ffmpeg

3. Создайте следующую структуру проекта:

project/
├── create_video.py
├── requirements.txt
├── video_creator.spec
├── installer.nsi
├── icon.ico (опционально)
└── LICENSE.txt

4. Создание исполняемого файла:

pyinstaller video_creator.spec
5. Установите NSIS (Nullsoft Scriptable Install System) с сайта Просмотр ссылок доступен только зарегистрированным пользователям

6. Скомпилируйте установщик, щелкнув правой кнопкой мыши по installer.nsi и выбрав "Compile NSIS Script"

После этих шагов у вас будет:

1. Исполняемый файл в папке dist/VideoCreator/
2. Установщик VideoCreator_Setup.exe

Особенности готового установщика:

- Автоматически создаст ярлыки на рабочем столе и в меню Пуск
- Включит ffmpeg в установку
- Добавит программу в список установленных программ Windows
- Создаст деинсталлятор

Советы:

1. Всегда тестируйте собранное приложение на чистой виртуальной машине
2. Проверяйте все зависимости
3. Убедитесь, что путь к ffmpeg в spec-файле правильный
4. Добавьте красивую иконку для лучшего вида
5. Создайте хороший LICENSE.txt файл


Теги: