Как стать автором
Обновить

Ностальгия по Half Life — создаем приставку для радиостанции для получения голоса и звука окончания в стиле комбайнов

Время на прочтение4 мин
Количество просмотров26K
Всего голосов 82: ↑81 и ↓1+80
Комментарии49

Комментарии 49

НЛО прилетело и опубликовало эту надпись здесь

А Half Life 2 это не Half Life? :)


Я прошел все части и все фановские дополнения Half Life, можно, конечно, делить на версии, но для меня, например, это одна вселенная Half Life.


Ну и статья ведь не об этом, правда?


Ну и, справедливости ради, движок Source — это дальнейшее развитие GoldSrc, используемое в первой части.


А жанры всех этих игр — шутеры.

В оригинальном Half-Life были похожие звуки у военных, но они не такие интересные.

Теперь я знаю кто будет работать на комбайнов :))))

А за статью плюсанул бы, жаль что не могу, люди хабра не любят правду.
Спасибо!
В оригинальном Half-Life были похожие звуки у военных, но они не такие интересные.
Это самое возмутительное заявление, что я видел сегодня. Звуки у них крайне интересны.

В оригинальной Half-Life радиопереговоры военных — это не просто записанные заранее предложения, которые наговорил актёр. В игру встроен синтезатор речи. В файлах есть записи только отдельных слов, каждое записано в виде обычной речи и крика. Из них игра собирает реплики. Движок может менять тональность каждого из отдельных слов или целой реплики. От другой игры 1998 года такого ожидать было бы трудно, но это ведь Half-Life, где даже у тараканов есть игровой ИИ.

Фановские? Рискну предположить, что речь про остальные продукты — переиграть во все существующие пользовательские моды времени не хватит. То, что создали в Gearbox — это официальные продукты, созданные по лицензии. Вообще, в истории многих продуктов «Вэльва» участие принимали сторонние подрядчики. Сейчас некоторые ещё помнят, почему определённая локация de_train называются popdog (из-за граффити на первой версии карты), но никто не объяснит, что это граффити означало (это логотип Barking Dog Studios, у которой эту карту и заказали).

уточню:
Во офф. дополнения типа blueshift, и фановские, доступные тогда, когда играл.
Причём пошёл далеко не все — некоторые не понравились совсем. А из всех допов больше всего понравился именно blueshift, хотя это и офф.

Слово valve читается /vælv/ — не «вейлв»

Целая игра вальвов — дота 2 была всего лишь картой для варкрафт 3, созданной айсфрогом. Для меня до сих пор загадка, почему близзард даже не пытались ничего с этим сделать, емнип по лицензии имея права на эту карту, название, прототипы героев и тп.

Беги, сейчас набигут более сложные комментаторы.

(«Беги, дядя Митя, беги...» (с) ) Не все так страшно.
Другое дело, что просто люди не знают, что такое настоящий звук в настоящем боевом радиоканале при использовании ларингофонов. В игре, конечно, звук получен с помощью цифровой обработки, но он достаточно близок к тому, что происходит в эфире на самом деле, особенно если мы в диапазоне радиостанции начинаем сигнал шифровать. А тоновые сигналы — я их наслушался в начале 2000-х в такси, когда все ездили с радиостанциями и в начале передачи и в конце передачи радиостанция передавала тональный сигнал, который для диспетчера идентифицировал водителя.
И у меня звук радиостанций в HL не вызвал какого-то особого восторга или удивления. В такси начала 2000-х, конечно, из радиостанции звук не такой рафинированный, и ларингофоны никто не использовал. И шифрования не было. Но достаточно близко и похоже по звучанию.

PS: я тоже не знаю, как оно на самом деле звучит в боевых условиях, но когда где-нибудь в горах и на пределе, или реальные переговоры летчиков из 70-х во время воздушного боя, все это можно послушать в ютюбе. Хотя чисто со звуком при использовании ларингофонов — проблема. Как ни пытался, находятся исключительно длинющщие занудные обзоры про то, что «для надевания на шею нужно растянуть пружинную дугу, занести это за голову, надеть на шею» (как объяснение этого можно растянуть на 20 минут???)… И ни одного образца звука «на той стороне» при использовании такого микрофона.
И ни одного образца звука «на той стороне» при использовании такого микрофона.

Автор тоже не стал демонстрировать конечный результат.
Геральда как то мало, можно же переговоры на видео заснять на минутку.
Хотя чисто со звуком при использовании ларингофонов — проблема

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

Не обязательно 70-х, можно и вполне современных, причём в изобилии.
Звук крайне паршивый, особенно когда и динамикам, и ларингофонам, и радиостанциям под полсотни лет. Слова нечёткие, голоса идентифицировать начинаешь в лучшем случае через несколько дней, и то не все, адовейшие помехи…
В боевых действиях не участвовал, но на учениях наслушался.
НЛО прилетело и опубликовало эту надпись здесь

