Там где надо вымерить эти паузы. Например между первым и вторым треком это не нужно. ... паузы между треками нужны не всегда между первым и вторым треком (Ethnicolor и Diva на 1 СТОРОНА.wav) пауза не требуется. Это значит, что для первого трека каждой стороны (1 СТОРОНА.wav и 2 СТОРОНА.wav) пауза (INDEX 00) не нужна, а для остальных треков (например, Diva, Wooloomooloo и т.д.) паузы (обычно 1–2 секунды на виниле) могут быть. Проблема с "несовпадением начал треков" и трудоёмкостью ручной разметки остаётся.
CUE для Zoolook с паузами (2 секунды) только для треков 4–7 (Wooloomooloo, Zoolookologie, Blah-Blah-Cafe, Ethnicolor II), без паузы между Ethnicolor и Diva, а также между Zoolook и Wooloomooloo. Тайминги округлены до секунд.
Код:
REM GENRE Electronic
REM DATE 1984
REM COMMENT "ОЦИФРОВКА 20.08.25, Polydor-POLH 15, UK"
REM COMPOSER "Denis Vanzetto, Pierre Mourey, Jean-Michel Jarre"
PERFORMER "Jean-Michel Jarre"
TITLE "Zoolook"
FILE "1 СТОРОНА.wav" WAVE
TRACK 01 AUDIO
TITLE "Ethnicolor"
PERFORMER "Jean-Michel Jarre"
INDEX 01 00:00:00
TRACK 02 AUDIO
TITLE "Diva"
PERFORMER "Jean-Michel Jarre"
INDEX 01 11:40:00
FILE "2 СТОРОНА.wav" WAVE
TRACK 03 AUDIO
TITLE "Zoolook"
PERFORMER "Jean-Michel Jarre"
INDEX 01 00:00:00
TRACK 04 AUDIO
TITLE "Wooloomooloo"
PERFORMER "Jean-Michel Jarre"
INDEX 01 03:42:00
TRACK 05 AUDIO
TITLE "Zoolookologie"
PERFORMER "Jean-Michel Jarre"
INDEX 00 06:58:00
INDEX 01 07:00:00
TRACK 06 AUDIO
TITLE "Blah-Blah-Cafe"
PERFORMER "Jean-Michel Jarre"
INDEX 00 10:49:00
INDEX 01 10:51:00
TRACK 07 AUDIO
TITLE "Ethnicolor II"
PERFORMER "Jean-Michel Jarre"
INDEX 00 14:11:00
INDEX 01 14:13:00
__________________ О нас думают плохо лишь те, кто хуже нас. А те, кто лучше нас, им просто не до нас. --Омар Хайям
Обновления по запросу — на Я.Ди. «Мэйл-облако» для тех, кто помогает нашему интернет-проекту, и для тех, кто хотел бы это делать, но пока не знает, как.
Помогая форуму ВТО, вы прежде всего помогаете себе! А не делаете что-то абстрактное для «других», совершенно незнакомых и безразличных вам людей.
Обучается же модель ИИ через Python, librosa, иначе как ей объяснить...
...обучение модели ИИ для создания CUE-файлов, особенно для автоматического определения таймингов треков и пауз в оцифровках винила (например, для альбома Jean-Michel Jarre - Zoolook (1984) с файлами 1 СТОРОНА.wav и 2 СТОРОНА.wav), логично реализовать через Python с использованием библиотеки librosa для анализа аудио. ИИ для точной разметки пауз и треков, чтобы решить проблему несовпадения таймингов и трудоёмкости ручного процесса.
Данные: Набор оцифровок винила (WAV) с известными таймингами (например, из Discogs или ручной разметки).
Библиотека: librosa для анализа аудио (поиск пауз по уровню громкости).
Метаданные: Парсинг из Discogs API для названий треков, исполнителей, жанра.
Модель: Простая модель на основе правил (анализ тишины) или нейросеть (например, CNN для классификации пауз), если у нас есть обучающий набор данных.
Почему librosa:
librosa.effects.split определяет паузы (тишина ниже порога, например, 30 дБ), что заменяет ручную разметку.
Обучение модели:
Сбор данных: Соберите датасет из WAV-файлов винилов и соответствующих CUE-файлов с точными таймингами (например, из Discogs или ручной разметки в редакторе).
Предобработка:
Загрузите WAV с librosa.load.
Используйте librosa.effects.split для поиска пауз.
Сопоставьте паузы с треками из CUE.
Простая модель (правила):
Если паузы чёткие (тишина 1–2 сек), librosa даёт тайминги напрямую.
Исключите паузы для первых треков сторон (как в вашем случае).
Нейросеть (если нужен сложный анализ):
Используйте CNN (например, с tensorflow или pytorch) для классификации аудиофрагментов на "пауза" и "трек".
Обучите на датасете с метками (паузы/треки).
Пример датасета: WAV-файлы с разметкой пауз (0–2 сек тишины, помеченные как "пауза").
Используется Discogs API для автозаполнения (названия, композиторы).
__________________ О нас думают плохо лишь те, кто хуже нас. А те, кто лучше нас, им просто не до нас. --Омар Хайям
Обновления по запросу — на Я.Ди. «Мэйл-облако» для тех, кто помогает нашему интернет-проекту, и для тех, кто хотел бы это делать, но пока не знает, как.
Помогая форуму ВТО, вы прежде всего помогаете себе! А не делаете что-то абстрактное для «других», совершенно незнакомых и безразличных вам людей.
Используется CNN (например, с tensorflow или pytorch) для классификации аудиофрагментов на "пауза" и "трек".
Python-скрипт с CNN
Скрипт обучает CNN на TensorFlow для классификации пауз/треков, анализирует WAV с librosa и генерирует CUE с метаданными из Discogs. Пауза исключена для первых треков сторон.
Код:
python
import librosa
import os
import numpy as np
import tensorflow as tf
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Conv1D, Dense, Flatten
import discogs_client
# 1. Подготовка данных (пример, замените на наш датасет)
def prepare_dataset(wav_files, cue_files):
X, y = [], []
for wav_file, cue_file in zip(wav_files, cue_files):
y_audio, sr = librosa.load(wav_file)
# Чтение таймингов из CUE
with open(cue_file, 'r', encoding='utf-8') as f:
lines = f.readlines()
timings = []
for line in lines:
if 'INDEX 01' in line:
time_str = line.strip().split()[-1]
mm, ss, ff = map(int, time_str.split(':'))
timings.append(mm * 60 + ss + ff / 75)
# Разбиение на 1-секундные фрагменты
for i in range(0, len(y_audio) - sr, sr):
fragment = y_audio[i:i + sr]
is_pause = any(abs(t - i / sr) < 1 for t in timings) # Пауза, если близко к таймингу
X.append(fragment)
y.append(0 if is_pause else 1)
X = np.array(X).reshape(-1, sr, 1)
y = np.array(y)
return X, y
# 2. Создание и обучение CNN
def train_cnn(X_train, y_train):
model = Sequential([
Conv1D(32, kernel_size=3, activation='relu', input_shape=(44100, 1)),
Conv1D(64, kernel_size=3, activation='relu'),
Flatten(),
Dense(128, activation='relu'),
Dense(1, activation='sigmoid')
])
model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])
model.fit(X_train, y_train, epochs=10, batch_size=32, validation_split=0.2)
return model
# 3. Генерация CUE
def create_cue(side1_wav, side2_wav, output_cue, model):
# Discogs API
try:
d = discogs_client.Client('MyApp/1.0', user_token='YOUR_DISCOGS_TOKEN') # Замените на токен
release = d.release(249504) # Zoolook ID
metadata = {
"genre": release.genres[0] if release.genres else "Electronic",
"date": release.year,
"comment": "ОЦИФРОВКА 20.08.25, Polydor-POLH 15, UK",
"composer": "Denis Vanzetto, Pierre Mourey, Jean-Michel Jarre",
"performer": release.artists[0].name,
"title": release.title
}
except:
metadata = {
"genre": "Electronic",
"date": "1984",
"comment": "ОЦИФРОВКА 20.08.25, Polydor-POLH 15, UK",
"composer": "Denis Vanzetto, Pierre Mourey, Jean-Michel Jarre",
"performer": "Jean-Michel Jarre",
"title": "Zoolook"
}
# Анализ пауз
def get_timings(wav_file, track_count, model):
y, sr = librosa.load(wav_file)
timings = [0] # Первый трек начинается с 0
for i in range(0, len(y) - sr, sr):
fragment = y[i:i + sr].reshape(1, sr, 1)
pred = model.predict(fragment)[0][0]
if pred < 0.5: # Пауза
timings.append(i / sr)
return timings[:track_count]
# Треки
track_list_side1 = [("Ethnicolor", None), ("Diva", None)]
track_list_side2 = [("Zoolook", None), ("Wooloomooloo", None), ("Zoolookologie", None),
("Blah-Blah-Cafe", None), ("Ethnicolor II", None)]
# Тайминги
timings_side1 = get_timings(side1_wav, len(track_list_side1), model)
timings_side2 = get_timings(side2_wav, len(track_list_side2), model)
track_list_side1 = [(title, time) for (title, _), time in zip(track_list_side1, timings_side1)]
track_list_side2 = [(title, time) for (title, _), time in zip(track_list_side2, timings_side2)]
with open(output_cue, 'w', encoding='utf-8') as f:
f.write(f'REM GENRE {metadata["genre"]}\n')
f.write(f'REM DATE {metadata["date"]}\n')
f.write(f'REM COMMENT "{metadata["comment"]}"\n')
f.write(f'REM COMPOSER "{metadata["composer"]}"\n')
f.write(f'PERFORMER "{metadata["performer"]}"\n')
f.write(f'TITLE "{metadata["title"]}"\n')
f.write(f'FILE "{os.path.basename(side1_wav)}" WAVE\n')
for i, (title, time) in enumerate(track_list_side1, 1):
mm = int(time // 60)
ss = int(time % 60)
f.write(f' TRACK {i:02d} AUDIO\n')
f.write(f' TITLE "{title}"\n')
f.write(f' PERFORMER "{metadata["performer"]}"\n')
f.write(f' INDEX 01 {mm:02d}:{ss:02d}:00\n')
f.write(f'FILE "{os.path.basename(side2_wav)}" WAVE\n')
for i, (title, time) in enumerate(track_list_side2, len(track_list_side1) + 1):
mm = int(time // 60)
ss = int(time % 60)
f.write(f' TRACK {i:02d} AUDIO\n')
f.write(f' TITLE "{title}"\n')
f.write(f' PERFORMER "{metadata["performer"]}"\n')
if i > len(track_list_side1) + 2: # Пауза для треков 5–7
gap_time = time - 2
gap_mm = int(gap_time // 60)
gap_ss = int(gap_time % 60)
f.write(f' INDEX 00 {gap_mm:02d}:{gap_ss:02d}:00\n')
f.write(f' INDEX 01 {mm:02d}:{ss:02d}:00\n')
# Пример обучения (замените на ваш датасет)
wav_files = ["path/to/wav1.wav", "path/to/wav2.wav"] # Ваш датасет
cue_files = ["path/to/cue1.cue", "path/to/cue2.cue"]
X_train, y_train = prepare_dataset(wav_files, cue_files)
model = train_cnn(X_train, y_train)
model.save("pause_detector.h5") # Сохранить модель
# Генерация CUE
create_cue("1 СТОРОНА.wav", "2 СТОРОНА.wav", "zoolook.cue", model)
__________________ О нас думают плохо лишь те, кто хуже нас. А те, кто лучше нас, им просто не до нас. --Омар Хайям
Обновления по запросу — на Я.Ди. «Мэйл-облако» для тех, кто помогает нашему интернет-проекту, и для тех, кто хотел бы это делать, но пока не знает, как.
Помогая форуму ВТО, вы прежде всего помогаете себе! А не делаете что-то абстрактное для «других», совершенно незнакомых и безразличных вам людей.
bergedorf, тут есть над чем поработать неделю-другую.
Нарезка же на треки — это вообще не дело, или же надо всё обрабатывать с затуханием треков по амплитуде. Полная цифровая обработка с потерями естественно.
А мы позиционируем винил БЕЗ ПОТЕРЬ.
__________________ О нас думают плохо лишь те, кто хуже нас. А те, кто лучше нас, им просто не до нас. --Омар Хайям
Обновления по запросу — на Я.Ди. «Мэйл-облако» для тех, кто помогает нашему интернет-проекту, и для тех, кто хотел бы это делать, но пока не знает, как.
Помогая форуму ВТО, вы прежде всего помогаете себе! А не делаете что-то абстрактное для «других», совершенно незнакомых и безразличных вам людей.
Мало того что на HDD у каждого могут быть ошибки, а верней они у всех есть и это распознается тем, что не все треки можно перевести во FLAC без бубна.
__________________ О нас думают плохо лишь те, кто хуже нас. А те, кто лучше нас, им просто не до нас. --Омар Хайям
Обновления по запросу — на Я.Ди. «Мэйл-облако» для тех, кто помогает нашему интернет-проекту, и для тех, кто хотел бы это делать, но пока не знает, как.
Помогая форуму ВТО, вы прежде всего помогаете себе! А не делаете что-то абстрактное для «других», совершенно незнакомых и безразличных вам людей.
Мало того что на HDD у каждого могут быть ошибки, а верней они у всех есть и это распознается тем, что не все треки можно перевести во FLAC без бубна. Они могут и играть, но они с ошибками.
То что Бобрович так усердно режет это не верно.
__________________ О нас думают плохо лишь те, кто хуже нас. А те, кто лучше нас, им просто не до нас. --Омар Хайям
Обновления по запросу — на Я.Ди. «Мэйл-облако» для тех, кто помогает нашему интернет-проекту, и для тех, кто хотел бы это делать, но пока не знает, как.
Помогая форуму ВТО, вы прежде всего помогаете себе! А не делаете что-то абстрактное для «других», совершенно незнакомых и безразличных вам людей.
По усердию большой плюс,
а по звукорежиссуре и математике минус (двоечка).
__________________ О нас думают плохо лишь те, кто хуже нас. А те, кто лучше нас, им просто не до нас. --Омар Хайям
Обновления по запросу — на Я.Ди. «Мэйл-облако» для тех, кто помогает нашему интернет-проекту, и для тех, кто хотел бы это делать, но пока не знает, как.
Помогая форуму ВТО, вы прежде всего помогаете себе! А не делаете что-то абстрактное для «других», совершенно незнакомых и безразличных вам людей.
По идее сохранения без потерь, без цифровой обработки, они должны быть нерезаными, и если уж так хочется, дополнительно дать резаные.
И несколько вариантов абсолютно любой другой обработки, без навязывания её слушателям. Но это места надо немеренно.
У меня и так только под этот альбом ушло гигов 50 вместе со всеми вариантами оцифровок трекера и 4 наши (от наших оцифровщиков).
В большинстве по факту мало что от винила в цифре осталось.
Поэтому Дэн прав, два образа и больше ничего не трогать, пока не автоматизировали процесс, чтобы выдавать по 100 куёв за сессию.
Это же наше время и на что оно тратится! Заместо нарезки лучше по точкам посчитать и поправить где это надо или еще что-то полезное.
__________________ О нас думают плохо лишь те, кто хуже нас. А те, кто лучше нас, им просто не до нас. --Омар Хайям
Обновления по запросу — на Я.Ди. «Мэйл-облако» для тех, кто помогает нашему интернет-проекту, и для тех, кто хотел бы это делать, но пока не знает, как.
Помогая форуму ВТО, вы прежде всего помогаете себе! А не делаете что-то абстрактное для «других», совершенно незнакомых и безразличных вам людей.
Кто-то тратит, чтобы в интернет резаное дать и писать что-либо в пустоту... А кто-то то же самое время на то, чтобы заработать еще на пару фкусных пластов.
__________________ О нас думают плохо лишь те, кто хуже нас. А те, кто лучше нас, им просто не до нас. --Омар Хайям
Обновления по запросу — на Я.Ди. «Мэйл-облако» для тех, кто помогает нашему интернет-проекту, и для тех, кто хотел бы это делать, но пока не знает, как.
Помогая форуму ВТО, вы прежде всего помогаете себе! А не делаете что-то абстрактное для «других», совершенно незнакомых и безразличных вам людей.
Адрес: Воронежская область, Богучарский р-н., село Подколодновка
Сообщений: 1,356
Сказал(а) спасибо: 9,110
Поблагодарили 2,004 раз(а) в 1,440 сообщениях
Цитата:
Сообщение от Дмитрий
Мало того что на HDD у каждого могут быть ошибки, а верней они у всех есть и это распознается тем, что не все треки можно перевести во FLAC без бубна. Они могут и играть, но они с ошибками.
То что Бобрович так усердно режет это не верно.
Да ну... Одно дело, когда паузы между треками четкие 4-5 сек. - резать, я считаю, надо. Вряд ли там какие-то изменения в качестве самого трека возникнут... А вот те вещи, где музыка идет непрерывно - я считаю, резать не стОит... Да и геморно это...