Как реализовать волны голосовых сообщений для визуализации?
я хочу реализовать волны голосовых сообщений для визуализации. Я не понимаю как это вообще делается. То есть как определить высоту волны.
Как я сделал: У меня всего этих делений волн должно быть 35. Я сделал из звука list с байтами, далее сгруппировал их на 35 групп и нашёл у группы среднее число и это среднее число я сделал высотой, но это не работает (то есть неправильная высота даётся).
Ответы (2 шт):
В первую очередь, вам нужно из файла со звуком выудить значения амплитуд, то есть, построить ваш list с байтами правильно.
Важно понимать, что такие форматы как ogg, mp3, и так далее, которые пересылаются в большинстве мессенджеров - находятся в сильно сжатом виде и должны быть сначала декодированы, чтобы получить значения амплитуд. Именно значения амплитуды определяют высоту столбиков на диаграме.
И еще один вопрос - как, имея массив с амплитудами (который после декодирования "в лоб" может оказаться огромным - 5 минут аудио в режиме стерео на 44 кГц - это примерно 40 мегабайт) усреднить его, чтобы нарисовать картинку.
Здесь нужно применить два метода:
- вычисление RMS - среднеквадратического отклонения - взять несколько значений амплитуды подряд и подставить в формулу из Википедии.
- перевод в логарифмическую шкалу - от полученного значения RMS нужно взять логарифм по основанию 10. Это нужно для того, чтобы учесть психоакустические особенности слуха.
Совсем "умные" шкалы громкости также учитывают множество других фактов из психоакустики и выдают еще более "достоверный" результат, но для вашей задачи он будет излишним.
Также может быть полезным построение статистической гистограммы амплитуд - маловероятно, что голосовое сообщение записано аудиоинженером на профессиональный микрофон (вероятно как раз обратное - пишут на бутерброд с сервелатом, а говорят в противоположную от микрофона сторону).
Гистограмма позволит прогнать что-то вроде нормализации, что позволит исключить неинформативные картинки - горизонтальную линию (писали, отвернув голову от микрофона) и наоборот - забор из пиков (орали прямо в микрофон, держа смарт "по купечески", торцом к роту)
Если значение амплитуды задаёте подсчетом среднего арифметического целой группы байт, то зачем тогда каждый байт по отдельности, как думаете? Эти группы скорее всего так называемые чанки. (то же, что и группы семплов), а каждый семпл (то же, что и значение амплитуды) может состоять из одного, двух или трёх байт. (это указывают в заголовке аудиофайла любого стандартного формата) Вот на это число и нужно делить скорее всего.
В общем, вопрос нужно конкретизировать (как всегда пишут те, кто закрывают вопросы) Иначе трудновато понять ситуацию.