Если речь про андроид, и тел рутованный, то для осуществления вашей мечты нужно всего-лишь закинуть файлы со звуком в формате ogg в папку /root/system/media/audio/ui и перегрузить телефон. Никакое приложение писать не нужно.

А для чего при этом рутованность?

А это место разве доступно на запись без рута?6

Точно, был неправ. Спросонья из того адреса мозг вычленил только /media/audio
НЛО прилетело и опубликовало эту надпись здесь
ФНЧ на входе не понадобился?

Вполне неплохо без него.

Если скорость записи обгоняет скорость чтения, то куски голоса должны пропадать, что должно быть слышно при близких скоростях, когда частота биения маленькая. Щелчек вы задавили ФНЧ (усреднением соседних семплов). Может имело смысл именно фильтром получить требуемый эффект? Тогда часть звука не будет пропадать…

Почему пропадать — там смешиваются сэмплы и откуда должны взяться щелчки?

А что происходит, когда указатель записи на полный круг начинает обгонять указатель чтения? Вы передавали в радиостанцию участок сигнала и тут вдруг раз и уже другие данные на следующем такте передаёте (совершенно другой уровень). Усреднение соседних семплов — это заметание проблемы под ковер, чтобы не сильно слышно было. Ну а что происходит с теми данными, которые мы не успели отправить в аналоговый тракт за время пока один указатель обгоняет другой? Они пропадают.

Они не пропадают, а смешиваются с предыдущими. Щелчки при старте/окончании оцифровки лечатся на ходу рампингом.

Значит вы плохо объяснили ваш алгоритм в статье, и я не понял. Вы написали, что смешиваете только два соседних сэмпла (бегущее среднее?). А выдача данных на ЦАП (PWM) идет со скоростью меньше, чем идет запись с АЦП. Смотрите, если вы записываете с АЦП со скоростью 8.9kHz, а выводите на ЦАП со скоростью в два раза меньше, например, то ваш буфер 450 сэмплов «переполнится» через 450/8900*2 = 0,1 секунду. На данный момент времени на выход уйдет всего-лишь 450 сэмплов, а записано будет 900 сэмплов. После этого произойдет «обгон» указателя записи и воспроизводиться будет текущий сэмпл (усредненный с предыдущим, но это не важно). В результате каждые 100 миллисекунд будет происходить прыжок на 50 мс. Половина данных потеряна. Если у вас другой алгоритм, то я его не понимаю.
Попробую еще раз объяснить более подробно как идет алгоритм (два независимых цикла).

Запись:
  1. получили байт с АЦП
  2. взяли байт по указателю записи, сложили его с полученным с АЦП байтом, разделили на 2, сделали &0xFF
  3. положили этот байт по указателю записи
  4. увеличили указатель записи
  5. если указатель вышел за размер буфера — обнулили его


Чтение:
  1. взяли байт по указателю чтения
  2. отправили его в PWM
  3. увеличили указатель на чтение
  4. если указатель вышел за размер буфера — обнулили его


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

Чтобы не быть голословным — мы болтали вдвоем и на одной скорости и на убыстренной и на замедленной — никаких щелчков и вообще проблем (насколько это может давать радиостанция) не было слышно. Среднее время одного вещания — т.е. нажали PTT — говорим — отжали PTT было около 5 секунд.

Рампинг (медленное возрастание/затухание до нужного уровня) используется только при начале передачи и ее окончании после Roger Beep.

Как-то так.
Ваше усреднение соседних сэмплов — это просто частный случай цифрового ФНЧ. Никакого смешивания и накопления при этом не происходит. Если на вход подать низкочастотную синусоиду, то данное усреднение вообще мало повлияет на сигнал. А если чтение и запись идут на разной скорости, то рано или поздно один буфер циклически догонит другой.Если отношение скоростей небольшое, то это может происходить достаточно редко. Просто представьте что будет если на входе синусоида ну, например, 50 Гц. Воспроизведение из буфера в два раза медленней, чем запись. После 900 отсчетов запись будет производиться в то место, из которого читаем. Все оставшиеся в буфере 450 семплов уже никогда не будут воспроизведены, т.к. их будут перезаписывать новые данные. Если фаза новых данных не совпадет со старыми, то вы просто усредните эту точку и ослабите щелчок в два раза. Учитывая малую частоту воспроизведения вы это и не слышите особо, наверное, но стык там есть точно.
А вот при ускорении получается обратный эффект. Там вы будете повторять эти ваши записанные сэмплы по два раза. Просто при таком алгоритме не может быть иначе.
Начало воспроизведения и окончание — это вы все правильно делаете, но это не проблема. Вы их не слышите скорее всего потому, что частота воспроизведения и так маленькая, плюс вы еще фильтром срезаете верхние частоты.
Все оставшиеся в буфере 450 семплов уже никогда не будут воспроизведены, т.к. их будут перезаписывать новые данные

