Как реализовать волны голосовых сообщений для визуализации?

я хочу реализовать волны голосовых сообщений для визуализации. Я не понимаю как это вообще делается. То есть как определить высоту волны.

Как я сделал: У меня всего этих делений волн должно быть 35. Я сделал из звука list с байтами, далее сгруппировал их на 35 групп и нашёл у группы среднее число и это среднее число я сделал высотой, но это не работает (то есть неправильная высота даётся).


Ответы (2 шт):

Автор решения: gbg

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

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

И еще один вопрос - как, имея массив с амплитудами (который после декодирования "в лоб" может оказаться огромным - 5 минут аудио в режиме стерео на 44 кГц - это примерно 40 мегабайт) усреднить его, чтобы нарисовать картинку.

Здесь нужно применить два метода:

  • вычисление RMS - среднеквадратического отклонения - взять несколько значений амплитуды подряд и подставить в формулу из Википедии.
  • перевод в логарифмическую шкалу - от полученного значения RMS нужно взять логарифм по основанию 10. Это нужно для того, чтобы учесть психоакустические особенности слуха.

Совсем "умные" шкалы громкости также учитывают множество других фактов из психоакустики и выдают еще более "достоверный" результат, но для вашей задачи он будет излишним.

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

Гистограмма позволит прогнать что-то вроде нормализации, что позволит исключить неинформативные картинки - горизонтальную линию (писали, отвернув голову от микрофона) и наоборот - забор из пиков (орали прямо в микрофон, держа смарт "по купечески", торцом к роту)

→ Ссылка
Автор решения: Опан

Если значение амплитуды задаёте подсчетом среднего арифметического целой группы байт, то зачем тогда каждый байт по отдельности, как думаете? Эти группы скорее всего так называемые чанки. (то же, что и группы семплов), а каждый семпл (то же, что и значение амплитуды) может состоять из одного, двух или трёх байт. (это указывают в заголовке аудиофайла любого стандартного формата) Вот на это число и нужно делить скорее всего.

В общем, вопрос нужно конкретизировать (как всегда пишут те, кто закрывают вопросы) Иначе трудновато понять ситуацию.

→ Ссылка