Как работает Shazam?
Слышали фразу: «Любая достаточно развитая технология неотличима от магии»? Хотел поделиться одним интересным моментом, который у меня как раз и вызывает это чувство. АРечь пойдёт о том, как работает Shazam. И, вероятно, другие похожие сервисы.
Итак, начнём наш пятничный длиннопост.
Любой оцифрованный звуковой файл по сути представляет собой список чисел. При записи микрофон записывает громкость воздуха тысячи раз в секунду. Однако если записать одну и ту же песню на два разных устройства, с точки зрения цифровых данных файлы не будут идентичными.
Это логично: фоновые шумы, разная громкость, а может — и разные комнаты. Всё это влияет на финальный набор чисел.
Так что сравнить два звука вот так «в лоб» не выйдет. И Shazam использует весьма изящное решение.
🟢 вместо raw-файла он нарезает аудио на очень короткие кусочки по ~20–50 мс;
🟢 далее выполняется Преобразование Фурье (Fourier Transform). Я не силён в математике, и вероятно, мне сейчас накидают в комментах, но... после преобразования у нас получается набор тонов и понимание, какие частоты присутствуют в звуке, и насколько громкие они. Даже при наличии шума ключевые частотные пики остаются узнаваемыми.
🟢 благодаря коротким отрезкам Shazam знает не только частоты и громкость, но и то, когда именно они были в песне;
🟢 если сложить всю эту информацию вместе — получаем спектограмму песни: слева-направо время, снизу-вверх частота, а точки показывают «яркость» звука;
🟢 а потом алгоритм отбрасывает почти всю спектограмму, и оставляет только самые яркие точки. Остаются редкие маркеры в местах, где песня звучала громче всего, — это напоминает карту созвездий.
🟢 для каждой «якорной» точки Shazam просматривает близлежащие точки и спрашивает, как далеко они находятся как по времени, так и по частоте. Каждое такое соотношение превращается в уникальный код.
Среднестатистический трек длительностью около трёх минут генерирует тысячи таких меток. Shazam хранит их в базе данных для большинства существующих песен. При этом сервис кодирует не просто отдельные точки, а их пары и расстояние между ними — это позволяет находить совпадения даже в шумной среде.
Ваш телефон выполняет все эти преобразования очень быстро, и за считанные секунды Shazam точно определяет, что за песня сейчас играет.
Это ли не магия? А вы говорите, что алгоритмы не нужны.🧐
Слышали фразу: «Любая достаточно развитая технология неотличима от магии»? Хотел поделиться одним интересным моментом, который у меня как раз и вызывает это чувство. АРечь пойдёт о том, как работает Shazam. И, вероятно, другие похожие сервисы.
Итак, начнём наш пятничный длиннопост.
Любой оцифрованный звуковой файл по сути представляет собой список чисел. При записи микрофон записывает громкость воздуха тысячи раз в секунду. Однако если записать одну и ту же песню на два разных устройства, с точки зрения цифровых данных файлы не будут идентичными.
Это логично: фоновые шумы, разная громкость, а может — и разные комнаты. Всё это влияет на финальный набор чисел.
Так что сравнить два звука вот так «в лоб» не выйдет. И Shazam использует весьма изящное решение.
Среднестатистический трек длительностью около трёх минут генерирует тысячи таких меток. Shazam хранит их в базе данных для большинства существующих песен. При этом сервис кодирует не просто отдельные точки, а их пары и расстояние между ними — это позволяет находить совпадения даже в шумной среде.
Ваш телефон выполняет все эти преобразования очень быстро, и за считанные секунды Shazam точно определяет, что за песня сейчас играет.
Это ли не магия? А вы говорите, что алгоритмы не нужны.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍35🔥8❤2
Kotlin’s Builder Functions
На днях попалась короткая статья, где рассказывается о разных штуках в Kotlin для уменьшения бойлерплейта. Больший упор на создание списков, maps, strings и т.д.
Наверное, функцией buildString и buildList никого не удивишь, но вот я совсем забыл про
Выглядит прикольно. Поделитесь своими подобными лайфхаками, может кто-то и не знает то, что вы используетесь каждый день.
На днях попалась короткая статья, где рассказывается о разных штуках в Kotlin для уменьшения бойлерплейта. Больший упор на создание списков, maps, strings и т.д.
Наверное, функцией buildString и buildList никого не удивишь, но вот я совсем забыл про
buildSpannedString: в итоге получаем что-то типа:
buildSpannedString {
color(colorOne) { append(text1) }
color(colorTwo) { append(text2) }
}
Выглядит прикольно. Поделитесь своими подобными лайфхаками, может кто-то и не знает то, что вы используетесь каждый день.
Domen Lanisnik
Kotlin’s Builder Functions: A Better Way to Create Lists, Maps, Strings & Sets
Kotlin offers several convenience functions to create lists, maps, strings, and more without the usual boilerplate code.
👍16❤3
Google Android Skills
Тут Google завёл репозиторий со скиллами для LLM, которые напрямую связаны с Android-разработкой. Пока он небольшой, но со временем материалов наверняка станет больше. В списке уже есть:
🟢 миграция на AGP 9;
🟢 миграция на Compose с xml;
🟢 переход на Navigation Library 3;
🟢 анализатор R8;
Что ж, тенденция ещё раз подтверждается, так что обогащаем наших агентов новыми знаниями.
Тут Google завёл репозиторий со скиллами для LLM, которые напрямую связаны с Android-разработкой. Пока он небольшой, но со временем материалов наверняка станет больше. В списке уже есть:
Что ж, тенденция ещё раз подтверждается, так что обогащаем наших агентов новыми знаниями.
Please open Telegram to view this post
VIEW IN TELEGRAM
GitHub
GitHub - android/skills
Contribute to android/skills development by creating an account on GitHub.
🔥18👍2
yt-dlp
Пост не про Android, но не могу не поделиться.
На днях папа попросил скачать ему видео с YouTube, чтобы посмотреть его позже на телевизоре. А желательно — не просто один ролик, а весь канал целиком, чтобы далеко не ходить.
Для скачивания одного видео решений масса. А вот для скачать весь канал уже задача со звёздочкой. К счастью, мне попалась ультимативная утилита для сохранения любых видео и аудио— yt-dlp. Даже не представляю, какой гений её создал.
Она хоть и консольная, но невероятно мощная и кастомизируемая. В моём случае я смог:
🟢 выбрать не самое высокое качество видео, чтобы уменьшить размер и улучить стабильность на бюджетном телезизоре;
🟢 «прикинуться» браузером, чтобы скачивать без лишних сложностей: YouTube сейчас блокирует ботов, поэтому утилита сама предложила использовать эту опцию;
🟢 выбрать только одну звуковую дорожку;
🟢 загрузить сначала плейлисты, а потом и остальные видео. Без повторов.
В общем, если перед вами когда-нибудь встанет подобная задача — вы знаете, в какую сторону копать. Лучшего решения всё равно не найти.
Пост не про Android, но не могу не поделиться.
На днях папа попросил скачать ему видео с YouTube, чтобы посмотреть его позже на телевизоре. А желательно — не просто один ролик, а весь канал целиком, чтобы далеко не ходить.
Для скачивания одного видео решений масса. А вот для скачать весь канал уже задача со звёздочкой. К счастью, мне попалась ультимативная утилита для сохранения любых видео и аудио— yt-dlp. Даже не представляю, какой гений её создал.
Она хоть и консольная, но невероятно мощная и кастомизируемая. В моём случае я смог:
В общем, если перед вами когда-нибудь встанет подобная задача — вы знаете, в какую сторону копать. Лучшего решения всё равно не найти.
Please open Telegram to view this post
VIEW IN TELEGRAM
GitHub
GitHub - yt-dlp/yt-dlp: A feature-rich command-line audio/video downloader
A feature-rich command-line audio/video downloader - yt-dlp/yt-dlp
👍41❤8👌5🔥2
Koin Migration
Ещё один MCP в копилку. Разработчики из Koin написали тулзу, которая поможет мигрировать текущий проект практически с любого DI-фреймворка на Koin.
Полагаю, что современные языковые модели в какой-то степени справятся с этой задачей и самостоятельно, но с данным решением переезд станет гораздо комфортнее.
Люблю Koin, считаю его одним из самых удачных dependency-библиотек.
Ещё один MCP в копилку. Разработчики из Koin написали тулзу, которая поможет мигрировать текущий проект практически с любого DI-фреймворка на Koin.
Полагаю, что современные языковые модели в какой-то степени справятся с этой задачей и самостоятельно, но с данным решением переезд станет гораздо комфортнее.
Люблю Koin, считаю его одним из самых удачных dependency-библиотек.
GitHub
GitHub - InsertKoinIO/koin-migration: Koin + Koin Compiler Plugin migration — reference docs and AI skill that automate the move…
Koin + Koin Compiler Plugin migration — reference docs and AI skill that automate the move from Hilt/Dagger/Toothpick/Kodein/manual DI to the Koin Compiler Plugin. - InsertKoinIO/koin-migration
👍19🔥7🙈1
Заметил интересный тренд в связи с появлением AI.
Люди массово публикуют скриншоты своих подписок на Claude Code и Codex, показывая исчерпанные лимиты в максимальных тарифах. Ну и полагают, что раз токены закончились, то и работа была продуктивной.
Однако чаще всего это говорит лишь о том, что ты потратил все токены. Эффективность этих трат — совсем другой вопрос.
Люди массово публикуют скриншоты своих подписок на Claude Code и Codex, показывая исчерпанные лимиты в максимальных тарифах. Ну и полагают, что раз токены закончились, то и работа была продуктивной.
Однако чаще всего это говорит лишь о том, что ты потратил все токены. Эффективность этих трат — совсем другой вопрос.
😁30💯28👍4🤷♂2❤1
Ну что — помянем
Google переводит их в режим поддержки, выпуская исключительно критические исправления.
Теперь Compose First подход официально.
Но, думаю,
View ⚰️Google переводит их в режим поддержки, выпуская исключительно критические исправления.
Fragment, кстати тоже всё. Теперь Compose First подход официально.
Но, думаю,
View останутся с нами ещё надолго: слишком много качественных приложений написано именно на них.Android Developers
Android is Compose-first | Jetpack Compose | Android Developers
Android is Compose-first, and the Views system is now in maintenance mode, meaning it will only receive updates for highly critical fixes.
👍25😢18👎3❤1🔥1
Что за Gemma 4?
Одним из не очень громких, но, на мой взгляд, важных анонсов Google I/O была поддержка Gemma 4 прям из IDE.
Android Studio и раньше поддерживала локальные модели, но теперь можно просто скачать себе подходящую модель напрямую, чуть ли не как SDK. В итоге вы получаете вполне приличного ИИ-ассистента.
Как я и сказал, модель локальная: подойдёт, если не хочется платить за подписки или использование сторонних моделей запрещено корпоративными правилами. Ну и вообще, тренд с локальными моделями мне нравится.
И хоть Gemma 4 и не самая топовая в бенче — всё равно будет полезной для разного рода задач.
Для запуска надо прилично RAM, так что бояре с 48+ гигами оперативы снова в тренде.
Одним из не очень громких, но, на мой взгляд, важных анонсов Google I/O была поддержка Gemma 4 прям из IDE.
Android Studio и раньше поддерживала локальные модели, но теперь можно просто скачать себе подходящую модель напрямую, чуть ли не как SDK. В итоге вы получаете вполне приличного ИИ-ассистента.
Как я и сказал, модель локальная: подойдёт, если не хочется платить за подписки или использование сторонних моделей запрещено корпоративными правилами. Ну и вообще, тренд с локальными моделями мне нравится.
И хоть Gemma 4 и не самая топовая в бенче — всё равно будет полезной для разного рода задач.
Для запуска надо прилично RAM, так что бояре с 48+ гигами оперативы снова в тренде.
👍13
Что у нас по AI-переводам? 🤖
Сколько бы я ни разрабатывал приложения — проблема локализации всегда стояла остро. До недавнего времени существовало два основных пути:
🟢 путь самурая — наймём агенство профессиональных переводчиков, которые будут в теме нашего контекста и обеспечат высокое качество;
🟢 путь ронина — а зачем нам переводчики, давайте машинные переводы сделаем, это лучше, чем ничего;
Первый вариант — дорогой и долгий, при этом качество не всегда было безупречным. Второй — бюджетный, но уровень перевода оказывался совсем низким.
С недавних пор у нас появился третий путь: а давайте натравим AI, чтобы он сам делал переводы, модели ж уже весьма умные. Или нет? Поделюсь своим опытом.
Для работы с переводчиками у нас использовалась платформа CrowdIn. По сути, при работе с переводчиками это было удобным хранилищем для строк. А ещё была неплохая поддержка CI, что позволяло отправлять и получать переводы без ручного участия команды разработки.
С приходом эры AI платформа добавила поддержку нейросетевых моделей. Можно подключать свои ключи API и использовать любые подходящие модели.
В результате текущий workflow выглядит так:
🟢 загружаем новые строки;
🟢 обогащаем контекст с помощью встроенного инструмента harvester: по сути, это команда, которая добавляет описание к каждой строке (например: «эта строка используется для кнопки «Вперёд» на экране авторизации»). Считаю это критически важным этапом;
🟢 запускаем перевод.
Для генерации контекста можно использовать модель попроще, а для финального перевода — более мощную и дорогую.
На выходе получилось очень достойно: надо было добавить пару правил по поводу того, что не стоит переводить и шаг за шагом добавлять языки, иногда проверяя переводы носителем, если есть возможность. Оцениваю фичу по качеству на 8 из 10, а по деньгам — 10 из 10. Даже с самой дорогой моделью на переводах.
Так что если у вас есть подобная задача — смело интегрируйте удобное для себя готовые решение, благо их на рынке сейчас много. Или навайбкодьте своё, чего уж.
Сколько бы я ни разрабатывал приложения — проблема локализации всегда стояла остро. До недавнего времени существовало два основных пути:
Первый вариант — дорогой и долгий, при этом качество не всегда было безупречным. Второй — бюджетный, но уровень перевода оказывался совсем низким.
С недавних пор у нас появился третий путь: а давайте натравим AI, чтобы он сам делал переводы, модели ж уже весьма умные. Или нет? Поделюсь своим опытом.
Для работы с переводчиками у нас использовалась платформа CrowdIn. По сути, при работе с переводчиками это было удобным хранилищем для строк. А ещё была неплохая поддержка CI, что позволяло отправлять и получать переводы без ручного участия команды разработки.
С приходом эры AI платформа добавила поддержку нейросетевых моделей. Можно подключать свои ключи API и использовать любые подходящие модели.
В результате текущий workflow выглядит так:
Для генерации контекста можно использовать модель попроще, а для финального перевода — более мощную и дорогую.
На выходе получилось очень достойно: надо было добавить пару правил по поводу того, что не стоит переводить и шаг за шагом добавлять языки, иногда проверяя переводы носителем, если есть возможность. Оцениваю фичу по качеству на 8 из 10, а по деньгам — 10 из 10. Даже с самой дорогой моделью на переводах.
Так что если у вас есть подобная задача — смело интегрируйте удобное для себя готовые решение, благо их на рынке сейчас много. Или навайбкодьте своё, чего уж.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍16❤2👎1
R8 retrace
На днях отлаживал баг в тестовой сборке и заметил применение крутой технологии — R8 retrace. Как-то я упустил момент её релиза, а ведь теперь Android Studio подтягивает её автоматически.
Наверняка у вас в проектах используется R8. При создании релизной сборки генерируется файл mapping.txt. Он используется, например, в Firebase Crashlytics, чтобы превратить обфусцированный код в читаемый стектрейс.
Так вот, сейчас если собрать релизную (а может и тестовую, если вы её тоже делаете с R8) и установить её на устройство, которое подключено к IDE, то можно увидеть сразу корректный стектрейс. Студия сама подцепит, если есть mapping и покажет всё, что нужно для дебага.
Хотя может фича уже давно в проде, а я только обнаружил.
На днях отлаживал баг в тестовой сборке и заметил применение крутой технологии — R8 retrace. Как-то я упустил момент её релиза, а ведь теперь Android Studio подтягивает её автоматически.
Наверняка у вас в проектах используется R8. При создании релизной сборки генерируется файл mapping.txt. Он используется, например, в Firebase Crashlytics, чтобы превратить обфусцированный код в читаемый стектрейс.
Так вот, сейчас если собрать релизную (а может и тестовую, если вы её тоже делаете с R8) и установить её на устройство, которое подключено к IDE, то можно увидеть сразу корректный стектрейс. Студия сама подцепит, если есть mapping и покажет всё, что нужно для дебага.
Хотя может фича уже давно в проде, а я только обнаружил.
Android Developers
R8 retrace | Android Studio | Android Developers
R8 retrace is a standalone tool used to reconstruct original stack traces from obfuscated ones by matching class and method names in a mapping file to their original definitions.
🔥20❤4
Mesh Gradients
Люблю красивый UI, и вот — ещё одна интересная фича в стандартной библиотеке Compose.
Mesh-градиенты — это градиентывнезапно , которые делают переходы с помощью сетки. Она может быть нелинейной, благодаря чему градиент выглядит необычно. Получается плавная, перетекающая цветовая масса. Гугловый пример мне напоминает чем-то бензин, который попал в лужу.
Для создания существует MeshGradientPainter. В нём можно настроить множество параметров: количество цветов, характеристики сетки и итоговую форму.
Часто встречаю приложения с градиентами, поэтому считаю, что такая анимация выглядит очень достойно.
Детальнее можно почитать тут.
Люблю красивый UI, и вот — ещё одна интересная фича в стандартной библиотеке Compose.
Mesh-градиенты — это градиенты
Для создания существует MeshGradientPainter. В нём можно настроить множество параметров: количество цветов, характеристики сетки и итоговую форму.
Часто встречаю приложения с градиентами, поэтому считаю, что такая анимация выглядит очень достойно.
Детальнее можно почитать тут.
Android Developers
Mesh gradients | Jetpack Compose | Android Developers
This document describes how to use Mesh gradients in Jetpack Compose to create complex, multi-directional color transitions.
👍16🔥4
This media is not supported in your browser
VIEW IN TELEGRAM
Важный вопрос
Как думаете, юзеры удивятся, если увидят такой ввод пароля в банковском приложении?
Если что — вот код.
Как думаете, юзеры удивятся, если увидят такой ввод пароля в банковском приложении?
Если что — вот код.
😁31👍12🔥8
Handy
Если вы искали качественную и бесплатную замену Wispr (популярный нынче инструмент для транскрибации), то вот вам Handy.
Плюсов много:
• бесплатный;
• opensource;
• распознавание голоса происходит прям на устройстве;
• такой же простой и понятный.
По ощущениям работает похуже: если Wispr делает распознавание на 10 из 10, то Handy я поставлю 8. Но… opensource и бесплатно зато. Считаю, что это золото, а не тулза.
Если вы искали качественную и бесплатную замену Wispr (популярный нынче инструмент для транскрибации), то вот вам Handy.
Плюсов много:
• бесплатный;
• opensource;
• распознавание голоса происходит прям на устройстве;
• такой же простой и понятный.
По ощущениям работает похуже: если Wispr делает распознавание на 10 из 10, то Handy я поставлю 8. Но… opensource и бесплатно зато. Считаю, что это золото, а не тулза.
Handy
Handy is a cross platform, open-source, speech-to-text application for your computer
👍9💯3