Вот это не понял — там же не перезаписываются данные никогда, они всегда накладываются на то, что уже есть (т.е. миксуются со старыми данными) и в любом случае попадут на выход.

Ну т.е. скажем в буфере лежит 1, 2, 3, предположим они перезаписываются с самого начала данными 4, 5, 6 => тогда в буфере окажутся данные (1+4)/2, (2+5)/2, (3+6)/2, затем они воспроизведутся.

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

Поправьте, если не так. Если можно — с примером.
А, я понял наконец-то. Вы не с предыдущим сэмплом из АЦП усредняете, а с тем, который был круг назад. Значит вы теряете только часть информации при перезаписи. Да, это меняет дело. Правда что при этом происходит со спектром уже сложно сказать. Вы давите те частоты, которые не входят целыми в ваш кольцевой буфер. Перевели потери из временнОй области в частотную. Это решение, да.
Как пример потери информации: например наш полезный сигнал — синусоида, которая за время записи буфера проходит половину периода (на самом деле любое количество периодов с половинкой, главное — смена фазы на противоположную). Первый круг мы прошли и записали половину периода синусоиды, а при втором прохождении мы усредняем её с противофазной второй половинкой. Второе кольцо мы получим тишину.
Ощутимое затухание возникнет, если скорость записи более чем в два раза выше, чем скорость воспроизведения. Тогда от некоторых участков данных останется 1/4 амплитуды (или меньше).
а с тем, который был круг назад

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

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

Для этого требуется переписывать отдаваемые данные
зачем их переписывать? если складывая с прошлыми это и есть эхо.
иметь гораздо большую задержку.
на сколько большую?
эхо это любая задержка больше 0.

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

Складывается он с предыдущим, но не так, как делается для эха или реверберации — тут наложение будет лишь части сигнала.
да как не так-то? если скорости совпадают — будет именно сложение с сигналом задержанным на 450 отсчетов. если не совпадают то с какой-то периодичностью или 450 отсчетов повторно будет проиграно или будет пропущено.
Объяснить это на пальцах сложно.
давайте уже исходники :)
Можете попробовать программно сэмулировать такое и потом открыть в редакторе звука
а можно открыть исходный звук ресемплировать до 9КГц и добавить эхо с 50мс задержкой.
В качестве доказательства послушайте приведённый здесь пример работы — там нет эха.
или его не слышно за искажениями. такое себе доказательство. вы либо что-то упускаете, либо это искажения наложены шимом.
но судя по ютубчику шим на тиньке нормально играет.
А еще у вас на входе с микрофона нет аппаратного ФНЧ. Вероятней всего, ваш микрофон и его усилитель могут пропускать полосу частот намного больше 8,9кГц. При оцифровке с частотой 8,9кГц без аппаратного фильтра вы получаете алиасинг, т.е. вы отзеркалили частоты выше частоты Найквиста-Котельникова в интересующую вас область, что является искажением оригинального сигнала. Так делать не стОит.
На плате использована MAX9814, емнип там есть ФНЧ.

Но было бы интересно, чем это все чревато? Что за искажения га слух будет при оцифровке?

Я как бы не всамделишный сварщик: ) Т.е. я больше программист, чем электронщик.
ФНЧ даже если его там нет сам собой получается. Вопрос в том на какой частоте он задавит звук достаточно сильно. В английской вики есть пример звучания алиасинга на синусоиде. Все составляющие после частоты Найквиста (в вашем примере все, что больше 4,4кГц) копируется на основной частотный диапазон, в результате появляются неестественные звуки.
Понял, спасибо за ликбез.

Ну здесь я не замечал такого, может быть потому, что радиостанция и так достаточно хорошо искажает :)
НЛО прилетело и опубликовало эту надпись здесь
Большое спасибо за статью! Правда радиостанции у меня нет, зато узнал много нового и интересного про свой любимый Half-Life. И не подозревал что в то время в игре была такая продвинутая работа со звуком.

Пытался понять как работает кольцевой буфер, но не осилил. За секунду получаем 8900 байт (если АЦП восьмиразрядное), а буфер всего 450 байт. То есть буфер на 50.5 миллисекунд. Как же это всё работает?!
Тут попытался подробнее расписать.

Что если реализовать этот пример на плате STM32F4 discovery? Там и памяти больше и mems микрофон и аппараьный dac припаяны.

А лучше вообще использовать аппаратный аудиокодек. Например wm8731. Тогда не надо будет mems pdm расшифровывать.

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

Зато конструктив будет надежнее. Все компоненты твердотельные. Любой обладатель платы STM32F4DISCOVERY сможет попробовать вашу прошивку.
https://www.st.com/en/evaluation-tools/stm32f4discovery.html

BluePill хватит заглаза вместо такого монстра, если уж делать.

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории