Приложение C# WinForms для отображения сигналов воспроизведения и записанного звука

Я хочу написать приложение С# WinForms, которое может воспроизводить файл WAV. Во время воспроизведения файла он показывает форму сигнала (аналогично осциллографу).

В то же время пользователь может записывать звук через микрофон, пытаясь следовать исходному воспроизводимому звуку (например, караоке). Программа отображает форму волны записанного звука в режиме реального времени, поэтому можно увидеть сравнение формы волны исходного звукового файла и записанного пользователем. Сравнения будут производиться по разнице во времени (задержке) исходного и записанного звука. Отображение сигналов не должно быть очень сложным (нет необходимости вырезать, копировать или вставлять); достаточно просто увидеть это с временной шкалой.

Надеюсь, это достаточно ясно. Пожалуйста, не стесняйтесь обращаться за дополнительными разъяснениями, если это неясно. Большое тебе спасибо.


person Gnubie    schedule 03.03.2011    source источник


Ответы (3)


Вы можете делать с C# все, что хотите, но это не сработает так, как вы думаете. По сути, нет никакой связи между тем, как выглядит запись на экране осциллографа, и тем, как эта запись звучит для человеческого уха. Так, например, если бы я показал вам два файла WAV, отображаемых на дисплее осциллографа, и сказал бы вам, что в одной записи играет туба, а в другой запись человека, произносящего фразу, вы бы не поняли, что это за запись, просто взглянув на нее. на них.

Если вы хотите сравнить звуки пользователя с предварительно записанным WAV-файлом, вы должны стать более изощренным и провести БПФ-анализ обоих и сравнить частотные спектры, но даже это не сработает для того, что вы пытаетесь сделать.

Обновление: после некоторых размышлений я не думаю, что полностью согласен с моими утверждениями выше. То, что вы хотите сделать, может сработать, если вы хотите использовать эффект типа осциллографа для сравнения высоты тона (или частоты) WAV и голоса человека. Если вы настроите осциллограф на отображение относительно небольшого количества длин волн за раз (например, 20), пользователь сможет быстро увидеть эффект повышения или понижения высоты звука своего голоса.

У меня есть небольшой образец приложения на C#, который я написал около 2 лет назад и который делает что-то вроде этого, только он отображает спектрограф, созданный БПФ, вместо осциллографа (разница в основном в том, что спектрограф показывает информацию в частотной области, а осциллограф показывает информацию во временной области). Это в реальном времени, так что вы можете говорить/петь/что угодно в микрофон и наблюдать за динамическим изменением спектрографа.

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

person MusiGenesis    schedule 03.03.2011
comment
@MusiGenesis От имени Gnubie: «То, что вы хотите сделать, может сработать, если вы хотите использовать эффект типа осциллографа для сравнения высоты тона (или частоты) WAV и голоса человека». верно. Я был бы рад, если бы вы разместили код здесь, чтобы я мог видеть и анализировать, как это работает. Большое спасибо. - person cnewbie; 04.03.2011
comment
Большое спасибо, MusiGenesis. Предположим, что и воспроизводимые, и записанные звуки представляют собой простые ноты, сыгранные на (музыкальной) клавиатуре; тогда было бы гораздо проще сравнивать задержки, чем, скажем, голосовые и музыкальные дорожки. Если не сложно, не могли бы вы опубликовать свое приложение на С#? Спасибо! - person Gnubie; 07.03.2011
comment
@Gnubie: я опубликую это сегодня вечером. Он не будет делать именно то, что вы хотите, но он будет содержать большинство примеров кода, которые вам нужны для этого, включая запись звука с помощью waveInOpen API и выполнение преобразования звука из временной области в частотную область на основе БПФ. . - person MusiGenesis; 07.03.2011
comment
Если это предназначено как комментарий к вопросу, опубликуйте его как комментарий к вопросу, а не как ответ. Если он предназначен в качестве комментария к ответу MusiGenesis, разместите его там. Спасибо! - person Timwi; 10.03.2011
comment
@Timwi: Для этого ему нужно 50 баллов... И это своего рода дополнительный ответ. - person Henk Holterman; 10.03.2011

библиотека NAudio имеет множество функций, которые (возможно) дадут вам то, что вам нужно. Я использовал его в прошлом для некоторых простых операций, но он намного мощнее, чем мне приходилось использовать.

person ZombieSheep    schedule 03.03.2011
comment
Спасибо, как вы написали, NAudio очень мощный и, следовательно, очень сложный. Я надеялся на более простое решение. - person Gnubie; 07.03.2011

@ZombieSheep Naudio действительно полезен, но имеет ограничения. Например, нет особого контроля над отображением сигнала, его нельзя очистить и перерисовать заново. Кроме того, если он становится слишком длинным, невозможно прокрутить назад, чтобы увидеть форму волны в передней части. Еще один момент, это то, что он работает только с воспроизведением звука, но не работает с записью звука. Спасибо.

person cnewbie    schedule 04.03.2011