Обучение — Наглая просьба о помощи с WAV-файлом


Как устроен WAV файл. Запись сэмплов

Когда я сделал программу Пианола — пианино на клавишах компьютера, с запоминанием музыки в мнемонической форме в обычных текстовых файлах, передо мной встала задача перевода музыки в стандартный звуковой формат. Конечно, проще всего проиграть музыку через программу, в которой она и создавалась, и записать звучание её через микрофон на подходящее устройство. Я так и делал — записывал звук с колонок компьютера на электронную книгу-планшетик, используя встроенный микрофон. Получались WAV файлы.
Естественный вопрос — как обойти этот достаточно хлопотливый и вносящий помехи процесс, нельзя ли направить музыку непосредственно в WAV файл? А если это можно, то нельзя ли при этом заменить звук оператора SOUND ( не скажу, что он плохой, но достаточно пищащий) на более благородный звук, звук рояля, например?

Тут имеются 2 пути.
Первый путь. Модифицировать программу Пианола. Сделать так, чтобы звук указанной частоты и длительности не только обрабатывался оператором SOUND F,L но и вызывал запись в WAV файл отрезков сэмплов подходящей длины, взятых из подготовленной для этого библиотеки. Этот процесс проходит достаточно быстро, если вставлять сэмплы большими группами (до 32 кбайт — допустимая длина символьной переменной в Турбо бейсике). Однако мы не сможем смешивать в нём звук, создавая аккорды, если не перейдём от больших групп сэмплов к сэмплам индивидуальным. А это замедляет процесс существенно — в сравнении с просто проигрыванием, в 7 раз (забегая вперёд, скажу, что нашёл и третий, комбинированный путь — http://www.proza.ru/2015/05/09/707 )
Второй путь, более перспективный. Создать отдельную программу по переводу мнемонической нотной записи из текстового файла в WAV файл. Включили её, и пусть она работает, создавая музыку, хоть полчаса. А мы будем заниматься на копме другими делами.
Итак, программа смотрит на ноты и пишет в WAV файл музыку.

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

Итак, WAV файл. Состоит из шапки или головной части «head» — от нулевого байта до байта номер 43 включительно (всего 44 байта), и области данных «DATA» — от байта номер 44 и до конца файла.

Местоположение Описание
0..3 (4 байта) содержит символы “RIFF” в ASCII кодировке.
4..7 (4 байта) это = длина файла – 8
8..11 (4 байта) содержит символы “WAVE”
12..15 (4 байта) содержит символы “fmt “
16..19 (4 байта) 16 для формата PCM (не надо знать, что это такое)
20..21 (2 байта) аудио формат, для PCM = 1 (то есть, Линейное квантование). Значения, отличающиеся от 1, обозначают некоторый формат сжатия.
22..23 (2 байта) количество каналов. Моно = 1, Стерео = 2 и т.д.
24..27 (4 байта) частота дискретизации. 44100 Гц или 32000 Гц = 32 сэмпла / мсек
28..31 (4 байта) число байт, переданных за сек воспроизведения
32..33 (2 байта) количество байт для одного сэмпла, включая все каналы.
34..35 (2 байта) количество бит в сэмпле, “глубина” или точность звучания. 8 , 16 бит и т.д.
36..39 (4 байта) содержит символы “data”
40..43 (4 байта) количество байт в области данных = длина файла-44

Свежее замечание. А КАК ОБСТОЯТ ДЕЛА В ВИЗУАЛ БЕЙСИКЕ?

В среде VB6 шапку WAV файла для стереозвука со скоростью раздачи 44100 сэмпл/сек можно записать в файл «T.wav» следующим образом:
‘___________________________

Dim Header(10) As Long

fName = «T.wav»
Open fName For Binary As #1
Seek #1, 1
Header(0) = 1179011410
Header(1) = Lof(1) — 36 ‘NextSise
Header(2) = 1163280727
Header(3) = 544501094
Header(4) = 16
Header(5) = 131073
Header(6) = 44100 ‘= VEL (скорость раздачи)
Header(7) = 44100 * 4 ‘= VEL * 4
Header(8) = 1048580
Header(9) = 1635017060
Header(10) = Lof(1) — 44 ‘DataSize
Put #1, , Header()
Close #1

Обращаю внимание, что оператор Seek #1,1 в Визуал Бейсике укажет на начальный байт файла,
а в Турбо Бейсике на этот же первый байт нужно указать так — Seek #1,0
В настоящее время для работы с WAV файлами создана удобная утилита, объединяющая все наработки в Турбо бейсике.
Утилита называется WAV_манипулятор, о ней рассказывается тут — http://www.proza.ru/2020/10/20/1279
для экспериментов с WAV файлами рекомендую использовать именно её. По ссылке можно найти указание на исходники этой программы в Визуал бейсике.

ВЕРНЁМСЯ К ТУРБО БЕЙСИКУ

Теперь обратимся к практике. Сделаем звук и запишем его в WAV файл.
Эта (см. ниже) программа на Турбо бейсике поможет вам понять как всё работает. Не будем пока писать музыку, но будем создавать звуковые сэмплы для звука заданной частоты.
Вы запускаете эту программу и оператор INPUT выводит на экран знак вопроса, спрашивая Вас, что делать? Хотите выйти из программы (exit) — печатаете «e» и Enter
Прежде всего нужно открыть файл (open) — вводите «or», откроется файл «r.wav»
Можете поэкспериментировать —
«l» покажет длину файла LOF и положение поинтера LOC
«s44» установит поинтер на 44-й байт файла
«p123» считает (от положения поинтера) в виде символов 123 байта в переменную S$
«g» запишет в файл (от положения поинтера) значение переменной S$

Но давайте записывать звук — напечатайте «w» и нажмите Enter. Мы попадаем на участок программы, в котором идет многократное обращение к функции, вычисляющей амплитуду звука для каждого семпла — FNSS2(260.74,1). В программе записывается два звука — звук с частотой 260.74 Гц ( До первой октавы), определяемый, по тембру и особенностям звучания, параметрами таблицы под номером 1, и следом — второй звук, звук чистой синусоиды той же частоты для сравнения (таблица параметров 0). Перед началом записи звуков функция FNSS2, их создающая, устанавливает по умолчанию свои внутренние переменные, это происходит при обращении к ней с F=0.

10 INPUT A$
SELECT CASE MID$(A$,1,1)
CASE «e»
STOP
CASE «o»
A1$=A$ : IF LEN(A1$)=2 THEN A1$=MID$(A1$,2)+».wav»
OPEN «B»,#1,A1$ : GOTO 10
CASE «c»
CLOSE #1 : GOTO 10
CASE «l»
PRINT LOF(1),LOC(1) : GOTO 10
CASE «s»
SEEK #1,VAL(MID$(A$,2)) : GOTO 10
CASE «p»
PUT$ #1,MID$(A$,2) : GOTO 10
CASE «g»
GET$ #1,VAL(MID$(A$,2)),S$
PRINT S$,»loc=»;LOC(1) : GOTO 10
CASE «h» ‘put the head of wav file
GOSUB 100 : GOTO 10
CASE «w» ‘make wav sound
SEEK #1,44
VEL=32000 : A=FNSS2(0,0)
FOR I=1 TO 80000 : M%=INT(8000*FNSS2(260.74,1)) : PUT$ #1,MKI$(M%) : NEXT I
FOR I=1 TO 40000 : M%=INT(8000*FNSS2(260.74,0)) : PUT$ #1,MKI$(M%) : NEXT I
GOTO 10
END SELECT
‘====================
100 SEEK #1,0
L=LOF(1) : S$=»RIFF»+MKL$(L-4)+»WAVEfmt » : S0$=CHR$(0)
S$=S$+CHR$(16)+S0$+S0$+S0$ ‘ 16 bit/sempl
S$=S$+CHR$(1)+S0$+CHR$(1)+S0$ ‘ 1 — line format + 1 — mono
S$=S$+MKL$(32000)+MKL$(64000) ‘ 32 sempl/msek + 64 bite/mcek
S$=S$+CHR$(2)+S0$+CHR$(16)+S0$ ‘ 2 bite/sempl_all + 16 bit/sempl_mono
S$=S$+»data»+MKL$(L-44) ‘ date size
WHEAD$=S$ : PUT$ #1,WHEAD$
RETURN

После того, как записывающая звук функция отработала, и на экране появился знак вопроса, нужно ввести «h» и записать этим действием «head» WAV файла. Подпрограмму 100, записывающую «head», Вы видите чуть выше.
MKI$(. ) функция, переводящая целое число в его двухбайтовое символьное представление,
MKL$(. ) функция, переводящая вещественное число в его 4-х байтовое символьное представление. Эти функции есть в Турбо бейсике.
Затем нужно закрыть файл (close) — введите «c», и выйти из программы — введите «e».
Теперь можете экспериментировать — просматривать файл в редакторе и прослушивать его.

Конечно, интересно знать, как устроена делающая звук функция FNSS2(F,K).
О той, которую сделал я, хочу рассказать, и порассуждать о возможностях компьютерного моделирования звука, в следующей статье. А здесь приведу более простой пример.

DEF FNSS2( F,K)
STATIC FS,KS,A0,A1,A2,MA2,X,DX,D
LOCAL A,Z,ZZ

IF F=0 THEN ‘first setup
FS=F : KS=K
FNSS2=0 : EXIT DEF
END IF

IF NOT(F=FS AND K=KS) THEN
‘new frequency
FS=F : X=2 : DX=2*FS/VEL
‘new parameters
KS=K : A0=1 : A1=0 : A2=0 : MA2=0 : D=1 ‘параметры по умолчанию
SELECT CASE K
CASE 0 : A0=1 : A1=0 : A2=0 : D=1
CASE 1 : A0=0 : A1=1 : A2=0 : D=0.99
CASE 2 : A0=0 : A1=0 : A2=1 : MA2=1 : D=1
END SELECT
END IF

Как видно, начальное обращение к функции устанавливает параметры набора K=0, а следующее обращение с другой частотой или с другим K вызывает переустановку начальных условий и определение шага изменения фазы по формуле:
ШАГ = 2*(Частота звука)/(Частота дискретизации)


Переменная X, изменяемая при каждом обращении на шаг DX, всё время находится в интервале (0,2), что соответствует привычному нахождению фазы в интервале от 0 до 2*Пи.
Первый полупериод колебания программируется по формулам для -1 Y = (1 — Z^2) *3/4 + (1 — Z^2)^2 *1/4 — очень хорошее представление синусоиды
Y = (1 — Z^2)*(1-2.3*Z) — колебание с отрицательным выбросом в конце полупериода
Второй полупериод колебания программируется по этим же формулам, но проходится в противофазе по Z и знак A меняется на противоположный. Противофазное прохождение второго полупериода позволяет плавно «сшивать» выбросы между собой.

Набор параметров CASE 2, который вы можете видеть внутри функции, предназначен для генерирования короткого импульса. Имея такой импульс удобно изучать функцию ревеберации (я её сделал, но о ней речь пойдёт в дальнейшем).

Если некоторые формы импульса уже созданы случаями CASE, то совсем нетрудно создать и промежуточную форму, задав новое CASE с иными значениями начальных амплитуд A0, A1 и A2. Можно задать и различные D — параметры ослабления для каждой амплитуды. Таким образом, создавая различные случаи CASE, можно математическим путём варьировать как общую форму звукового колебания, так и изменять звук (тембр и громкость) в процессе его звучания.
Алгоритм, как мне представляется, достаточно эффективный. Рисунок над заголовком статьи демонстрирует это, на нём в окне редактора звука Wave Editor показаны последовательно — моделированный звук рояля, и, вслед за ним, просто синусоида.

Цукерберг рекомендует:  Тест по myTarget. Начальный уровень

Давайте сейчас немного пообсуждаем то, как представляются числа в файле формата WAV.
Они следуют друг за другом в байтах, каждый из которых может быть прочитан как символ.
Двухбайтовое число читается так —
если оно положительно, то код второго символа оказывается меньше чем 128. Тогда этот код умножается на 256 и к полученному числу прибавляется код первого символа.
если оно отрицательно, то код второго символа оказывается больше чем 127. Тогда из этого кода вычитается число 256, полученное отрицательное число умножается на 256, и к полученному отрицательному результату прибавляется (со знаком плюс!) код первого символа.
В стереозаписи двухбайтовые числа-амплитуды двух каналов перемежают друг друга.

Как восстановить битый Wav файл

Ситуаций в жизни, когда требуется восстановить битый wav-файл, может возникнуть в любое время великое множество.

В моем случае это было так: была видеосъемка свадьбы, на банкете присутствует диджей или звукооператор, или звукорежиссер, в моем случае был человек, отвечающий за микшерский пульт. Я всегда пишу звук с пульта (сумму) + пишу звук с микрофонов (чистый голос ведущего и поздравления гостей), для этого беру два записывающих рекордера zoom h1 и zoom h4n. Часто случается, что звук с пульта бывает перегруженным или с помехой, в этой ситуации появляется возможность взять звук с микрофонов и поиграться вручную с уровнями (вытащить тихие тосты, поздравления).

В общем, на этой свадьбе не удалось использовать «дублирующий» независимый дополнительный рекордер по независящим от меня обстоятельствам. Стали писать сумму с пульта с отдельного канала. Саунд-чек сделали заранее, уровни на пульте выставили и на zoom h1 выставили с запасом в 12 дб (на случай, если кто-то будет тихо говорить, а звукооператор будет эти тихие поздравления усиливать). Все. Включил запись и ушел снимать.

Периодически подбегал на банкете и мониторил запись. Вроде все нормально. Придя домой, слив весь материал, увидел, что один из кусков банкета (файл ZOOM0004 на картинке ниже длинной 2 часа и объемом 2 ГБ) записался криво, т.е. произошел какой-то сбой при записи и файл неудачно закрылся. Немного погуглив, наткнулся на программу Audacity, скачал торрент и приступил к делу.

Запустил программу, заходим в Файл-> импортировать-> звуковой файл без заголовка (RAW)

Выбираем нужный файл ZOOM0004

Затем указываем как на картинке параметры:
кодирование : «кодирование Signed 24 bit PCM»
битовый порядок: «Без Учета Битового порядка»
каналов: «2 а канала (стерео)»
начальное смещение: «32768» — это значение для zoom h1 я узнал при помощи другой программы Awave Studio, в конце статьи распишу об этом подробнее.
сколько импортировать: «100 %»
частота сэмплирования : «48 000» Гц
жмем кнопку «импортировать»

Когда все загрузилось, можно прослушать и приступать к сохранению в «рабочий файл» показано на картинке ниже как это сделать:

Называем файл » восстановленный файл» и заходим в «Параметры». Указываем все как на картинке ниже параметры сохранения. Конечно можно пожать в любой другой формат, но в моем случае нужен оригинальный формат для последующей работы со звуком.

файл сохранен, можно приступать к работе с «восстановленный файл».

Как узнать параметры битого файла

Для этого необходим рабочий файл с предположительно такими же настройками. Поскольку до файла рекордер нормально записал файл «ZOOM0002, то будем использовать его в качестве исходного образца.

Качаем программу Awave Studio (в ней тоже можно вытащить битый файл, однако в программе действует ограничение на длину файла около 500 мб, а у нас кусок 2000 мб) запускаем программу Awave Studio

жмем на наш файл как на картинке обведено красным

и смотрим параметры в закладках.


Вот так я узнал про значение 32768. Удачной работы, помните народная мудрость гласит «запас карман не дерет» — пишите звук на дублирующее устройство, чтоб не пришлось вот так восстанавливать.

Запись звука напрямую в WAV файл с помощью bass.dll

Ни для кого не секрет, что библиотека bass.dll может не только воспроизводить, но и записывать звук.

Единственная проблема, запись возможна только в поток. Например, TMemoryStream, как в демонстрационном примере RecordTest из комплекта поставки.

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

Эта задача сама по себе не представляет особой сложности. Дело в том, что предлагаемый в примере TMemoryStream имеет метод SaveToFile, который сохраняет в файл его содержимое.

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

Работа с Wav файлом

Пишу курсовую. Надо получить спект Wav файла. Прочитал достаточно статей и форумов. В общем оформил шапку и вытащил параметры.

Для того, что бы получить спектр нужно применить преобразование Фурье, но для этого нужны данные.
тут у меня и возникли вопросы.
И как я понимаю сами данные Wav файла находятся после шапки.

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

нашел вот это (0x00,0x01),(0x22,0x43),(0x74,0x15),(0x74,0x65). — 16 бит моно

что касается самого wav файла, работаю с 44100Гц 1 канал 2 байта

09.07.2014, 11:57

работа с файлом
Помогите! Как написать программу которая открывает уже сеществующий файл и считывает из него.

Работа с текстовым файлом
Задание: «Удалить все четные числа из текстового файла» Предварительно я загрузила текстовый.

Работа с текстовым файлом
Поставлена задача находить ссылки на страницы из загруженной страницы HTML. ее получаю благодаря.

Работа с текстовым файлом
В первом Memo1 в один столбик записаны значения координат X. Во втором Memo2 — значения координат.

Работа с bat-файлом
Подскажите, вот создаю батник: FileCreate(«C:\\dd.bat»); Как открыть этот батник и добавить туда.

09.07.2014, 13:45 2

Myha_fly, так у вас все известно:
Количество байт в области данных и bitsPerSample.
Количество байт на все данные вы знаете, сколько бит на «одну единицу данных» (сэмпл) тоже знаете. Выбираете нужный тип данных и читаете. Все.


Добавлено через 17 секунд
Ну и число каналов тоже знаете.

09.07.2014, 14:43 [ТС] 3 09.07.2014, 15:02 4
09.07.2014, 15:02
09.07.2014, 15:58 5

Общее число требуемых для создания массивов, по одному на каждый канал, равняется NumChannels. Соответственно для моноканала потребуется создать только один массив, для стереоканала — два, и так далее.
Subchunk2Size это общий размер всех-всех данных. Соответственно поделив это число на количество каналов узнаем сколько элементов должен содержать массив. Умножив это количество на размер одного элемента (BitPerSample) получим требуемый размер памяти под массив.

Сразу после шапки, каждый блок данных (размером BlockAlign) содержит строго по очереди одинаковые элементы каждого канала — то есть в первом блоке будет расположен первый элемент (chunk) первого канала, затем первый элемент второго канала. Во втором блоке данных — сначала второй элемент первого канала, затем второй элемент второго канала. И так далее. Для четырехканальной записи, каждый блок будет содержать ровно четыре значения. Для моноканала, соответственно, каждый блок данных будет размером с один элемент канала, то есть равен выбранной глубине звука.

Facebook опубликовала исходники системы распознавания речи wav2letter

Команда исследователей из Facebook AI Research (FAIR) опубликовала на GitHub исходный код собственной системы распознавания речи, wav2letter. Он состоит из модулей к библиотеке глубинного машинного обучения Torch, написанных на языке Lua. Для обработки звука подключается библиотека Libsndfile, а для цифровой обработки сигналов – FFTW. Система работает на базе свёрточной нейронной сети.

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

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

Проверка wav2letter на тестовом наборе LibriSpeech показала уровень ошибок 4,8% для чистой речи и 14,5% для запутанной. По сравнению с этим человек допускает 5,83% ошибок, Mozilla Voice – 6,5%, Google Speech – 6,64%, а Apple Dictation – 14,24%.

Тревожные звуки скачать и слушать онлайн

[174,2 Kb] (cкачиваний: 6237). Тип файла: mp3.

Настороженный звук, будьте бдительны

[157,13 Kb] (cкачиваний: 3225). Тип файла: mp3.

Звук включенной тревожной кнопки

[451,07 Kb] (cкачиваний: 1593). Тип файла: mp3.

Тревожный звук сирены, началась война или ЧП

[870,45 Kb] (cкачиваний: 3544). Тип файла: mp3.


Классический звук тревожности, спалился

[246,73 Kb] (cкачиваний: 4318). Тип файла: mp3.

Музыка из фильма ужасов

[2,41 Mb] (cкачиваний: 4087). Тип файла: mp3.

Звук начала войны (воздушная тревога)

[861,22 Kb] (cкачиваний: 1377). Тип файла: mp3.

Звуки эвакуации в здании или обнаружена радиация (покиньте помещение)

[548,29 Kb] (cкачиваний: 1709). Тип файла: mp3.

Звук предупреждающий о предстоящей тревоге

[87,17 Kb] (cкачиваний: 913). Тип файла: mp3.

Звук: на корабле случилось несчастье (тревога на судне)

[586,23 Kb] (cкачиваний: 2859). Тип файла: mp3.

Звук пожарной сигнализации

[656,08 Kb] (cкачиваний: 838). Тип файла: mp3.

Слова диктора о том, что началась тревога (оповещение)

[804,08 Kb] (cкачиваний: 615). Тип файла: mp3.

Звуки сигнала тревоги на подводной лодке

[162,49 Kb] (cкачиваний: 709). Тип файла: mp3.

Звуки паники людей

[417,17 Kb] (cкачиваний: 990). Тип файла: mp3.

Звуки, где происходит сцена убийства в доме с дыханием киллера


Структура WAV файла

Представляем вашему вниманию статью с подробным разбором заголовка WAV-файла и его структуры.

Теория

Итак, рассмотрим самый обычный WAV файл (Windows PCM). Он представляет собой две, четко делящиеся, области. Одна из них — заголовок файла, другая — область данных. В заголовке файла хранится информация о:

  • Размере файла.
  • Количестве каналов.
  • Частоте дискретизации.
  • Количестве бит в сэмпле (эту величину ещё называют глубиной звучания).

Но для большего понимания смысла величин в заголовке следует ещё рассказать об области данных и оцифровке звука. Звук состоит из колебаний, которые при оцифровке приобретают ступенчатый вид. Этот вид обусловлен тем, что компьютер может воспроизводить в любой короткий промежуток времени звук определенной амплитуды (громкости) и этот короткий момент далеко не бесконечно короткий. Продолжительность этого промежутка и определяет частота дискретизации. Например, у нас файл с частотой дискретизации 44.1 kHz, это значит, что тот короткий промежуток времени равен 1/44100 секунды (следует из размерности величины Гц = 1/с). Современные звуковые карты поддерживают частоту дискретизации до 192 kHz. Так, со временем разобрались.

Амплитуда и сэмплы

Теперь, что касается амплитуды (громкости звука в коротком промежутке времени). Амплитуда выражается числом, которое занимает в файле 8, 16, 24, 32 бита (теоретически можно и больше). От точности амплитуды, я бы сказал, зависит точность звука. Как известно, 8 бит = 1 байту, следовательно, одно значение амплитуды в какой-то короткий промежуток времени в файле занимает 1, 2, 3, 4 байта соответственно. Таким образом, чем больше число занимает места в файле, тем шире возможный диапазон значений для этого числа, а значит и больше точность амплитуды.

Для PCM-файлов точность (или разрядность) может быть следующей:

  • 1 байт / 8 бит — -128…127
  • 2 байта / 16 бит — -32 760…32 760
  • 3 байта / 24 бита — -1…1 (с плавающей точкой)
  • 4 байта / 32 бита — -1…1 (с плавающей точкой)

Но список возможных разрядностей на самом деле весьма шире, здесь представлены лишь наиболее популярные.

Совокупность амплитуды и короткого промежутка времени носит название сэмпл.

Заголовок

Итак, давайте рассмотрим первую часть WAV-файла подробнее. Следующая таблица наглядно показывает структуру заголовка:

Местоположение Поле Описание
0…3 (4 байта) chunkId Содержит символы «RIFF» в ASCII кодировке 0x52494646 . Является началом RIFF-цепочки.
4…7 (4 байта) chunkSize Это оставшийся размер цепочки, начиная с этой позиции. Иначе говоря, это размер файла минус 8, то есть, исключены поля chunkId и chunkSize.
8…11 (4 байта) format Содержит символы «WAVE» 0x57415645
12…15 (4 байта) subchunk1Id Содержит символы «fmt » 0x666d7420
16…19 (4 байта) subchunk1Size 16 для формата PCM. Это оставшийся размер подцепочки, начиная с этой позиции.
20…21 (2 байта) audioFormat Аудио формат, список допустипых форматов. Для PCM = 1 (то есть, Линейное квантование). Значения, отличающиеся от 1, обозначают некоторый формат сжатия.
22…23 (2 байта) numChannels Количество каналов. Моно = 1, Стерео = 2 и т.д.
24…27 (4 байта) sampleRate Частота дискретизации. 8000 Гц, 44100 Гц и т.д.
28…31 (4 байта) byteRate Количество байт, переданных за секунду воспроизведения.
32…33 (2 байта) blockAlign Количество байт для одного сэмпла, включая все каналы.
34…35 (2 байта) bitsPerSample Количество бит в сэмпле. Так называемая «глубина» или точность звучания. 8 бит, 16 бит и т.д.
36…39 (4 байта) subchunk2Id Содержит символы «data» 0x64617461
40…43 (4 байта) subchunk2Size Количество байт в области данных.
44… data Непосредственно WAV-данные.

Вот и весь заголовок, длина которого составляет 44 байта.

Подводные камни

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


В chunkSize лежит заведомо слишком большое значение. Такое происходит, когда вы пытаетесь читать данные в режиме стриминга. Например, декодер LAME при выводе результата декодирования в STDOUT в этом поле возвращает значение 0x7FFFFFFF + 44 — 8 , а в subchunk2Size — 0x7FFFFFFF (что равно максимальному значению 32-разрядного знакового целочисленного значения). Это объясняется тем, что декодер в таком режиме выдаёт результат не целиком, а небольшими наборами данных и не может заранее определить итоговый размер данных.

Подцепочек может быть больше, чем две, например, при попытке декодировать аудио универсальным декодером ffmpeg 4.1.3 ffmpeg -i example.mp3 -f wav example.wav в декодированном файле помимо рассмотренных подцепочек fmt и data будет содержаться ещё одна LIST перед областью данных. Таким образом, когда вам понадобится добраться до данных, вам потребуется пропустить ненужные подцепочки, пока не встретится data . Это будет сделать не слишком сложно, так как можно читать >data , то пропускать данные, основываясь на её размере.

Блок данных

В моно варианте значения амплитуды расположены последовательно. В стерео же, например, сначала идет значение амплитуды для левого канала, затем для правого, затем снова для левого и так далее.

Заметка о типах данных

При чтении заголовка можно применять разные типы данных. Например, в Си (MSVS) вместо массива char[4] можно использовать __int32 или DWORD , но тогда сравнение с какой-либо строковой константой, к примеру может оказаться не очень удобным. Также хотелось бы предостеречь вас на тему 64-битных операционных систем. А именно: всегда стоит помнить, что в языке Си тип переменной int в 64-битной системе будет иметь длину 8 байт, а в 32-битной — 4 байта. В таких случаях можно воспользоваться вышеупомянутым типом переменной __int32 или __int64 , в зависимости от того, какой размер переменной в памяти Вам необходим. Существуют типы __int8 , __int16 , __int32 и __int64 , они доступны только для MSVC++ компилятора как минимум 7-й версии (Microsoft Visual Studio 2003.NET), но зато Вы не ошибетесь с выбором размера типа данных.

Как мы восстанавливали поврежденный .wav файл

Был интересный опыт, когда с другом восстанавливали .wav файл. Я решил описать наш мучительный процесс, вдруг кому-то пригодится.

Предыстория

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

Пытаемся разобраться

Так как открыть файл у нас не получилось, решили по гуглить. Мы хотели понять, как скормить .wav файл проигрывателю. Нашли кучу советов: загрузить его в Raw(сыром формате), поиграться с настройками и т.д. Все эти попытки потерпели фиаско.

Решили изучить, что такое вообще wav, нашли инфу про заголовки и их описание:

Устанавливаем хекс редактор (wxHexEditor), открываем и пытаемся хоть что-то найти похожее на заголовок.

Провал… их не было.

Решили записать новую запись с удачным сохранением. Открыли его в редакторе и смотрим заголовки.

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

Перед тем как что-то построить, нужно что-то сломать.

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

Рисунок: сверху склеенный БФ, внизу нормальная запись.


Оказалось что, если удалить в хексРедаторе 1 байт в нормальном файле и сохранить, картина становится похожей. А если вернуть байт, даже пустой забитый нулями, то все становится нормально.

Написание баш скрипта

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

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

Запускаем скрипт и с трепетом, на краешке стульчика, ждем результат. К сожалению, нам пришлось просматривать эти файлы вручную, но как лучше сделать по другому мы не знали. Закидывали по 250 файлов в audacity и просматривали дорожки:

Скроллить пришлось недолго, потому что на 537 файле мы нашли, то что искали:

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

Скорее всего, это можно было сделать проще. Кто знает, как облегчить работу или как-то ее оптимизировать, пишите, добавлю в этот «гайд».

Структура WAV файла

Представляем вашему вниманию статью с подробным разбором заголовка WAV-файла и его структуры.

Теория

Итак, рассмотрим самый обычный WAV файл (Windows PCM). Он представляет собой две, четко делящиеся, области. Одна из них — заголовок файла, другая — область данных. В заголовке файла хранится информация о:

  • Размере файла.
  • Количестве каналов.
  • Частоте дискретизации.
  • Количестве бит в сэмпле (эту величину ещё называют глубиной звучания).

Но для большего понимания смысла величин в заголовке следует ещё рассказать об области данных и оцифровке звука. Звук состоит из колебаний, которые при оцифровке приобретают ступенчатый вид. Этот вид обусловлен тем, что компьютер может воспроизводить в любой короткий промежуток времени звук определенной амплитуды (громкости) и этот короткий момент далеко не бесконечно короткий. Продолжительность этого промежутка и определяет частота дискретизации. Например, у нас файл с частотой дискретизации 44.1 kHz, это значит, что тот короткий промежуток времени равен 1/44100 секунды (следует из размерности величины Гц = 1/с). Современные звуковые карты поддерживают частоту дискретизации до 192 kHz. Так, со временем разобрались.

Амплитуда и сэмплы

Теперь, что касается амплитуды (громкости звука в коротком промежутке времени). Амплитуда выражается числом, которое занимает в файле 8, 16, 24, 32 бита (теоретически можно и больше). От точности амплитуды, я бы сказал, зависит точность звука. Как известно, 8 бит = 1 байту, следовательно, одно значение амплитуды в какой-то короткий промежуток времени в файле занимает 1, 2, 3, 4 байта соответственно. Таким образом, чем больше число занимает места в файле, тем шире возможный диапазон значений для этого числа, а значит и больше точность амплитуды.

Для PCM-файлов точность (или разрядность) может быть следующей:

  • 1 байт / 8 бит — -128…127
  • 2 байта / 16 бит — -32 760…32 760
  • 3 байта / 24 бита — -1…1 (с плавающей точкой)
  • 4 байта / 32 бита — -1…1 (с плавающей точкой)

Но список возможных разрядностей на самом деле весьма шире, здесь представлены лишь наиболее популярные.


Совокупность амплитуды и короткого промежутка времени носит название сэмпл.

Заголовок

Итак, давайте рассмотрим первую часть WAV-файла подробнее. Следующая таблица наглядно показывает структуру заголовка:

Местоположение Поле Описание
0…3 (4 байта) chunkId Содержит символы «RIFF» в ASCII кодировке 0x52494646 . Является началом RIFF-цепочки.
4…7 (4 байта) chunkSize Это оставшийся размер цепочки, начиная с этой позиции. Иначе говоря, это размер файла минус 8, то есть, исключены поля chunkId и chunkSize.
8…11 (4 байта) format Содержит символы «WAVE» 0x57415645
12…15 (4 байта) subchunk1Id Содержит символы «fmt » 0x666d7420
16…19 (4 байта) subchunk1Size 16 для формата PCM. Это оставшийся размер подцепочки, начиная с этой позиции.
20…21 (2 байта) audioFormat Аудио формат, список допустипых форматов. Для PCM = 1 (то есть, Линейное квантование). Значения, отличающиеся от 1, обозначают некоторый формат сжатия.
22…23 (2 байта) numChannels Количество каналов. Моно = 1, Стерео = 2 и т.д.
24…27 (4 байта) sampleRate Частота дискретизации. 8000 Гц, 44100 Гц и т.д.
28…31 (4 байта) byteRate Количество байт, переданных за секунду воспроизведения.
32…33 (2 байта) blockAlign Количество байт для одного сэмпла, включая все каналы.
34…35 (2 байта) bitsPerSample Количество бит в сэмпле. Так называемая «глубина» или точность звучания. 8 бит, 16 бит и т.д.
36…39 (4 байта) subchunk2Id Содержит символы «data» 0x64617461
40…43 (4 байта) subchunk2Size Количество байт в области данных.
44… data Непосредственно WAV-данные.

Вот и весь заголовок, длина которого составляет 44 байта.

Подводные камни

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

В chunkSize лежит заведомо слишком большое значение. Такое происходит, когда вы пытаетесь читать данные в режиме стриминга. Например, декодер LAME при выводе результата декодирования в STDOUT в этом поле возвращает значение 0x7FFFFFFF + 44 — 8 , а в subchunk2Size — 0x7FFFFFFF (что равно максимальному значению 32-разрядного знакового целочисленного значения). Это объясняется тем, что декодер в таком режиме выдаёт результат не целиком, а небольшими наборами данных и не может заранее определить итоговый размер данных.

Подцепочек может быть больше, чем две, например, при попытке декодировать аудио универсальным декодером ffmpeg 4.1.3 ffmpeg -i example.mp3 -f wav example.wav в декодированном файле помимо рассмотренных подцепочек fmt и data будет содержаться ещё одна LIST перед областью данных. Таким образом, когда вам понадобится добраться до данных, вам потребуется пропустить ненужные подцепочки, пока не встретится data . Это будет сделать не слишком сложно, так как можно читать >data , то пропускать данные, основываясь на её размере.

Блок данных

В моно варианте значения амплитуды расположены последовательно. В стерео же, например, сначала идет значение амплитуды для левого канала, затем для правого, затем снова для левого и так далее.

Заметка о типах данных

При чтении заголовка можно применять разные типы данных. Например, в Си (MSVS) вместо массива char[4] можно использовать __int32 или DWORD , но тогда сравнение с какой-либо строковой константой, к примеру может оказаться не очень удобным. Также хотелось бы предостеречь вас на тему 64-битных операционных систем. А именно: всегда стоит помнить, что в языке Си тип переменной int в 64-битной системе будет иметь длину 8 байт, а в 32-битной — 4 байта. В таких случаях можно воспользоваться вышеупомянутым типом переменной __int32 или __int64 , в зависимости от того, какой размер переменной в памяти Вам необходим. Существуют типы __int8 , __int16 , __int32 и __int64 , они доступны только для MSVC++ компилятора как минимум 7-й версии (Microsoft Visual Studio 2003.NET), но зато Вы не ошибетесь с выбором размера типа данных.

Обучение — Наглая просьба о помощи с WAV-файлом

  • В теме действуют все Правила форума | Правила раздела;
  • Полезные темы на заметку: FAQ по форуму | Как убирать изображения под спойлер;
  • Вместо слов «Спасибо!» используйте . Если у Вас меньше 15 постов — нажмите на кнопку под тем сообщением, где Вам помогли, и напишите благодарность;
  • При отсутствии куратора шапку темы наполняют модераторы. Воспользуйтесь кнопкой на сообщении, которое, во вашему мнению, нужно добавить в шапку, чтобы связаться с модератором.

ВНИМАНИЕ! В новых ревизиях второго поколения роботов, выпущенных начиная с 03.2020, а также в прошивках, начиная с 02.2020, появилась проверка принадлежности робота к региону. То есть робот для китайского рынка (в России тоже часто такие продают под видом европейского) больше не работает в России. Прошить себя не дает и т.д.

В MiHome выводится следующее сообщение:
русский вариант — «Робот, который вы приобрели, не сертифицирован и не может быть использован. Пожалуйста, приобретите его по обычным каналам. Если у вас есть какие-либо вопросы, пожалуйста, свяжитесь с дилером.»
английский вариант — «The robot you purchased can not use plug-ins without authentication. Please purchase it from regular channels. If you have any questions, please contact the dealer.»
китайский вариант — «你购买的机器人未经过认证无法使用插件,请从正规渠道购买,如有疑问请联系经销商»

Робот-пылесос Xiaomi Mi Robot Vacuum оснащен малошумным бесщеточным мотором, поставляемым японской фирмой NIDEC. Вентилятор дает максимальное давление в целых 1800 Па, которая обеспечивает большую мощность при работе с жесткой грязью.

Mi Robot Vacuum также оснащен тремя процессорами: четырехъядерным процессором Allwinner, сопроцессором STMicroelectronics ARM и процессором обработки изображения Texas Instruments LDS. Трио помогает пылесосу получать данные в режиме реального времени от россыпи из 12 различных типов датчиков (датчик определения расстояния LDS, ультразвуковой радар, датчик расстояния до стены, датчик крупной грязи, датчик падения, гироскопы, акселерометры и так далее). Лазерный дальномер и ультразвуковой радар сканируют окружающее робота пространство на все 360 градусов с частотой замеров 1800 раз/сек. Эта технология похожа на ту, что мы можем видеть в современных беспилотных автомобилях.


Встроенная батарея емкостью 5200 мАч составлена из аккумуляторов повышенной емкости типа 18650 от LG и Panasonic и гарантирует 2,5 уборку от одного заряда батареи.

В: Зачем?
О: После получения рут прав вы получаете полноценный дистрибутив Ubuntu внутри пылесоса. Что с этим делать решать вам. После этого только ваша фантазия ограничивает возможности пылесоса, ну и, соответственно, умения работать с Ubuntu.

Для первой версии:
Полный сток (версия 3532) с рутом, вход по ssh, логин и пароль cleaner, после входа можно/нужно поменять пароль на свой с помощью команды passwd v11_003532.fullos_root.pkg.

  • Полный сток (версия 3.3.9_003514) с рутом, вход по ssh, логин и пароль cleaner, после входа можно/нужно поменять пароль на свой с помощью команды passwd.
  • Полный сток (версия 3.3.9_003506) с рутом, вход по ssh, логин и пароль cleaner, после входа можно/нужно поменять пароль на свой с помощью команды passwd.
  • Полный сток (версия 3.3.9_003416) с рутом, вход по ssh, логин и пароль cleaner, после входа можно/нужно поменять пароль на свой с помощью команды passwd.
  • Полный сток (версия 3.3.9_003254) с рутом, вход по ssh, логин и пароль cleaner, после входа можно/нужно поменять пароль на свой с помощью команды passwd.
  • Полный сток (версия 3.3.9_003194, начиная с этой версии появилась зональная уборка) с рутом, вход по ssh, логин и пароль cleaner, после входа можно/нужно поменять пароль на свой с помощью команды passwd.
  • Полный сток (версия 3.3.9_003132) с рутом, вход по ssh, логин и пароль cleaner, после входа можно/нужно поменять пароль на свой с помощью команды passwd.

Модифицированные прошивки
——————
Теперь зональная уборка и отправка в определенную точку работает официально в родном плагине MiHome, больше никаких манипуляций.

Для второй версии:
Ввиду появления региональной блокировки у второго поколения робота используйте модифицированные прошивки

  • Полный сток (версия 001792) с рутом, вход по ssh, логин и пароль cleaner, после входа можно/нужно поменять пароль на свой с помощью команды passwd
  • Полный сток (версия 001780) с рутом, вход по ssh, логин и пароль cleaner, после входа можно/нужно поменять пароль на свой с помощью команды passwd.
  • Полный сток (версия 001632) с рутом, вход по ssh, логин и пароль cleaner, после входа можно/нужно поменять пароль на свой с помощью команды passwd.
  • Полный сток (версия 001518) с рутом, вход по ssh, логин и пароль cleaner, после входа можно/нужно поменять пароль на свой с помощью команды passwd.
  • Полный сток (версия 001414) с рутом, вход по ssh, логин и пароль cleaner, после входа можно/нужно поменять пароль на свой с помощью команды passwd.
  • Полный сток (версия 001408) с рутом, вход по ssh, логин и пароль cleaner, после входа можно/нужно поменять пароль на свой с помощью команды passwd.
  • Полный сток (версия 001344) с рутом, вход по ssh, логин и пароль cleaner, после входа можно/нужно поменять пароль на свой с помощью команды passwd.
  • Полный сток (версия 001228) с рутом, вход по ssh, логин и пароль cleaner, после входа можно/нужно поменять пароль на свой с помощью команды passwd.
  • Полный сток (версия 001168) с рутом, вход по ssh, логин и пароль cleaner, после входа можно/нужно поменять пароль на свой с помощью команды passwd.

Ниже языковые пакеты только для 1-го и 2-го поколений ( для 3-го они НЕ подходят, можете не пытаться ). Подробности в FAQ

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

В теме нет куратора. По вопросам наполнения шапки обращайтесь к модераторам раздела через кнопку под сообщениями, на которые необходимо добавить ссылки.

Сообщение отредактировал .//Hack — 10.11.19, 05:22

Языковые пакеты можно ставить на любую прошивку, независимо стоковая (оригинальная) она у вас или кастомная.

Вторая версия робота также прошивается по этой инструкции, только прошивки берутся для второй версии

Прошивки и языковые пакеты берем из шапки.

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

# — означает, что команда должна быть выполнена от пользователя root
Чтоб выполнить команду от пользователя root, необходимо перед командой добавить sudo (в Debian может не быть по умолчанию). Например sudo apt-get . либо перейти полностью в режим рут с помощью команды su (sudo su в Ubuntu). После ввода команды система попросит рут-пароль.

Робот должен быть заряжен и стоять на док-станции.

Сначала тянем зависимости:

Внимание! С недавнего времени для python-miio требуется минимум python 3.5. Поэтому обязательно проверьте версию через команду:

Если версия ниже 3.5, то обновитесь любым доступным способом для вашей ОС.

Чтоб все сделать чисто, создаем папку в домашнем каталоге и переходим в нее

Цукерберг рекомендует:  Решения CSS3 для Internet Explorer
Понравилась статья? Поделиться с друзьями:
Все языки программирования для начинающих