Как зайти в Даркнет?!
25th January, 01:11
6
0
Как в tkinter из поля ввода Entry получить значение в одну переменную и обновить строку кнопкой, затем получить ещё одно введённое значение и затем сложить их. Ниже пример кода
21st July, 19:00
895
0
Программа, которая создает фейковые сервера в поиске игровых серверов CS 1.6 Steam
21st March, 17:43
948
0
Очень долго работает Update запрос Oracle
27th January, 09:58
914
0
не могу запустить сервер на tomcat HTTP Status 404 – Not Found
21st January, 18:02
906
0
Где можно найти фрилансера для выполнения поступающих задач, на постоянной основе?
2nd December, 09:48
938
0
Разработка мобильной кроссплатформенной военной игры
16th July, 17:57
1724
0
период по дням
25th October, 10:44
3955
0
Пишу скрипты для BAS только на запросах
16th September, 02:42
3720
0
Некорректный скрипт для закрытия блока
14th April, 18:33
4613
0
прокидывать exception в блоках try-catch JAVA
11th March, 21:11
4381
0
Помогите пожалуйста решить задачи
24th November, 23:53
6086
0
Не понимаю почему не открывается детальное описание продукта
11th November, 11:51
4351
0
Нужно решить задачу по программированию на массивы
27th October, 18:01
4396
0
Метода Крамера С++
23rd October, 11:55
4309
0
помогите решить задачу на C++
22nd October, 17:31
4002
0
Помогите решить задачу на python с codeforces
22nd October, 11:11
4492
0
Python с нуля: полное руководство для начинающих
18th June, 13:58
2599
0
Обнаружение звуковой тишины в WAV файлах с помощью C#
Мне поручено создать клиентское приложение .NET для обнаружения тишины в файлах WAV.
Возможно ли это с помощью встроенного Windows APIs? Или, с другой стороны, есть ли хорошие библиотеки, чтобы помочь с этим?
Анализ звука-это сложная вещь, требующая много сложной математики (подумайте о преобразованиях Фурье). Вопрос, который вы должны задать, - это "what is silence". Если звук, который вы пытаетесь отредактировать, записан из аналогового источника, скорее всего, нет никакой тишины... они будут только областями мягкого шума (линейный гул, окружающий фоновый шум и т. д.).
Все это говорит о том, что алгоритм, который должен работать, должен был бы определить минимальный порог объема (амплитуды) и длительность (скажем, <10dbA для более чем 2 секунд), а затем просто сделать анализ объема сигнала, ища области, которые соответствуют этому критерию (возможно, с некоторыми фильтрами для миллисекундных всплесков). Я никогда не писал этого в C#,, но эта статья CodeProject выглядит интересно; она описывает код C# для рисования формы волны... это тот же самый код, который можно было бы использовать для другого анализа амплитуды.
http://www.codeproject.com/Articles/19590/WAVE-File-Processor-in-C
Здесь есть весь код, необходимый для того, чтобы раздеть silence и смешать wave-файлы.
Наслаждаться.
Если вы хотите эффективно рассчитать среднюю мощность по скользящему окну: квадратите каждый образец, а затем добавьте его к текущему итогу. Вычтите квадратное значение из N предыдущих выборок. Затем переходите к следующему шагу. Это самая простая форма CIC -фильтра. Теорема парсеваля говорит нам, что этот расчет мощности применим как к временной, так и к частотной области.
Кроме того, вы можете добавить гистерезис в систему, чтобы избежать быстрого переключения on&off, когда уровень мощности танцует около порогового уровня.
Я использую NAudio, и я хотел бы обнаружить тишину в аудиофайлах, чтобы я мог либо сообщить, либо усечь.
После долгих исследований я придумал эту базовую реализацию. Итак, я написал метод расширения для класса AudioFileReader , который возвращает длительность молчания в начале / конце файла или начиная с определенной позиции.
Здесь:
static class AudioFileReaderExt
{
public enum SilenceLocation { Start, End }
private static bool IsSilence(float amplitude, sbyte threshold)
{
double dB = 20 * Math.Log10(Math.Abs(amplitude));
return dB < threshold;
}
public static TimeSpan GetSilenceDuration(this AudioFileReader reader,
SilenceLocation location,
sbyte silenceThreshold = -40)
{
int counter = 0;
bool volumeFound = false;
bool eof = false;
long oldPosition = reader.Position;
var buffer = new float[reader.WaveFormat.SampleRate * 4];
while (!volumeFound && !eof)
{
int samplesRead = reader.Read(buffer, 0, buffer.Length);
if (samplesRead == 0)
eof = true;
for (int n = 0; n < samplesRead; n++)
{
if (IsSilence(buffer[n], silenceThreshold))
{
counter++;
}
else
{
if (location == SilenceLocation.Start)
{
volumeFound = true;
break;
}
else if (location == SilenceLocation.End)
{
counter = 0;
}
}
}
}
// reset position
reader.Position = oldPosition;
double silenceSamples = (double)counter / reader.WaveFormat.Channels;
double silenceDuration = (silenceSamples / reader.WaveFormat.SampleRate) * 1000;
return TimeSpan.FromMilliseconds(silenceDuration);
}
}
Это позволит принимать практически любой формат аудиофайлов, а не только WAV .
Использование:
using (AudioFileReader reader = new AudioFileReader(filePath))
{
TimeSpan duration = reader.GetSilenceDuration(AudioFileReaderExt.SilenceLocation.Start);
Console.WriteLine(duration.TotalMilliseconds);
}
Рекомендации:
Я не думаю, что вы найдете какой-либо встроенный APIs для обнаружения тишины. Но вы всегда можете использовать хорошую старую математику / дискретную обработку сигнала, чтобы узнать громкость. Вот небольшой пример: http://msdn.microsoft.com/en-us/magazine/cc163341.aspx
См. код ниже от обнаружения звуковой тишины в файлах WAV с помощью C#
private static void SkipSilent(string fileName, short silentLevel)
{
WaveReader wr = new WaveReader(File.OpenRead(fileName));
IntPtr format = wr.ReadFormat();
WaveWriter ww = new WaveWriter(File.Create(fileName + ".wav"),
AudioCompressionManager.FormatBytes(format));
int i = 0;
while (true)
{
byte[] data = wr.ReadData(i, 1);
if (data.Length == 0)
{
break;
}
if (!AudioCompressionManager.CheckSilent(format, data, silentLevel))
{
ww.WriteData(data);
}
}
ww.Close();
wr.Close();
}