Софт для поиска audio плагиата - помогите с теорией Software
soft Audio Plagiary Detector sktch2 @ CoolRockBassBlock
Известно, что иногда в Сети встречаются личности, у которых хватает совести выдавать чужие треки за свои, а некоторые ещё и продают их. Самое худшее происходит тогда, когда вы ничего не подозревая, спокойно работаете дальше. Проблема появляется внезапно, как гром среди ясного неба, начинаются долгие и неприятные разборки.
Мне, как и любому покупателю музыки, хочется полностью исключить возможность столкновения с любым сплагиаченным треком в релизе. Есть музыканты и владельцы лейблов на PROMODJ, на страницах которых бываю часто, в их релизах уверен полностью, но просторы Интернета безграничны.
Очень нужны любые мнения на тему: возможна ли программа, которая сама будет искать плагиат и по какому принципу она может работать ? Или в сегодняшнее время её невозможно сделать ?
Допустим, можно ли собрать в базу данных спектры mp3 файлов и детально сравнивать их между собой, или лучше разбивать музыкальный фрагмент на множество частотных диапазонов, сравнивая его с треком в котором есть сомнения, может существуют и другие варианты ?
Пока размышлял над subj, сделал примерный набросок интерфейса подобной программы
[скрин в самом начале поста]. Скорее всего, объёмы данных будут просто огромными, потребуется хранить детальную информацию о каждой композиции. Mp3, если что, можно перевести в wav файл и работать уже с ним, тем более, это реализовано уже достаточно давно:
Например, вот исходник класса Wav файла: авторство принадлежит dar3dev1l26 (С)
public class WavFile
{
public string path;
//-----WaveHeader-----
public char[] sGroupID; // RIFF
public uint dwFileLength; // total file length minus 8, which is taken up by RIFF
public char[] sRiffType;// always WAVE
//-----WaveFormatChunk-----
public char[] sFChunkID; // Four bytes: "fmt "
public uint dwFChunkSize; // Length of header in bytes
public ushort wFormatTag; // 1 (MS PCM)
public ushort wChannels; // Number of channels
public uint dwSamplesPerSec; // Frequency of the audio in Hz... 44100
public uint dwAvgBytesPerSec; // for estimating RAM allocation
public ushort wBlockAlign; // sample frame size, in bytes
public ushort wBitsPerSample; // bits per sample
//-----WaveDataChunk-----
public char[] sDChunkID; // "data"
public uint dwDChunkSize; // Length of header in bytes
public byte dataStartPos; // audio data start position
public WavFile()
{
path = Environment.CurrentDirectory;
//-----WaveHeader-----
dwFileLength = 0;
sGroupID = "RIFF".ToCharArray();
sRiffType = "WAVE".ToCharArray();
//-----WaveFormatChunk-----
sFChunkID = "fmt ".ToCharArray();
dwFChunkSize = 16;
wFormatTag = 1;
wChannels = 2;
dwSamplesPerSec = 44100;
wBitsPerSample = 16;
wBlockAlign = (ushort)(wChannels * (wBitsPerSample / 8));
dwAvgBytesPerSec = dwSamplesPerSec * wBlockAlign;
//-----WaveDataChunk-----
dataStartPos = 44;
dwDChunkSize = 0;
sDChunkID = "data".ToCharArray();
}
}
Он пишет буквально следующее: Цитата:
"Мне не нужно никаким образом менять данные в хэдере или менять размер wav файла, мне нужно изменить с помощью своего алгоритма значения в блоке данных. Поэтому я действую так: создаю экземпляр класса WavFile инициализирую его поля с помощью BinaryReader, потом копирую файл с помощью BinaryWriter (когда дохожу до блока данных я их перед записью редактирую). Таким образом я имею копию исходного файла, только с звуковыми отредактированными данными..."
Вот его код для инициализации:
wavFile.path = @"C:\Track.wav"; // Полный путь к нашему файлу
FileStream fsr = new FileStream(wavFile.path, FileMode.Open, FileAccess.Read);
BinaryReader r = new BinaryReader(fsr);
wavFile.sGroupID = r.ReadChars(4); // Читаем всю структуру
wavFile.dwFileLength = r.ReadUInt32();
wavFile.sRiffType = r.ReadChars(4);
wavFile.sFChunkID = r.ReadChars(4);
wavFile.dwFChunkSize = r.ReadUInt32();
wavFile.wFormatTag = r.ReadUInt16();
wavFile.wChannels = r.ReadUInt16();
wavFile.dwSamplesPerSec = r.ReadUInt32();
wavFile.dwAvgBytesPerSec = r.ReadUInt32();
wavFile.wBlockAlign = r.ReadUInt16();
wavFile.wBitsPerSample = r.ReadUInt16();
wavFile.sDChunkID = r.ReadChars(4);
wavFile.dwDChunkSize = r.ReadUInt32();
wavFile.dataStartPos = (byte)r.BaseStream.Position;
r.Close();
fsr.Close();