{"id":479564,"date":"2026-05-13T09:52:13","date_gmt":"2026-05-13T09:52:13","guid":{"rendered":"https:\/\/savepearlharbor.com\/?p=479564"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=479564","title":{"rendered":"\u041a\u0430\u043a \u0437\u0432\u0443\u0447\u0438\u0442 JPEG? \u0418\u043b\u0438 \u0447\u0442\u043e \u0431\u0443\u0434\u0435\u0442, \u0435\u0441\u043b\u0438 \u0441\u0436\u0430\u0442\u044c \u0441\u043f\u0435\u043a\u0442\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0443 \u043a\u0430\u043a \u0444\u043e\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u044e"},"content":{"rendered":"<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<h3>\u0412\u0432\u0435\u0434\u0435\u043d\u0438\u0435<\/h3>\n<p>\u0411\u044b\u0432\u0430\u044e\u0442 \u0434\u043d\u0438, \u043a\u043e\u0433\u0434\u0430 \u043d\u0430 \u0440\u0430\u0431\u043e\u0442\u0435 \u0434\u0435\u043b\u0430\u0442\u044c \u043d\u0435\u0447\u0435\u0433\u043e. \u0410 \u0431\u044b\u0432\u0430\u044e\u0442 \u0434\u043d\u0438, \u043a\u043e\u0433\u0434\u0430 \u0442\u044b \u2014 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442 \u0438 \u0437\u0432\u0443\u043a\u043e\u0440\u0435\u0436\u0438\u0441\u0441\u0451\u0440 \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e, \u0438 \u0432 \u0433\u043e\u043b\u043e\u0432\u0443 \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442 \u0441\u0442\u0440\u0430\u043d\u043d\u0430\u044f \u043c\u044b\u0441\u043b\u044c: \u00ab\u0410 \u0447\u0442\u043e, \u0435\u0441\u043b\u0438 \u0432\u0437\u044f\u0442\u044c \u0430\u0443\u0434\u0438\u043e, \u043f\u0440\u0435\u0432\u0440\u0430\u0442\u0438\u0442\u044c \u0435\u0433\u043e \u0432 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0443-\u0441\u043f\u0435\u043a\u0442\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0443, \u0441\u0436\u0430\u0442\u044c \u044d\u0442\u0443 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0443 \u043a\u0430\u043a \u0444\u043e\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u044e (JPEG, WebP, AVIF), \u0430 \u043f\u043e\u0442\u043e\u043c \u043f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u0442\u044c \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0437\u0432\u0443\u043a \u043e\u0431\u0440\u0430\u0442\u043d\u043e? \u041a\u0430\u043a \u043e\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u0437\u0432\u0443\u0447\u0430\u0442\u044c?\u00bb<\/p>\n<p>\u0421\u043f\u043e\u0439\u043b\u0435\u0440: \u0438\u043d\u043e\u0433\u0434\u0430 \u2014 \u0443\u0434\u0438\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0445\u043e\u0440\u043e\u0448\u043e. \u0418\u043d\u043e\u0433\u0434\u0430 \u2014 \u043a\u0430\u043a \u0438\u0437 \u0443\u043d\u0438\u0442\u0430\u0437\u0430. \u041d\u043e \u0432\u0441\u0435\u0433\u0434\u0430 \u2014 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e.<\/p>\n<p>\u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u044f \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443, \u043a\u0430\u043a \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043b \u0432\u0435\u0441\u044c \u044d\u0442\u043e\u0442 \u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d, \u043f\u043e\u043a\u0430\u0436\u0443 \u043a\u043e\u0434, \u043f\u0440\u043e\u0432\u0435\u0434\u0443 \u0431\u0430\u0442\u0447-\u0442\u0435\u0441\u0442\u044b \u0440\u0430\u0437\u043d\u044b\u0445 \u0444\u043e\u0440\u043c\u0430\u0442\u043e\u0432 \u0438 \u0443\u0440\u043e\u0432\u043d\u0435\u0439 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0430, \u0438, \u043a\u043e\u043d\u0435\u0447\u043d\u043e, \u0434\u0430\u043c \u043f\u043e\u0441\u043b\u0443\u0448\u0430\u0442\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b. \u0412\u0441\u0435 \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u0438 \u043f\u0440\u0438\u043b\u0430\u0433\u0430\u044e\u0442\u0441\u044f, \u0438 \u0432\u044b \u0441\u043c\u043e\u0436\u0435\u0442\u0435 \u043f\u043e\u0432\u0442\u043e\u0440\u0438\u0442\u044c \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442 \u0441\u0430\u043c\u0438.<\/p>\n<h3>\u0418\u0434\u0435\u044f<\/h3>\n<p>\u0421\u043f\u0435\u043a\u0442\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u2014 \u044d\u0442\u043e \u0432\u0438\u0437\u0443\u0430\u043b\u044c\u043d\u043e\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0437\u0432\u0443\u043a\u0430: \u043f\u043e \u0433\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430\u043b\u0438 \u2014 \u0432\u0440\u0435\u043c\u044f, \u043f\u043e \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u0438 \u2014 \u0447\u0430\u0441\u0442\u043e\u0442\u0430, \u0446\u0432\u0435\u0442 \u2014 \u0430\u043c\u043f\u043b\u0438\u0442\u0443\u0434\u0430. \u0415\u0441\u043b\u0438 \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0441\u043f\u0435\u043a\u0442\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0443 \u043a\u0430\u043a \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0443, \u0430 \u043f\u043e\u0442\u043e\u043c \u0441\u0436\u0430\u0442\u044c \u0435\u0451 \u0441 \u043f\u043e\u0442\u0435\u0440\u044f\u043c\u0438 (\u043a\u0430\u043a JPEG), \u0442\u043e \u043f\u0440\u0438 \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0438 \u0437\u0432\u0443\u043a\u0430 \u043e\u0431\u0440\u0430\u0442\u043d\u043e \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043c\u2026 \u0430\u0440\u0442\u0435\u0444\u0430\u043a\u0442\u044b \u0441\u0436\u0430\u0442\u0438\u044f, \u043d\u043e \u0443\u0436\u0435 \u0432 \u0430\u0443\u0434\u0438\u043e! \u0418\u043c\u0435\u043d\u043d\u043e \u044d\u0442\u043e \u044f \u0438 \u0445\u043e\u0442\u0435\u043b \u0443\u0441\u043b\u044b\u0448\u0430\u0442\u044c.<\/p>\n<p><strong>\u0414\u043b\u044f \u0441\u0442\u0435\u0440\u0435\u043e \u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b Mid\/Side \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435:<\/strong><\/p>\n<ul>\n<li>\n<p>\u0417\u0435\u043b\u0451\u043d\u044b\u0439 \u043a\u0430\u043d\u0430\u043b (G) \u2014 Mid (\u043c\u043e\u043d\u043e-\u0441\u0443\u043c\u043c\u0430 \u043b\u0435\u0432\u043e\u0433\u043e \u0438 \u043f\u0440\u0430\u0432\u043e\u0433\u043e)<\/p>\n<\/li>\n<li>\n<p>\u0421\u0438\u043d\u0438\u0439 \u043a\u0430\u043d\u0430\u043b (B) \u2014 Side (\u0440\u0430\u0437\u043d\u0438\u0446\u0430 \u043c\u0435\u0436\u0434\u0443 \u043b\u0435\u0432\u044b\u043c \u0438 \u043f\u0440\u0430\u0432\u044b\u043c)<\/p>\n<\/li>\n<li>\n<p>\u041a\u0440\u0430\u0441\u043d\u044b\u0439 \u043a\u0430\u043d\u0430\u043b \u00ae \u2014 \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f (\u043f\u043e\u043a\u0430)<\/p>\n<\/li>\n<\/ul>\n<p>\u0410\u043c\u043f\u043b\u0438\u0442\u0443\u0434\u044b \u043b\u043e\u0433\u0430\u0440\u0438\u0444\u043c\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u0432 \u0434\u0435\u0446\u0438\u0431\u0435\u043b\u044b \u0438 \u043c\u0430\u043f\u043f\u044f\u0442\u0441\u044f \u0432 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d 0\u2013255 (8 \u0431\u0438\u0442 \u043d\u0430 \u043a\u0430\u043d\u0430\u043b). \u0427\u0430\u0441\u0442\u043e\u0442\u044b \u0432\u044b\u0448\u0435 \u043f\u043e\u0440\u043e\u0433\u0430 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043e\u0431\u0440\u0435\u0437\u0430\u044e\u0442\u0441\u044f \u0434\u043b\u044f \u044d\u043a\u043e\u043d\u043e\u043c\u0438\u0438 \u043c\u0435\u0441\u0442\u0430. \u0417\u0430\u0442\u0435\u043c \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0430 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442\u0441\u044f \u0432 \u043d\u0443\u0436\u043d\u043e\u043c \u0444\u043e\u0440\u043c\u0430\u0442\u0435.<\/p>\n<p>\u041f\u0440\u0438 \u0434\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438 \u0444\u0430\u0437\u0430 \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0447\u0435\u0440\u0435\u0437 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0413\u0440\u0438\u0444\u0444\u0438\u043d\u0430-\u041b\u0438\u043c\u0430 (Griffin-Lim), \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0432 \u0441\u043f\u0435\u043a\u0442\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0435 \u043c\u044b \u0445\u0440\u0430\u043d\u0438\u043c \u0442\u043e\u043b\u044c\u043a\u043e \u0430\u043c\u043f\u043b\u0438\u0442\u0443\u0434\u0443, \u0430 \u0444\u0430\u0437\u0430 \u0442\u0435\u0440\u044f\u0435\u0442\u0441\u044f.<\/p>\n<h3>\u0412\u0430\u0436\u043d\u043e\u0435 \u0437\u0430\u043c\u0435\u0447\u0430\u043d\u0438\u0435 \u043e \u0444\u043e\u0440\u043c\u0430\u0442\u0435 \u0430\u0443\u0434\u0438\u043e<\/h3>\n<p>\u041f\u0440\u0435\u0436\u0434\u0435 \u0447\u0435\u043c \u043c\u044b \u043f\u0435\u0440\u0435\u0439\u0434\u0451\u043c \u043a \u0434\u0435\u0442\u0430\u043b\u044f\u043c \u2014 \u043e\u0434\u0438\u043d \u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u043c\u043e\u043c\u0435\u043d\u0442. \u0412\u0441\u0435 \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043d\u044b\u0435 WAV-\u0444\u0430\u0439\u043b\u044b \u044f, \u0440\u0430\u0437\u0443\u043c\u0435\u0435\u0442\u0441\u044f, \u043d\u0435 \u0432\u044b\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u044e \u043a\u0430\u043a \u0435\u0441\u0442\u044c. \u0412\u043e-\u043f\u0435\u0440\u0432\u044b\u0445, \u044d\u0442\u043e \u0431\u044b\u043b\u043e \u0431\u044b \u0436\u0435\u0441\u0442\u043e\u043a\u043e \u043f\u043e \u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u044e \u043a \u0441\u0435\u0440\u0432\u0435\u0440\u0443 (70 \u0441\u0435\u043a\u0443\u043d\u0434 \u0441\u0442\u0435\u0440\u0435\u043e 44.1\/16 \u2014 \u044d\u0442\u043e ~12 \u043c\u0435\u0433\u0430\u0431\u0430\u0439\u0442 \u043d\u0430 \u043a\u0430\u0436\u0434\u044b\u0439 \u0442\u0435\u0441\u0442, \u0430 \u0442\u0435\u0441\u0442\u043e\u0432 \u0443 \u043d\u0430\u0441 18). \u0412\u043e-\u0432\u0442\u043e\u0440\u044b\u0445, \u044d\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u0431\u0435\u0441\u0441\u043c\u044b\u0441\u043b\u0435\u043d\u043d\u043e \u2014 WAV \u043d\u0443\u0436\u0435\u043d \u0442\u043e\u043b\u044c\u043a\u043e \u043a\u0430\u043a \u043f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043e\u0447\u043d\u044b\u0439 \u0444\u043e\u0440\u043c\u0430\u0442 \u043f\u0440\u0438 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0435.<\/p>\n<p><strong>\u0412\u0441\u0435 \u0430\u0443\u0434\u0438\u043e\u043f\u0440\u0438\u043c\u0435\u0440\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0432\u044b \u0443\u0441\u043b\u044b\u0448\u0438\u0442\u0435, \u0443\u043f\u0430\u043a\u043e\u0432\u0430\u043d\u044b \u0432 Opus 128 kbps.<\/strong> \u042d\u0442\u043e \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0439, \u0438\u0441\u043a\u043b\u044e\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u044b\u0439 \u043a\u043e\u0434\u0435\u043a, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0430 \u0431\u0438\u0442\u0440\u0435\u0439\u0442\u0435 128 kbps \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u0435\u0442 \u043f\u0440\u043e\u0437\u0440\u0430\u0447\u043d\u043e\u0435 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u043e \u2014 \u0442\u043e \u0435\u0441\u0442\u044c WAV \u0438 Opus \u043d\u0430 \u044d\u0442\u0438\u0445 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430\u0445 \u0437\u0432\u0443\u0447\u0430\u0442 \u0430\u0431\u0441\u043e\u043b\u044e\u0442\u043d\u043e \u0438\u0434\u0435\u043d\u0442\u0438\u0447\u043d\u043e \u0434\u043b\u044f \u0447\u0435\u043b\u043e\u0432\u0435\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0443\u0445\u0430, \u043d\u043e \u0444\u0430\u0439\u043b \u0432\u0435\u0441\u0438\u0442 \u0432 10 \u0440\u0430\u0437 \u043c\u0435\u043d\u044c\u0448\u0435. \u0422\u0430\u043a \u0447\u0442\u043e \u0432\u044b \u043d\u0435 \u0442\u0435\u0440\u044f\u0435\u0442\u0435 \u0440\u043e\u0432\u043d\u044b\u043c \u0441\u0447\u0451\u0442\u043e\u043c \u043d\u0438\u0447\u0435\u0433\u043e \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043f\u0440\u043e\u0441\u043b\u0443\u0448\u0438\u0432\u0430\u043d\u0438\u044f, \u0430 \u0441\u0435\u0440\u0432\u0435\u0440 \u0441\u043a\u0430\u0436\u0435\u0442 \u0432\u0430\u043c \u0441\u043f\u0430\u0441\u0438\u0431\u043e.<\/p>\n<p><strong>\u0414\u043b\u044f \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0443\u044e\u0449\u0438\u0445\u0441\u044f:<\/strong> <em>Opus \u2014 \u044d\u0442\u043e open-source \u043a\u043e\u0434\u0435\u043a \u043e\u0442 IETF (RFC 6716), \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0439 \u0432 YouTube, WhatsApp, Discord \u0438 WebRTC. \u041d\u0430 \u0431\u0438\u0442\u0440\u0435\u0439\u0442\u0435 128 kbps \u0434\u043b\u044f \u0441\u0442\u0435\u0440\u0435\u043e \u043e\u043d \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0432 \u0433\u0438\u0431\u0440\u0438\u0434\u043d\u043e\u043c \u0440\u0435\u0436\u0438\u043c\u0435: \u043d\u0438\u0436\u043d\u0438\u0435 \u0447\u0430\u0441\u0442\u043e\u0442\u044b \u043a\u043e\u0434\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u043b\u0438\u043d\u0435\u0439\u043d\u044b\u043c SILK-\u043a\u043e\u0434\u0435\u043a\u043e\u043c, \u0432\u0435\u0440\u0445\u043d\u0438\u0435 \u2014 MDCT \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 CELT. \u041f\u0440\u043e\u0449\u0435 \u0433\u043e\u0432\u043e\u0440\u044f \u2014 \u044d\u0442\u043e \u043b\u0443\u0447\u0448\u0435\u0435, \u0447\u0442\u043e \u0435\u0441\u0442\u044c \u0432 lossy audio \u043d\u0430 \u0441\u0435\u0433\u043e\u0434\u043d\u044f.<\/em><\/p>\n<h3>\u0410\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430 \u043f\u0440\u043e\u0435\u043a\u0442\u0430<\/h3>\n<p><strong>\u041f\u0440\u043e\u0435\u043a\u0442 \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0438\u0437 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u043c\u043e\u0434\u0443\u043b\u0435\u0439:<\/strong><\/p>\n<pre><code>config.py          \u2014 \u043f\u0440\u0435\u0441\u0435\u0442\u044b FFT \u0438 \u0434\u0435\u0444\u043e\u043b\u0442\u043d\u044b\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438encoder.py         \u2014 \u0430\u0443\u0434\u0438\u043e \u2192 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435decoder.py         \u2014 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u2192 \u0430\u0443\u0434\u0438\u043ephase_generator.py \u2014 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0413\u0440\u0438\u0444\u0444\u0438\u043d\u0430-\u041b\u0438\u043c\u0430 \u0434\u043b\u044f \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u0444\u0430\u0437\u044btransforms.py      \u2014 Mid\/Side \u2194 Left\/Right \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u044futils.py           \u2014 \u0443\u0442\u0438\u043b\u0438\u0442\u044b (JSON, \u0440\u0430\u0437\u043c\u0435\u0440\u044b \u0444\u0430\u0439\u043b\u043e\u0432, \u043e\u0447\u0438\u0441\u0442\u043a\u0430)main.py            \u2014 \u043e\u0434\u0438\u043d\u043e\u0447\u043d\u044b\u0439 \u043f\u0440\u043e\u0433\u043e\u043d \u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d\u0430test_runner.py     \u2014 \u0431\u0430\u0442\u0447-\u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0444\u043e\u0440\u043c\u0430\u0442\u043e\u0432 \u0441\u0436\u0430\u0442\u0438\u044f<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:87px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<h3>\u041e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d (main.py)<\/h3>\n<p><strong>\u041f\u043e\u043b\u043d\u044b\u0439 \u0446\u0438\u043a\u043b \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0430\u043a:<\/strong><\/p>\n<pre><code class=\"python\">def full_pipeline(config: dict):    \"\"\"\u041f\u043e\u043b\u043d\u044b\u0439 \u0446\u0438\u043a\u043b: \u0430\u0443\u0434\u0438\u043e -&gt; \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 -&gt; \u0430\u0443\u0434\u0438\u043e (\u0441 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0435\u0439 \u0444\u0430\u0437\u044b).\"\"\"    preset = PRESETS[config[\"active_preset\"]]    n_fft = preset[\"N_FFT\"]    hop_length = preset[\"HOP_LENGTH\"]        # \u0428\u0430\u0433 1: MP3 -&gt; WAV    wav_temp = Path(data_dir) \/ \"temp_stereo.wav\"    mp3_to_wav(config[\"mp3_file\"], str(wav_temp))        # \u0428\u0430\u0433 2: WAV -&gt; \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435    image_path = str(Path(data_dir) \/ f\"spectrogram.{ext}\")    metadata, _ = audio_to_image(wav_temp, image_path, n_fft, hop_length, config)        # \u0428\u0430\u0433 3: \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 -&gt; WAV    recovered_path = str(Path(data_dir) \/ \"recovered.wav\")    audio_recovered = image_to_audio(image_path, recovered_path, metadata)        return audio_recovered<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<h3>\u041a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0432 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 (encoder.py)<\/h3>\n<p><strong>\u041a\u043b\u044e\u0447\u0435\u0432\u043e\u0439 \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442 \u2014 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0430\u0443\u0434\u0438\u043e \u0432 RGB-\u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0443:<\/strong><\/p>\n<pre><code class=\"python\">def audio_to_image(wav_path, image_path, n_fft, hop_length, config):    y, sr = librosa.load(wav_path, sr=44100, mono=False)        # Mid\/Side \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435    mid = (y[0] + y[1]) * 0.5    side = (y[0] - y[1]) * 0.5        # STFT    D_mid = librosa.stft(mid, n_fft=n_fft, hop_length=hop_length, window='hann')    D_side = librosa.stft(side, n_fft=n_fft, hop_length=hop_length, window='hann')        # \u0412 \u0434\u0435\u0446\u0438\u0431\u0435\u043b\u044b \u0438 \u0432 0..255    mag_mid_db = librosa.amplitude_to_db(np.abs(D_mid), ref=np.max)    mag_mid_norm = np.clip((mag_mid_db - mag_min) \/ (-mag_min) * 255, 0, 255).astype(np.uint8)        # RGB: G=Mid, B=Side, R=0    rgb = np.zeros((n_freqs, n_frames, 3), dtype=np.uint8)    rgb[:, :, 1] = mag_mid_norm   # \u0417\u0435\u043b\u0451\u043d\u044b\u0439 = Mid    rgb[:, :, 2] = mag_side_norm  # \u0421\u0438\u043d\u0438\u0439 = Side        img = Image.fromarray(np.flipud(rgb), 'RGB')    # ... \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u0447\u0435\u0440\u0435\u0437 PIL \u0441 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u043c\u0438 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0430<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p><strong>\u0410\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0441\u0440\u0435\u0437 \u0432\u044b\u0441\u043e\u043a\u0438\u0445 \u0447\u0430\u0441\u0442\u043e\u0442 \u2014 \u044d\u043a\u043e\u043d\u043e\u043c\u0438\u043c \u043c\u0435\u0441\u0442\u043e, \u043e\u0442\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u044f \u0442\u043e, \u0447\u0442\u043e \u0432\u0441\u0451 \u0440\u0430\u0432\u043d\u043e \u043d\u0435 \u0441\u043b\u044b\u0448\u043d\u043e:<\/strong><\/p>\n<pre><code class=\"python\">def _find_high_cut_auto(mag_mid_db, mag_side_db, freqs, threshold_db=-80, freq_min=8000):    mean_mag = np.maximum(np.mean(mag_mid_db, axis=1), np.mean(mag_side_db, axis=1))    # \u0421\u0433\u043b\u0430\u0436\u0438\u0432\u0430\u043d\u0438\u0435 \u0438 \u043f\u043e\u0438\u0441\u043a \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u043e\u0433\u043e \u043f\u0430\u0434\u0435\u043d\u0438\u044f \u043d\u0438\u0436\u0435 \u043f\u043e\u0440\u043e\u0433\u0430    below_threshold = mean_mag_smooth &lt; effective_threshold    for i in range(min_idx, len(freqs) - 5):        if np.all(below_threshold[i:i+5]):            return freqs[i], i<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<h3>\u0414\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0438 \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u0444\u0430\u0437\u044b (decoder.py + phase_generator.py)<\/h3>\n<p><strong>\u0421\u0430\u043c\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u2014 \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u0443\u0442\u0435\u0440\u044f\u043d\u043d\u043e\u0439 \u0444\u0430\u0437\u044b:<\/strong><\/p>\n<pre><code class=\"python\">def image_to_audio(image_path, output_wav_path, metadata):    img = Image.open(image_path).convert('RGB')    arr = np.array(img, dtype=np.float32)        # \u0414\u043e\u0441\u0442\u0430\u0451\u043c Mid \u0438 Side \u0438\u0437 \u0437\u0435\u043b\u0451\u043d\u043e\u0433\u043e \u0438 \u0441\u0438\u043d\u0435\u0433\u043e \u043a\u0430\u043d\u0430\u043b\u043e\u0432    mag_mid_norm = arr[:, :, 1] \/ 255.0  # \u0417\u0435\u043b\u0451\u043d\u044b\u0439    mag_side_norm = arr[:, :, 2] \/ 255.0  # \u0421\u0438\u043d\u0438\u0439        # \u041e\u0431\u0440\u0430\u0442\u043d\u043e \u0438\u0437 dB \u0432 \u0430\u043c\u043f\u043b\u0438\u0442\u0443\u0434\u0443    mag_mid = librosa.db_to_amplitude(mag_mid_db, ref=ref_mid)        # \u0413\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u0444\u0430\u0437\u044b \u0447\u0435\u0440\u0435\u0437 Griffin-Lim (fast, parallel)    phase_mid, phase_side = griffin_lim_stereo_parallel(        mag_mid, mag_side, n_fft, hop_length,        iterations=5000, mode='fast'    )        # \u0412\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u043a\u043e\u043c\u043f\u043b\u0435\u043a\u0441\u043d\u043e\u0433\u043e \u0441\u043f\u0435\u043a\u0442\u0440\u0430 \u0438 \u043e\u0431\u0440\u0430\u0442\u043d\u043e\u0435 STFT    D_mid = mag_mid * np.exp(1j * phase_mid)    y_mid = librosa.istft(D_mid, hop_length=hop_length, window='hann')        # Mid\/Side -&gt; Left\/Right    left = mid + side    right = mid - side        return np.stack([left, right], axis=1)<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p><strong>\u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0413\u0440\u0438\u0444\u0444\u0438\u043d\u0430-\u041b\u0438\u043c\u0430 (fast-\u0432\u0435\u0440\u0441\u0438\u044f \u0441 memory layout \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f\u043c\u0438):<\/strong><\/p>\n<pre><code class=\"python\">def griffin_lim_fast(magnitude, n_fft, hop_length, iterations=50, ...):    rng = np.random.RandomState(random_seed)    angles = rng.uniform(-np.pi, np.pi, magnitude.shape).astype(np.float32)        for i in range(iterations):        # \u0421\u043e\u0431\u0438\u0440\u0430\u0435\u043c \u043a\u043e\u043c\u043f\u043b\u0435\u043a\u0441\u043d\u044b\u0439 \u0441\u043f\u0435\u043a\u0442\u0440 \u0441 \u0442\u0435\u043a\u0443\u0449\u0435\u0439 \u0444\u0430\u0437\u043e\u0439        stft_matrix = magnitude * np.exp(1j * angles)        # ISTFT -&gt; STFT \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u043d\u043e\u0432\u043e\u0439 \u043e\u0446\u0435\u043d\u043a\u0438 \u0444\u0430\u0437\u044b        y = librosa.istft(stft_matrix, hop_length=hop_length)        D_new = librosa.stft(y, n_fft=n_fft, hop_length=hop_length)        angles = np.angle(D_new)                # Early stopping        if improvement &lt; early_stop_threshold:            patience_counter += 1            if patience_counter &gt;= early_stop_patience:                return best_angles        return angles<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<h3>\u0422\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0444\u043e\u0440\u043c\u0430\u0442\u043e\u0432 \u0441\u0436\u0430\u0442\u0438\u044f (test_runner.py)<\/h3>\n<p><strong>\u042f \u043d\u0430\u043f\u0438\u0441\u0430\u043b \u0430\u0432\u0442\u043e\u0442\u0435\u0441\u0442\u0435\u0440, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0444\u043e\u0440\u043c\u0430\u0442\u0430 \u0438 \u0443\u0440\u043e\u0432\u043d\u044f \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0430:<\/strong><\/p>\n<ul>\n<li>\n<p>\u041a\u043e\u043d\u0432\u0435\u0440\u0442\u0438\u0440\u0443\u0435\u0442 MP3 \u2192 WAV<\/p>\n<\/li>\n<li>\n<p>\u041a\u043e\u0434\u0438\u0440\u0443\u0435\u0442 \u0432 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435<\/p>\n<\/li>\n<li>\n<p>\u0414\u0435\u043a\u043e\u0434\u0438\u0440\u0443\u0435\u0442 \u043e\u0431\u0440\u0430\u0442\u043d\u043e \u0432 WAV<\/p>\n<\/li>\n<li>\n<p>\u0421\u0447\u0438\u0442\u0430\u0435\u0442 \u0440\u0430\u0437\u043c\u0435\u0440 \u0444\u0430\u0439\u043b\u0430 \u0438 \u0432\u0440\u0435\u043c\u044f<\/p>\n<\/li>\n<\/ul>\n<p><strong>\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u044e\u0442\u0441\u044f \u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0435 \u043f\u0430\u043f\u043a\u0438 \u0441 \u043e\u0442\u0447\u0451\u0442\u0430\u043c\u0438. \u0412\u043e\u0442 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u0442\u0435\u0441\u0442\u043e\u0432:<\/strong><\/p>\n<pre><code class=\"python\">TEST_CONFIGS = {    \"png_max\":       {\"output_format\": \"png\",   \"output_quality\": 9,   \"output_lossless\": True},    \"jpeg_q100\":     {\"output_format\": \"jpeg\",  \"output_quality\": 100},    \"jpeg_q75\":      {\"output_format\": \"jpeg\",  \"output_quality\": 75},    \"jpeg_q50\":      {\"output_format\": \"jpeg\",  \"output_quality\": 50},    \"jpeg_q25\":      {\"output_format\": \"jpeg\",  \"output_quality\": 25},    \"jpeg_q5\":       {\"output_format\": \"jpeg\",  \"output_quality\": 5},    \"webp_q100\":     {\"output_format\": \"webp\",  \"output_quality\": 100},    # ... \u0438 \u0442\u0430\u043a \u0434\u0430\u043b\u0435\u0435 \u0434\u043b\u044f WebP \u0438 AVIF}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<h3>\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u0442\u0435\u0441\u0442\u043e\u0432<\/h3>\n<p><strong>\u0412\u0430\u0436\u043d\u043e\u0435 \u0437\u0430\u043c\u0435\u0447\u0430\u043d\u0438\u0435:<\/strong> <em>SNR \u0432 \u044d\u0442\u0438\u0445 \u0442\u0435\u0441\u0442\u0430\u0445 \u043d\u0435 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0435\u043d, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043d\u044b\u0439 \u0441\u0438\u0433\u043d\u0430\u043b \u0441\u0434\u0432\u0438\u043d\u0443\u0442 \u043f\u043e \u0444\u0430\u0437\u0435 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u0430 \u2014 \u043f\u0438\u043a\u0438 \u043c\u043e\u0433\u0443\u0442 \u043d\u0435 \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u0442\u044c, \u0445\u043e\u0442\u044f \u0437\u0432\u0443\u0447\u0438\u0442 \u0432\u0441\u0451 \u043f\u0440\u0438\u0435\u043c\u043b\u0435\u043c\u043e. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043e\u0446\u0435\u043d\u0438\u0432\u0430\u0442\u044c \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u043e \u043b\u0443\u0447\u0448\u0435 \u043d\u0430 \u0441\u043b\u0443\u0445 (\u0430\u0443\u0434\u0438\u043e\u043f\u0440\u0438\u043c\u0435\u0440\u044b \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u044b \u043a \u0441\u0442\u0430\u0442\u044c\u0435 \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0442\u0435\u0441\u0442\u0430).<\/em><\/p>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<th>\n<p align=\"left\">\u0422\u0435\u0441\u0442<\/p>\n<\/th>\n<th>\n<p align=\"left\">\u0420\u0430\u0437\u043c\u0435\u0440 (MB)<\/p>\n<\/th>\n<th>\n<p align=\"left\">\u0412\u0440\u0435\u043c\u044f \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f (\u0441\u0435\u043a)<\/p>\n<\/th>\n<th>\n<p align=\"left\">\u0412\u0440\u0435\u043c\u044f \u0434\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f (\u0441\u0435\u043a)<\/p>\n<\/th>\n<th>\n<p align=\"left\">\u0424\u0430\u0439\u043b\u044b<\/p>\n<\/th>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">PNG (lossless)<\/p>\n<\/td>\n<td>\n<p align=\"left\">8.47<\/p>\n<\/td>\n<td>\n<p align=\"left\">1.9<\/p>\n<\/td>\n<td>\n<p align=\"left\">299.4<\/p>\n<\/td>\n<td>\n<p align=\"left\"><a href=\"https:\/\/dlike.ru\/media\/blog\/pic_test\/png_max\/spectrogram.png\" rel=\"noopener noreferrer nofollow\">spectrogram.png<\/a> \/ <a href=\"https:\/\/dlike.ru\/media\/blog\/pic_test\/png_max\/recovered.opus\" rel=\"noopener noreferrer nofollow\">recovered.opus<\/a><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">WebP lossless<\/p>\n<\/td>\n<td>\n<p align=\"left\">6.62<\/p>\n<\/td>\n<td>\n<p align=\"left\">13.2<\/p>\n<\/td>\n<td>\n<p align=\"left\">294.2<\/p>\n<\/td>\n<td>\n<p align=\"left\"><a href=\"https:\/\/dlike.ru\/media\/blog\/pic_test\/webp_lossless\/spectrogram.webp\" rel=\"noopener noreferrer nofollow\">spectrogram.webp<\/a> \/ <a href=\"https:\/\/dlike.ru\/media\/blog\/pic_test\/webp_lossless\/recovered.opus\" rel=\"noopener noreferrer nofollow\">recovered.opus<\/a><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">WebP q100<\/p>\n<\/td>\n<td>\n<p align=\"left\">3.16<\/p>\n<\/td>\n<td>\n<p align=\"left\">2.8<\/p>\n<\/td>\n<td>\n<p align=\"left\">185.5<\/p>\n<\/td>\n<td>\n<p align=\"left\"><a href=\"https:\/\/dlike.ru\/media\/blog\/pic_test\/webp_q100\/spectrogram.webp\" rel=\"noopener noreferrer nofollow\">spectrogram.webp<\/a> \/ <a href=\"https:\/\/dlike.ru\/media\/blog\/pic_test\/webp_q100\/recovered.opus\" rel=\"noopener noreferrer nofollow\">recovered.opus<\/a><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">WebP q75<\/p>\n<\/td>\n<td>\n<p align=\"left\">0.66<\/p>\n<\/td>\n<td>\n<p align=\"left\">1.7<\/p>\n<\/td>\n<td>\n<p align=\"left\">170.0<\/p>\n<\/td>\n<td>\n<p align=\"left\"><a href=\"https:\/\/dlike.ru\/media\/blog\/pic_test\/webp_q75\/spectrogram.webp\" rel=\"noopener noreferrer nofollow\">spectrogram.webp<\/a> \/ <a href=\"https:\/\/dlike.ru\/media\/blog\/pic_test\/webp_q75\/recovered.opus\" rel=\"noopener noreferrer nofollow\">recovered.opus<\/a><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">WebP q50<\/p>\n<\/td>\n<td>\n<p align=\"left\">0.35<\/p>\n<\/td>\n<td>\n<p align=\"left\">1.4<\/p>\n<\/td>\n<td>\n<p align=\"left\">164.3<\/p>\n<\/td>\n<td>\n<p align=\"left\"><a href=\"https:\/\/dlike.ru\/media\/blog\/pic_test\/webp_q50\/spectrogram.webp\" rel=\"noopener noreferrer nofollow\">spectrogram.webp<\/a> \/ <a href=\"https:\/\/dlike.ru\/media\/blog\/pic_test\/webp_q50\/recovered.opus\" rel=\"noopener noreferrer nofollow\">recovered.opus<\/a><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">WebP q25<\/p>\n<\/td>\n<td>\n<p align=\"left\">0.16<\/p>\n<\/td>\n<td>\n<p align=\"left\">1.2<\/p>\n<\/td>\n<td>\n<p align=\"left\">162.5<\/p>\n<\/td>\n<td>\n<p align=\"left\"><a href=\"https:\/\/dlike.ru\/media\/blog\/pic_test\/webp_q25\/spectrogram.webp\" rel=\"noopener noreferrer nofollow\">spectrogram.webp<\/a> \/ <a href=\"https:\/\/dlike.ru\/media\/blog\/pic_test\/webp_q25\/recovered.opus\" rel=\"noopener noreferrer nofollow\">recovered.opus<\/a><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">WebP q5<\/p>\n<\/td>\n<td>\n<p align=\"left\">0.05<\/p>\n<\/td>\n<td>\n<p align=\"left\">1.0<\/p>\n<\/td>\n<td>\n<p align=\"left\">176.7<\/p>\n<\/td>\n<td>\n<p align=\"left\"><a href=\"https:\/\/dlike.ru\/media\/blog\/pic_test\/webp_q5\/spectrogram.webp\" rel=\"noopener noreferrer nofollow\">spectrogram.webp<\/a> \/ <a href=\"https:\/\/dlike.ru\/media\/blog\/pic_test\/webp_q5\/recovered.opus\" rel=\"noopener noreferrer nofollow\">recovered.opus<\/a><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">JPEG q100<\/p>\n<\/td>\n<td>\n<p align=\"left\">4.57<\/p>\n<\/td>\n<td>\n<p align=\"left\">1.1<\/p>\n<\/td>\n<td>\n<p align=\"left\">205.7<\/p>\n<\/td>\n<td>\n<p align=\"left\"><a href=\"https:\/\/dlike.ru\/media\/blog\/pic_test\/jpeg_q100\/spectrogram.jpg\" rel=\"noopener noreferrer nofollow\">spectrogram.jpg<\/a> \/ <a href=\"https:\/\/dlike.ru\/media\/blog\/pic_test\/jpeg_q100\/recovered.opus\" rel=\"noopener noreferrer nofollow\">recovered.opus<\/a><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">JPEG q75<\/p>\n<\/td>\n<td>\n<p align=\"left\">0.76<\/p>\n<\/td>\n<td>\n<p align=\"left\">0.5<\/p>\n<\/td>\n<td>\n<p align=\"left\">158.9<\/p>\n<\/td>\n<td>\n<p align=\"left\"><a href=\"https:\/\/dlike.ru\/media\/blog\/pic_test\/jpeg_q75\/spectrogram.jpg\" rel=\"noopener noreferrer nofollow\">spectrogram.jpg<\/a> \/ <a href=\"https:\/\/dlike.ru\/media\/blog\/pic_test\/jpeg_q75\/recovered.opus\" rel=\"noopener noreferrer nofollow\">recovered.opus<\/a><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">JPEG q50<\/p>\n<\/td>\n<td>\n<p align=\"left\">0.45<\/p>\n<\/td>\n<td>\n<p align=\"left\">0.5<\/p>\n<\/td>\n<td>\n<p align=\"left\">139.3<\/p>\n<\/td>\n<td>\n<p align=\"left\"><a href=\"https:\/\/dlike.ru\/media\/blog\/pic_test\/jpeg_q50\/spectrogram.jpg\" rel=\"noopener noreferrer nofollow\">spectrogram.jpg<\/a> \/ <a href=\"https:\/\/dlike.ru\/media\/blog\/pic_test\/jpeg_q50\/recovered.opus\" rel=\"noopener noreferrer nofollow\">recovered.opus<\/a><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">JPEG q25<\/p>\n<\/td>\n<td>\n<p align=\"left\">0.22<\/p>\n<\/td>\n<td>\n<p align=\"left\">0.5<\/p>\n<\/td>\n<td>\n<p align=\"left\">162.3<\/p>\n<\/td>\n<td>\n<p align=\"left\"><a href=\"https:\/\/dlike.ru\/media\/blog\/pic_test\/jpeg_q25\/spectrogram.jpg\" rel=\"noopener noreferrer nofollow\">spectrogram.jpg<\/a> \/ <a href=\"https:\/\/dlike.ru\/media\/blog\/pic_test\/jpeg_q25\/recovered.opus\" rel=\"noopener noreferrer nofollow\">recovered.opus<\/a><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">JPEG q5<\/p>\n<\/td>\n<td>\n<p align=\"left\">0.04<\/p>\n<\/td>\n<td>\n<p align=\"left\">0.5<\/p>\n<\/td>\n<td>\n<p align=\"left\">203.5<\/p>\n<\/td>\n<td>\n<p align=\"left\"><a href=\"https:\/\/dlike.ru\/media\/blog\/pic_test\/jpeg_q5\/spectrogram.jpg\" rel=\"noopener noreferrer nofollow\">spectrogram.jpg<\/a> \/ <a href=\"https:\/\/dlike.ru\/media\/blog\/pic_test\/jpeg_q5\/recovered.opus\" rel=\"noopener noreferrer nofollow\">recovered.opus<\/a><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">AVIF lossless<\/p>\n<\/td>\n<td>\n<p align=\"left\">4.06<\/p>\n<\/td>\n<td>\n<p align=\"left\">21.1<\/p>\n<\/td>\n<td>\n<p align=\"left\">194.3<\/p>\n<\/td>\n<td>\n<p align=\"left\"><a href=\"https:\/\/dlike.ru\/media\/blog\/pic_test\/avif_lossless\/spectrogram.avif\" rel=\"noopener noreferrer nofollow\">spectrogram.avif<\/a> \/ <a href=\"https:\/\/dlike.ru\/media\/blog\/pic_test\/avif_lossless\/recovered.opus\" rel=\"noopener noreferrer nofollow\">recovered.opus<\/a><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">AVIF q100<\/p>\n<\/td>\n<td>\n<p align=\"left\">4.06<\/p>\n<\/td>\n<td>\n<p align=\"left\">20.9<\/p>\n<\/td>\n<td>\n<p align=\"left\">188.1<\/p>\n<\/td>\n<td>\n<p align=\"left\"><a href=\"https:\/\/dlike.ru\/media\/blog\/pic_test\/avif_q100\/spectrogram.avif\" rel=\"noopener noreferrer nofollow\">spectrogram.avif<\/a> \/ <a href=\"https:\/\/dlike.ru\/media\/blog\/pic_test\/avif_q100\/recovered.opus\" rel=\"noopener noreferrer nofollow\">recovered.opus<\/a><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">AVIF q75<\/p>\n<\/td>\n<td>\n<p align=\"left\">1.27<\/p>\n<\/td>\n<td>\n<p align=\"left\">40.4<\/p>\n<\/td>\n<td>\n<p align=\"left\">164.0<\/p>\n<\/td>\n<td>\n<p align=\"left\"><a href=\"https:\/\/dlike.ru\/media\/blog\/pic_test\/avif_q75\/spectrogram.avif\" rel=\"noopener noreferrer nofollow\">spectrogram.avif<\/a> \/ <a href=\"https:\/\/dlike.ru\/media\/blog\/pic_test\/avif_q75\/recovered.opus\" rel=\"noopener noreferrer nofollow\">recovered.opus<\/a><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">AVIF q50<\/p>\n<\/td>\n<td>\n<p align=\"left\">0.28<\/p>\n<\/td>\n<td>\n<p align=\"left\">30.8<\/p>\n<\/td>\n<td>\n<p align=\"left\">157.9<\/p>\n<\/td>\n<td>\n<p align=\"left\"><a href=\"https:\/\/dlike.ru\/media\/blog\/pic_test\/avif_q50\/spectrogram.avif\" rel=\"noopener noreferrer nofollow\">spectrogram.avif<\/a> \/ <a href=\"https:\/\/dlike.ru\/media\/blog\/pic_test\/avif_q50\/recovered.opus\" rel=\"noopener noreferrer nofollow\">recovered.opus<\/a><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">AVIF q25<\/p>\n<\/td>\n<td>\n<p align=\"left\">0.02<\/p>\n<\/td>\n<td>\n<p align=\"left\">11.6<\/p>\n<\/td>\n<td>\n<p align=\"left\">171.1<\/p>\n<\/td>\n<td>\n<p align=\"left\"><a href=\"https:\/\/dlike.ru\/media\/blog\/pic_test\/avif_q25\/spectrogram.avif\" rel=\"noopener noreferrer nofollow\">spectrogram.avif<\/a> \/ <a href=\"https:\/\/dlike.ru\/media\/blog\/pic_test\/avif_q25\/recovered.opus\" rel=\"noopener noreferrer nofollow\">recovered.opus<\/a><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">AVIF q5<\/p>\n<\/td>\n<td>\n<p align=\"left\">0.004<\/p>\n<\/td>\n<td>\n<p align=\"left\">5.1<\/p>\n<\/td>\n<td>\n<p align=\"left\">176.1<\/p>\n<\/td>\n<td>\n<p align=\"left\"><a href=\"https:\/\/dlike.ru\/media\/blog\/pic_test\/avif_q5\/spectrogram.avif\" rel=\"noopener noreferrer nofollow\">spectrogram.avif<\/a> \/ <a href=\"https:\/\/dlike.ru\/media\/blog\/pic_test\/avif_q5\/recovered.opus\" rel=\"noopener noreferrer nofollow\">recovered.opus<\/a><\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p><strong>\u0418\u0441\u0445\u043e\u0434\u043d\u044b\u0439 MP3:<\/strong> <\/p>\n<p>44.4 MB (264 \u0441\u0435\u043a, \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u043d\u044b\u0439 \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442 \u2014 70 \u0441\u0435\u043a) \u0420\u0430\u0437\u043c\u0435\u0440 \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043d\u043e\u0433\u043e WAV (70 \u0441\u0435\u043a \u0441\u0442\u0435\u0440\u0435\u043e 44.1\/16): ~12.1 MB \u0410\u0443\u0434\u0438\u043e\u043f\u0440\u0438\u043c\u0435\u0440\u044b \u0432\u044b\u043b\u043e\u0436\u0435\u043d\u044b \u0432 Opus 128 kbps: ~1.1 MB \u043a\u0430\u0436\u0434\u044b\u0439<\/p>\n<h3>\u0410\u043d\u0430\u043b\u0438\u0437<\/h3>\n<p><strong>PNG \u0438 lossless-\u0444\u043e\u0440\u043c\u0430\u0442\u044b.<\/strong> PNG (8.47 MB) \u0438 WebP lossless (6.62 MB) \u2014 \u0441\u0430\u043c\u044b\u0435 \u0431\u043e\u043b\u044c\u0448\u0438\u0435, \u043d\u043e \u044d\u0442\u043e \u0447\u0435\u0441\u0442\u043d\u043e\u0435 \u0441\u0436\u0430\u0442\u0438\u0435 \u0431\u0435\u0437 \u043f\u043e\u0442\u0435\u0440\u044c. \u0418\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e, \u0447\u0442\u043e WebP lossless \u0441\u0436\u0430\u043b \u043b\u0443\u0447\u0448\u0435 PNG \u2014 \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u043d\u0430 22%. \u041f\u0440\u0438 \u044d\u0442\u043e\u043c PNG \u043a\u043e\u0434\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0431\u044b\u0441\u0442\u0440\u0435\u0435 \u0432\u0441\u0435\u0445 \u2014 1.9 \u0441\u0435\u043a\u0443\u043d\u0434\u044b \u043f\u0440\u043e\u0442\u0438\u0432 13.2 \u0443 WebP lossless.<\/p>\n<p><strong>Lossy-\u0441\u0436\u0430\u0442\u0438\u0435: \u044d\u043a\u0441\u0442\u0440\u0435\u043c\u0430\u043b\u044c\u043d\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f.<\/strong> \u0421\u0430\u043c\u044b\u0439 \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u0438\u0439 \u0444\u0430\u0439\u043b \u2014 AVIF q5 (4 KB!). \u041d\u0430 70 \u0441\u0435\u043a\u0443\u043d\u0434 \u0441\u0442\u0435\u0440\u0435\u043e-\u0430\u0443\u0434\u0438\u043e! WebP q5 \u0432\u044b\u0434\u0430\u043b 51 KB, JPEG q5 \u2014 43 KB. \u042d\u0442\u043e \u0441\u0436\u0430\u0442\u0438\u0435 \u0432 ~1000 \u0440\u0430\u0437 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e WAV \u0438 \u0432 ~250 \u0440\u0430\u0437 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e MP3 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0430. \u0427\u0435\u0442\u044b\u0440\u0435 \u043a\u0438\u043b\u043e\u0431\u0430\u0439\u0442\u0430 \u043d\u0430 \u043c\u0438\u043d\u0443\u0442\u0443 \u0441 \u043b\u0438\u0448\u043d\u0438\u043c \u0437\u0432\u0443\u043a\u0430 \u2014 \u0441 \u0443\u043c\u0430 \u0441\u043e\u0439\u0442\u0438.<\/p>\n<p><strong>\u0421\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f.<\/strong> JPEG \u2014 \u0430\u0431\u0441\u043e\u043b\u044e\u0442\u043d\u044b\u0439 \u0447\u0435\u043c\u043f\u0438\u043e\u043d: 0.5 \u0441\u0435\u043a\u0443\u043d\u0434\u044b \u043d\u0430 \u043b\u044e\u0431\u043e\u0435 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u043e. AVIF, \u043d\u0430\u043e\u0431\u043e\u0440\u043e\u0442, \u0441\u0430\u043c\u044b\u0439 \u043c\u0435\u0434\u043b\u0435\u043d\u043d\u044b\u0439 \u2014 \u0434\u043e 40 \u0441\u0435\u043a\u0443\u043d\u0434 \u043d\u0430 \u0432\u044b\u0441\u043e\u043a\u043e\u043c \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435. \u041e\u043d\u043e \u0438 \u043f\u043e\u043d\u044f\u0442\u043d\u043e: AVIF \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0431\u043e\u043b\u0435\u0435 \u0441\u043b\u043e\u0436\u043d\u044b\u0439 \u043a\u043e\u0434\u0435\u043a (\u0432\u043d\u0443\u0442\u0440\u0438 \u2014 AV1), \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0434\u0435\u043b\u0430\u0435\u0442 \u043d\u0430\u043c\u043d\u043e\u0433\u043e \u0431\u043e\u043b\u044c\u0448\u0435 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0439 \u0434\u043b\u044f \u0434\u043e\u0441\u0442\u0438\u0436\u0435\u043d\u0438\u044f \u0442\u0430\u043a\u043e\u0439 \u043f\u043b\u043e\u0442\u043d\u043e\u0441\u0442\u0438 \u0441\u0436\u0430\u0442\u0438\u044f.<\/p>\n<p><strong>\u0421\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u0434\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f.<\/strong> \u0412\u0440\u0435\u043c\u044f \u0434\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u043e\u0447\u0442\u0438 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u043e\u0435 (~160\u2013200 \u0441\u0435\u043a), \u0442\u0430\u043a \u043a\u0430\u043a \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u0441\u044a\u0435\u0434\u0430\u0435\u0442 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0413\u0440\u0438\u0444\u0444\u0438\u043d\u0430-\u041b\u0438\u043c\u0430 (\u0434\u043e 5000 \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0439), \u0430 \u043d\u0435 \u0447\u0442\u0435\u043d\u0438\u0435 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0438. JPEG \u0447\u0443\u0442\u044c \u043c\u0435\u0434\u043b\u0435\u043d\u043d\u0435\u0435 \u0438\u0437-\u0437\u0430 \u0445\u0430\u0440\u0430\u043a\u0442\u0435\u0440\u043d\u044b\u0445 \u0431\u043b\u043e\u0447\u043d\u044b\u0445 \u0430\u0440\u0442\u0435\u0444\u0430\u043a\u0442\u043e\u0432 \u2014 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0443 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0431\u043e\u043b\u044c\u0448\u0435 \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0439, \u0447\u0442\u043e\u0431\u044b \u00ab\u0441\u0433\u043b\u0430\u0434\u0438\u0442\u044c\u00bb \u0438\u0445.<\/p>\n<p><strong>\u0418\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u0435 \u043d\u0430\u0431\u043b\u044e\u0434\u0435\u043d\u0438\u044f:<\/strong><\/p>\n<p>WebP q100 (3.16 MB) \u0438 AVIF q100 (4.06 MB) \u0434\u0430\u044e\u0442 \u0437\u0430\u043c\u0435\u0442\u043d\u043e \u0431\u043e\u043b\u044c\u0448\u0438\u0439 \u0440\u0430\u0437\u043c\u0435\u0440, \u0447\u0435\u043c JPEG q75 (0.76 MB), \u043d\u043e \u0437\u0432\u0443\u0447\u0430\u0442\u2026 \u043f\u043e-\u0440\u0430\u0437\u043d\u043e\u043c\u0443 \u2014 &#8212; JPEG \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u0445\u0430\u0440\u0430\u043a\u0442\u0435\u0440\u043d\u044b\u0439 \u00ab\u0437\u0432\u043e\u043d\u00bb, \u0430 WebP \u0438 AVIF \u0430\u0440\u0442\u0435\u0444\u0430\u0447\u0430\u0442 \u0431\u043e\u043b\u0435\u0435 \u00ab\u0433\u043b\u0430\u0434\u043a\u043e\u00bb<\/p>\n<ul>\n<li>\n<p>AVIF lossless \u0438 AVIF q100 \u0434\u0430\u043b\u0438 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u044b\u0439 \u0440\u0430\u0437\u043c\u0435\u0440 (4.06 MB) \u2014 \u0432\u0438\u0434\u0438\u043c\u043e, \u043d\u0430 \u044d\u0442\u0438\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u043a\u043e\u0434\u0435\u0440 \u0440\u0435\u0448\u0438\u043b, \u0447\u0442\u043e q100 \u044d\u043a\u0432\u0438\u0432\u0430\u043b\u0435\u043d\u0442\u0435\u043d lossless<\/p>\n<\/li>\n<li>\n<p>WebP q5 \u043f\u043e\u043a\u0430\u0437\u0430\u043b \u043f\u0430\u0440\u0430\u0434\u043e\u043a\u0441\u0430\u043b\u044c\u043d\u043e \u043d\u0435\u043f\u043b\u043e\u0445\u043e\u0435 \u0437\u0432\u0443\u0447\u0430\u043d\u0438\u0435 \u043f\u0440\u0438 51 KB \u2014 \u0434\u043b\u044f \u0433\u043e\u043b\u043e\u0441\u043e\u0432\u044b\u0445 \u0437\u0430\u043f\u0438\u0441\u043e\u043a \u0438\u043b\u0438 \u043f\u043e\u0434\u043a\u0430\u0441\u0442\u043e\u0432 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e<\/p>\n<\/li>\n<li>\n<p>JPEG q5 (43 KB) \u0437\u0432\u0443\u0447\u0438\u0442 \u043e\u0442\u043a\u0440\u043e\u0432\u0435\u043d\u043d\u043e \u043f\u043b\u043e\u0445\u043e, \u043d\u043e \u0441\u043b\u043e\u0432\u0430 \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c \u043c\u043e\u0436\u043d\u043e \u2014 \u0431\u043b\u043e\u0447\u043d\u0430\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 JPEG \u0434\u0430\u0451\u0442 \u0445\u0430\u0440\u0430\u043a\u0442\u0435\u0440\u043d\u043e\u0435 \u00ab\u043a\u0432\u0430\u043a\u0430\u044e\u0449\u0435\u0435\u00bb \u044d\u0445\u043e \u043d\u0430 \u0432\u044b\u0441\u043e\u043a\u0438\u0445<\/p>\n<\/li>\n<\/ul>\n<h3>\u041a\u0430\u043a \u044d\u0442\u043e \u0437\u0432\u0443\u0447\u0438\u0442?<\/h3>\n<p>\u041a \u0441\u0442\u0430\u0442\u044c\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u044b \u0444\u0430\u0439\u043b\u044b <strong>spectrogram.<\/strong>* \u0438 <strong>recovered.opus<\/strong> \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0442\u0435\u0441\u0442\u0430 (\u043d\u0430\u043f\u043e\u043c\u0438\u043d\u0430\u044e: \u0430\u0443\u0434\u0438\u043e \u0432 Opus 128 kbps, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e WAV \u0431\u0435\u0441\u0441\u043c\u044b\u0441\u043b\u0435\u043d\u043d\u043e \u0433\u043e\u043d\u044f\u0442\u044c \u0447\u0435\u0440\u0435\u0437 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442). \u0412\u043e\u0442 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0441\u0443\u0431\u044a\u0435\u043a\u0442\u0438\u0432\u043d\u044b\u0435 \u0432\u043f\u0435\u0447\u0430\u0442\u043b\u0435\u043d\u0438\u044f:<\/p>\n<ul>\n<li>\n<p>PNG\/WebP lossless: \u043a\u0430\u043a \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b, \u043d\u043e \u0441 \u0445\u0430\u0440\u0430\u043a\u0442\u0435\u0440\u043d\u043e\u0439 \u00ab\u0448\u0435\u0440\u043e\u0445\u043e\u0432\u0430\u0442\u043e\u0441\u0442\u044c\u044e\u00bb \u043e\u0442 \u0413\u0440\u0438\u0444\u0444\u0438\u043d\u0430-\u041b\u0438\u043c\u0430 \u2014 \u043b\u0451\u0433\u043a\u0438\u0439 \u0444\u0430\u0437\u043e\u0432\u044b\u0439 \u0448\u0443\u043c, \u043a \u043a\u043e\u0442\u043e\u0440\u043e\u043c\u0443 \u0431\u044b\u0441\u0442\u0440\u043e \u043f\u0440\u0438\u0432\u044b\u043a\u0430\u0435\u0448\u044c. \u042d\u0442\u043e baseline, \u043b\u0443\u0447\u0448\u0435 \u0447\u0435\u0433\u043e \u0443\u0436\u0435 \u043d\u0435 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0431\u0435\u0437 \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0444\u0430\u0437\u044b.<\/p>\n<\/li>\n<li>\n<p>JPEG q75: \u0443\u0434\u0438\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0434\u043e\u0441\u0442\u043e\u0439\u043d\u043e, \u043b\u0451\u0433\u043a\u043e\u0435 \u00ab\u0437\u0432\u0435\u043d\u044f\u0449\u0435\u0435\u00bb \u043f\u043e\u0441\u043b\u0435\u0437\u0432\u0443\u0447\u0438\u0435 \u043d\u0430 \u0432\u044b\u0441\u043e\u043a\u0438\u0445, \u043d\u043e \u043c\u0443\u0437\u044b\u043a\u0430 \u043e\u0441\u0442\u0430\u0451\u0442\u0441\u044f \u043c\u0443\u0437\u044b\u043a\u043e\u0439<\/p>\n<\/li>\n<li>\n<p>JPEG q50: \u0437\u0430\u043c\u0435\u0442\u043d\u043e\u0435 \u00ab\u0436\u0443\u0436\u0436\u0430\u043d\u0438\u0435\u00bb \u0438 \u043f\u043e\u0442\u0435\u0440\u044f \u0434\u0435\u0442\u0430\u043b\u0435\u0439 \u0432 \u0432\u0435\u0440\u0445\u0430\u0445, \u0441\u0435\u0440\u0435\u0434\u0438\u043d\u0430 \u0435\u0449\u0451 \u0442\u0435\u0440\u043f\u0438\u043c\u0430<\/p>\n<\/li>\n<li>\n<p>JPEG q5: \u0437\u0432\u0443\u043a \u043a\u0430\u043a \u0438\u0437 \u043a\u043e\u043d\u0441\u0435\u0440\u0432\u043d\u043e\u0439 \u0431\u0430\u043d\u043a\u0438, \u043f\u0435\u0440\u0435\u0434\u0430\u043d\u043d\u044b\u0439 \u043f\u043e \u0444\u0430\u043a\u0441\u0443, \u043d\u043e \u0441\u043b\u043e\u0432\u0430 \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c \u043c\u043e\u0436\u043d\u043e \u2014 \u0445\u0430\u0440\u0430\u043a\u0442\u0435\u0440\u043d\u044b\u0439 \u0431\u043b\u043e\u0447\u043d\u044b\u0439 \u0430\u0440\u0442\u0435\u0444\u0430\u043a\u0442 8\u00d78 \u043f\u0438\u043a\u0441\u0435\u043b\u0435\u0439 \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u0432 \u0440\u0438\u0442\u043c\u0438\u0447\u043d\u044b\u0439 \u0442\u0440\u0435\u0441\u043a \u043d\u0430 \u0432\u044b\u0441\u043e\u043a\u0438\u0445<\/p>\n<\/li>\n<li>\n<p>WebP q5: \u043d\u0430 \u0443\u0434\u0438\u0432\u043b\u0435\u043d\u0438\u0435 \u0447\u0438\u0449\u0435, \u0447\u0435\u043c JPEG \u043d\u0430 \u0442\u0435\u0445 \u0436\u0435 \u0431\u0438\u0442\u0440\u0435\u0439\u0442\u0430\u0445 \u2014 WebP \u0430\u0440\u0442\u0435\u0444\u0430\u0447\u0438\u0442 \u0431\u043e\u043b\u0435\u0435 \u00ab\u0433\u043b\u0430\u0434\u043a\u043e\u00bb, \u0431\u0435\u0437 \u0440\u0435\u0437\u043a\u0438\u0445 \u0431\u043b\u043e\u0447\u043d\u044b\u0445 \u0433\u0440\u0430\u043d\u0438\u0446<\/p>\n<\/li>\n<li>\n<p>AVIF q5 (4 KB!): \u0448\u0443\u043c, \u0442\u0440\u0435\u0441\u043a, \u0430\u0440\u0442\u0435\u0444\u0430\u043a\u0442\u044b \u2014 \u043d\u043e \u0444\u0430\u043a\u0442, \u0447\u0442\u043e \u044d\u0442\u043e \u0432\u043e\u043e\u0431\u0449\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442, \u043f\u043e\u0440\u0430\u0436\u0430\u0435\u0442. \u0417\u0432\u0443\u043a \u043e\u0442\u0434\u0430\u043b\u0451\u043d\u043d\u043e \u043d\u0430\u043f\u043e\u043c\u0438\u043d\u0430\u0435\u0442 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b, \u043a\u0430\u043a \u0431\u0443\u0434\u0442\u043e \u0441\u043b\u0443\u0448\u0430\u0435\u0448\u044c \u0447\u0435\u0440\u0435\u0437 \u0442\u0440\u0443\u0431\u0443 \u0432 \u0432\u0435\u0442\u0440\u0435\u043d\u0443\u044e \u043f\u043e\u0433\u043e\u0434\u0443<\/p>\n<\/li>\n<\/ul>\n<h2>\u041a\u0430\u043a \u043f\u043e\u0432\u0442\u043e\u0440\u0438\u0442\u044c \u0441\u0430\u043c\u043e\u043c\u0443<\/h2>\n<ul>\n<li>\n<p>\u0421\u043a\u0430\u0447\u0430\u0439\u0442\u0435 \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u0438 (\u0441\u0441\u044b\u043b\u043a\u0430 \u0432 \u043a\u043e\u043d\u0446\u0435 \u0441\u0442\u0430\u0442\u044c\u0438)<\/p>\n<\/li>\n<li>\n<p>\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438:<\/p>\n<\/li>\n<\/ul>\n<pre><code class=\"bash\">pip install numpy librosa soundfile Pillow pydub scipy<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<ul>\n<li>\n<p>\u0414\u043b\u044f AVIF \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0438 \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u044c\u0441\u044f:<\/p>\n<\/li>\n<\/ul>\n<pre><code class=\"bash\">pip install pillow-avif-plugin# \u0438\u043b\u0438pip install pillow-heif<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<ul>\n<li>\n<p>\u041f\u043e\u043b\u043e\u0436\u0438\u0442\u0435 MP3-\u0444\u0430\u0439\u043b \u0432 \u043f\u0430\u043f\u043a\u0443 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u0438 \u043d\u0430\u0437\u043e\u0432\u0438\u0442\u0435 <a href=\"http:\/\/track.mp\" rel=\"noopener noreferrer nofollow\">track.mp<\/a>3 (\u0438\u043b\u0438 \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u0435 \u043f\u0443\u0442\u044c \u0432 <a href=\"http:\/\/config.py\" rel=\"noopener noreferrer nofollow\">config.py<\/a>)<\/p>\n<\/li>\n<li>\n<p>\u0417\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u0435 \u043e\u0434\u0438\u043d\u043e\u0447\u043d\u044b\u0439 \u0442\u0435\u0441\u0442:<\/p>\n<\/li>\n<\/ul>\n<pre><code class=\"bash\">python main.py<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u043f\u043e\u044f\u0432\u044f\u0442\u0441\u044f \u0432 \u043f\u0430\u043f\u043a\u0435 data\/: \u0441\u043f\u0435\u043a\u0442\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u0438 \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043d\u044b\u0439 WAV.<\/p>\n<ul>\n<li>\n<p>\u0417\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u0435 \u0431\u0430\u0442\u0447-\u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0432\u0441\u0435\u0445 \u0444\u043e\u0440\u043c\u0430\u0442\u043e\u0432:<\/p>\n<\/li>\n<\/ul>\n<pre><code class=\"bash\">python test_runner.py<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0421\u043e\u0437\u0434\u0430\u0441\u0442 \u043f\u0430\u043f\u043a\u0443 test_results_[timestamp]\/ \u0441 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u043c\u0438 \u043f\u043e\u0434\u043f\u0430\u043f\u043a\u0430\u043c\u0438 \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0442\u0435\u0441\u0442\u0430. \u0412 \u043a\u0430\u0436\u0434\u043e\u0439 \u2014 spectrogram, recovered.wav, metadata.json \u0438 report.txt. \u041e\u0431\u0449\u0438\u0439 \u0441\u0432\u043e\u0434\u043d\u044b\u0439 \u043e\u0442\u0447\u0451\u0442 \u0431\u0443\u0434\u0435\u0442 \u0432 summary_report.txt.<\/p>\n<ul>\n<li>\n<p>\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u0442\u0435 \u043f\u0440\u0435\u0441\u0435\u0442\u044b \u0438 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u043e \u0432 <a href=\"http:\/\/config.py\" rel=\"noopener noreferrer nofollow\">config.py<\/a> \u2014 \u0442\u0430\u043c \u0432\u0441\u0451 \u0437\u0430\u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043e:<\/p>\n<\/li>\n<\/ul>\n<pre><code class=\"python\">PRESETS = {    \"75p_n4096\": {\"N_FFT\": 4096, \"HOP_LENGTH\": 1024},  # 75% overlap    \"87p_n4096\": {\"N_FFT\": 4096, \"HOP_LENGTH\": 512},   # 87.5% overlap    # ...}DEFAULT_CONFIG = {    \"mp3_file\": \"track.mp3\",    \"trim_start\": 60.0,      # \u041d\u0430\u0447\u0430\u043b\u043e \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442\u0430 \u0432 \u0441\u0435\u043a\u0443\u043d\u0434\u0430\u0445    \"trim_end\": 130.0,       # \u041a\u043e\u043d\u0435\u0446 (0 = \u0434\u043e \u043a\u043e\u043d\u0446\u0430)    \"phase_generate_iterations\": 5000,    \"griffin_lim_mode\": \"fast\",    # ...}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<h3>\u0417\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435<\/h3>\n<p>\u042d\u0442\u043e\u0442 \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442 \u043f\u043e\u043a\u0430\u0437\u0430\u043b, \u0447\u0442\u043e \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0444\u043e\u0440\u043c\u0430\u0442\u044b \u0441\u0436\u0430\u0442\u0438\u044f \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0439, \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e AVIF \u0438 WebP, \u043c\u043e\u0433\u0443\u0442 \u0444\u0430\u043d\u0442\u0430\u0441\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e \u0443\u043f\u0430\u043a\u043e\u0432\u044b\u0432\u0430\u0442\u044c \u0441\u043f\u0435\u043a\u0442\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b. \u041c\u044b \u0433\u043e\u0432\u043e\u0440\u0438\u043c \u043e \u0441\u0436\u0430\u0442\u0438\u0438 \u0432 \u0441\u043e\u0442\u043d\u0438 \u0438 \u0442\u044b\u0441\u044f\u0447\u0438 \u0440\u0430\u0437 \u2014 70 \u0441\u0435\u043a\u0443\u043d\u0434 \u0441\u0442\u0435\u0440\u0435\u043e-\u0430\u0443\u0434\u0438\u043e \u0432 4 \u043a\u0438\u043b\u043e\u0431\u0430\u0439\u0442\u0430\u0445. \u0414\u0430, \u0441 \u0430\u0440\u0442\u0435\u0444\u0430\u043a\u0442\u0430\u043c\u0438, \u043d\u043e \u0441\u0430\u043c\u043e \u0442\u043e, \u0447\u0442\u043e \u044d\u0442\u043e \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u2014 \u0432\u043f\u0435\u0447\u0430\u0442\u043b\u044f\u0435\u0442.<\/p>\n<p>\u041f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0441\u043c\u044b\u0441\u043b\u0430 \u0432 \u044d\u0442\u043e\u043c, \u043a\u043e\u043d\u0435\u0447\u043d\u043e, \u043c\u0430\u043b\u043e\u0432\u0430\u0442\u043e (MP3 \u0438 Opus \u0441\u043f\u0440\u0430\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0441 \u0430\u0443\u0434\u0438\u043e\u0441\u0436\u0430\u0442\u0438\u0435\u043c \u043a\u0443\u0434\u0430 \u043b\u0443\u0447\u0448\u0435, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0437\u0430\u0442\u043e\u0447\u0435\u043d\u044b \u0438\u043c\u0435\u043d\u043d\u043e \u043f\u043e\u0434 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0438 \u0447\u0435\u043b\u043e\u0432\u0435\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0441\u043b\u0443\u0445\u0430). \u041d\u043e \u043a\u0430\u043a \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442 \u043d\u0430 \u0441\u0442\u044b\u043a\u0435 \u0434\u0432\u0443\u0445 \u043e\u0431\u043b\u0430\u0441\u0442\u0435\u0439 \u2014 \u0430\u0443\u0434\u0438\u043e \u0438 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0439 \u2014 \u044d\u0442\u043e \u0431\u044b\u043b\u043e \u0447\u0435\u0440\u0442\u043e\u0432\u0441\u043a\u0438 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e. \u0418 \u0442\u0435\u043f\u0435\u0440\u044c \u044f \u0437\u043d\u0430\u044e, \u043a\u0430\u043a \u0437\u0432\u0443\u0447\u0438\u0442 JPEG.<\/p>\n<p><strong>\u041a \u0441\u0442\u0430\u0442\u044c\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u044b:<\/strong><\/p>\n<ul>\n<li>\n<p>\u0418\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u0438 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 (<a href=\"http:\/\/config.py\" rel=\"noopener noreferrer nofollow\">config.py<\/a>, <a href=\"http:\/\/encoder.py\" rel=\"noopener noreferrer nofollow\">encoder.py<\/a>, <a href=\"http:\/\/decoder.py\" rel=\"noopener noreferrer nofollow\">decoder.py<\/a>, phase_<a href=\"http:\/\/generator.py\" rel=\"noopener noreferrer nofollow\">generator.py<\/a>, <a href=\"http:\/\/transforms.py\" rel=\"noopener noreferrer nofollow\">transforms.py<\/a>, <a href=\"http:\/\/utils.py\" rel=\"noopener noreferrer nofollow\">utils.py<\/a>, <a href=\"http:\/\/main.py\" rel=\"noopener noreferrer nofollow\">main.py<\/a>, test_<a href=\"http:\/\/runner.py\" rel=\"noopener noreferrer nofollow\">runner.py<\/a>)<\/p>\n<\/li>\n<li>\n<p>\u0414\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0442\u0435\u0441\u0442\u0430: spectrogram.* + recovered.opus (128 kbps) + metadata.json + report.txt<\/p>\n<\/li>\n<li>\n<p>\u0421\u0432\u043e\u0434\u043d\u044b\u0439 \u043e\u0442\u0447\u0451\u0442 summary_report.txt<\/p>\n<\/li>\n<\/ul>\n<p><em>\u0412\u0441\u0435 \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u0438 \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u044f\u044e\u0442\u0441\u044f \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u043e \u2014 \u0434\u0435\u043b\u0430\u0439\u0442\u0435 \u0447\u0442\u043e \u0445\u043e\u0442\u0438\u0442\u0435. \u0415\u0441\u043b\u0438 \u043d\u0430\u0442\u0440\u0435\u043d\u0438\u0440\u0443\u0435\u0442\u0435 \u043d\u0435\u0439\u0440\u043e\u0441\u0435\u0442\u044c \u00ab\u0441\u043b\u044b\u0448\u0430\u0442\u044c\u00bb JPEG-\u0430\u0440\u0442\u0435\u0444\u0430\u043a\u0442\u044b \u2014 \u0434\u0430\u0439\u0442\u0435 \u0437\u043d\u0430\u0442\u044c \ud83d\ude42<\/em><\/p>\n<blockquote>\n<p><a href=\"https:\/\/dlike.ru\/media\/blog\/pic_test\/au_to_img.7z\" rel=\"noopener noreferrer nofollow\">\u0421\u043a\u0430\u0447\u0430\u0442\u044c \u043f\u0440\u043e\u0435\u043a\u0442<\/a><\/p>\n<\/blockquote>\n<\/div>\n<p>\u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/articles\/1034610\/\">https:\/\/habr.com\/ru\/articles\/1034610\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u0412\u0432\u0435\u0434\u0435\u043d\u0438\u0435\u0411\u044b\u0432\u0430\u044e\u0442 \u0434\u043d\u0438, \u043a\u043e\u0433\u0434\u0430 \u043d\u0430 \u0440\u0430\u0431\u043e\u0442\u0435 \u0434\u0435\u043b\u0430\u0442\u044c \u043d\u0435\u0447\u0435\u0433\u043e. \u0410 \u0431\u044b\u0432\u0430\u044e\u0442 \u0434\u043d\u0438, \u043a\u043e\u0433\u0434\u0430 \u0442\u044b \u2014 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442 \u0438 \u0437\u0432\u0443\u043a\u043e\u0440\u0435\u0436\u0438\u0441\u0441\u0451\u0440 \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e, \u0438 \u0432 \u0433\u043e\u043b\u043e\u0432\u0443 \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442 \u0441\u0442\u0440\u0430\u043d\u043d\u0430\u044f \u043c\u044b\u0441\u043b\u044c: \u00ab\u0410 \u0447\u0442\u043e, \u0435\u0441\u043b\u0438 \u0432\u0437\u044f\u0442\u044c \u0430\u0443\u0434\u0438\u043e, \u043f\u0440\u0435\u0432\u0440\u0430\u0442\u0438\u0442\u044c \u0435\u0433\u043e \u0432 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0443-\u0441\u043f\u0435\u043a\u0442\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0443, \u0441\u0436\u0430\u0442\u044c \u044d\u0442\u0443 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0443 \u043a\u0430\u043a \u0444\u043e\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u044e (JPEG, WebP, AVIF), \u0430 \u043f\u043e\u0442\u043e\u043c \u043f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u0442\u044c \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0437\u0432\u0443\u043a \u043e\u0431\u0440\u0430\u0442\u043d\u043e? \u041a\u0430\u043a \u043e\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u0437\u0432\u0443\u0447\u0430\u0442\u044c?\u00bb\u0421\u043f\u043e\u0439\u043b\u0435\u0440: \u0438\u043d\u043e\u0433\u0434\u0430 \u2014 \u0443\u0434\u0438\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0445\u043e\u0440\u043e\u0448\u043e. \u0418\u043d\u043e\u0433\u0434\u0430 \u2014 \u043a\u0430\u043a \u0438\u0437 \u0443\u043d\u0438\u0442\u0430\u0437\u0430. \u041d\u043e \u0432\u0441\u0435\u0433\u0434\u0430 \u2014 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e.\u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u044f \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443, \u043a\u0430\u043a \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043b \u0432\u0435\u0441\u044c \u044d\u0442\u043e\u0442 \u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d, \u043f\u043e\u043a\u0430\u0436\u0443 \u043a\u043e\u0434, \u043f\u0440\u043e\u0432\u0435\u0434\u0443 \u0431\u0430\u0442\u0447-\u0442\u0435\u0441\u0442\u044b \u0440\u0430\u0437\u043d\u044b\u0445 \u0444\u043e\u0440\u043c\u0430\u0442\u043e\u0432 \u0438 \u0443\u0440\u043e\u0432\u043d\u0435\u0439 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0430, \u0438, \u043a\u043e\u043d\u0435\u0447\u043d\u043e, \u0434\u0430\u043c \u043f\u043e\u0441\u043b\u0443\u0448\u0430\u0442\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b. \u0412\u0441\u0435 \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u0438 \u043f\u0440\u0438\u043b\u0430\u0433\u0430\u044e\u0442\u0441\u044f, \u0438 \u0432\u044b \u0441\u043c\u043e\u0436\u0435\u0442\u0435 \u043f\u043e\u0432\u0442\u043e\u0440\u0438\u0442\u044c \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442 \u0441\u0430\u043c\u0438.\u0418\u0434\u0435\u044f\u0421\u043f\u0435\u043a\u0442\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u2014 \u044d\u0442\u043e \u0432\u0438\u0437\u0443\u0430\u043b\u044c\u043d\u043e\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0437\u0432\u0443\u043a\u0430: \u043f\u043e \u0433\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430\u043b\u0438 \u2014 \u0432\u0440\u0435\u043c\u044f, \u043f\u043e \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u0438 \u2014 \u0447\u0430\u0441\u0442\u043e\u0442\u0430, \u0446\u0432\u0435\u0442 \u2014 \u0430\u043c\u043f\u043b\u0438\u0442\u0443\u0434\u0430. \u0415\u0441\u043b\u0438 \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0441\u043f\u0435\u043a\u0442\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0443 \u043a\u0430\u043a \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0443, \u0430 \u043f\u043e\u0442\u043e\u043c \u0441\u0436\u0430\u0442\u044c \u0435\u0451 \u0441 \u043f\u043e\u0442\u0435\u0440\u044f\u043c\u0438 (\u043a\u0430\u043a JPEG), \u0442\u043e \u043f\u0440\u0438 \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0438 \u0437\u0432\u0443\u043a\u0430 \u043e\u0431\u0440\u0430\u0442\u043d\u043e \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043c\u2026 \u0430\u0440\u0442\u0435\u0444\u0430\u043a\u0442\u044b \u0441\u0436\u0430\u0442\u0438\u044f, \u043d\u043e \u0443\u0436\u0435 \u0432 \u0430\u0443\u0434\u0438\u043e! \u0418\u043c\u0435\u043d\u043d\u043e \u044d\u0442\u043e \u044f \u0438 \u0445\u043e\u0442\u0435\u043b \u0443\u0441\u043b\u044b\u0448\u0430\u0442\u044c.\u0414\u043b\u044f \u0441\u0442\u0435\u0440\u0435\u043e \u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b Mid\/Side \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435:\u0417\u0435\u043b\u0451\u043d\u044b\u0439 \u043a\u0430\u043d\u0430\u043b (G) \u2014 Mid (\u043c\u043e\u043d\u043e-\u0441\u0443\u043c\u043c\u0430 \u043b\u0435\u0432\u043e\u0433\u043e \u0438 \u043f\u0440\u0430\u0432\u043e\u0433\u043e)\u0421\u0438\u043d\u0438\u0439 \u043a\u0430\u043d\u0430\u043b (B) \u2014 Side (\u0440\u0430\u0437\u043d\u0438\u0446\u0430 \u043c\u0435\u0436\u0434\u0443 \u043b\u0435\u0432\u044b\u043c \u0438 \u043f\u0440\u0430\u0432\u044b\u043c)\u041a\u0440\u0430\u0441\u043d\u044b\u0439 \u043a\u0430\u043d\u0430\u043b \u00ae \u2014 \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f (\u043f\u043e\u043a\u0430)\u0410\u043c\u043f\u043b\u0438\u0442\u0443\u0434\u044b \u043b\u043e\u0433\u0430\u0440\u0438\u0444\u043c\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u0432 \u0434\u0435\u0446\u0438\u0431\u0435\u043b\u044b \u0438 \u043c\u0430\u043f\u043f\u044f\u0442\u0441\u044f \u0432 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d 0\u2013255 (8 \u0431\u0438\u0442 \u043d\u0430 \u043a\u0430\u043d\u0430\u043b). \u0427\u0430\u0441\u0442\u043e\u0442\u044b \u0432\u044b\u0448\u0435 \u043f\u043e\u0440\u043e\u0433\u0430 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043e\u0431\u0440\u0435\u0437\u0430\u044e\u0442\u0441\u044f \u0434\u043b\u044f \u044d\u043a\u043e\u043d\u043e\u043c\u0438\u0438 \u043c\u0435\u0441\u0442\u0430. \u0417\u0430\u0442\u0435\u043c \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0430 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442\u0441\u044f \u0432 \u043d\u0443\u0436\u043d\u043e\u043c \u0444\u043e\u0440\u043c\u0430\u0442\u0435.\u041f\u0440\u0438 \u0434\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438 \u0444\u0430\u0437\u0430 \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0447\u0435\u0440\u0435\u0437 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0413\u0440\u0438\u0444\u0444\u0438\u043d\u0430-\u041b\u0438\u043c\u0430 (Griffin-Lim), \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0432 \u0441\u043f\u0435\u043a\u0442\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0435 \u043c\u044b \u0445\u0440\u0430\u043d\u0438\u043c \u0442\u043e\u043b\u044c\u043a\u043e \u0430\u043c\u043f\u043b\u0438\u0442\u0443\u0434\u0443, \u0430 \u0444\u0430\u0437\u0430 \u0442\u0435\u0440\u044f\u0435\u0442\u0441\u044f.\u0412\u0430\u0436\u043d\u043e\u0435 \u0437\u0430\u043c\u0435\u0447\u0430\u043d\u0438\u0435 \u043e \u0444\u043e\u0440\u043c\u0430\u0442\u0435 \u0430\u0443\u0434\u0438\u043e\u041f\u0440\u0435\u0436\u0434\u0435 \u0447\u0435\u043c \u043c\u044b \u043f\u0435\u0440\u0435\u0439\u0434\u0451\u043c \u043a \u0434\u0435\u0442\u0430\u043b\u044f\u043c \u2014 \u043e\u0434\u0438\u043d \u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u043c\u043e\u043c\u0435\u043d\u0442. \u0412\u0441\u0435 \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043d\u044b\u0435 WAV-\u0444\u0430\u0439\u043b\u044b \u044f, \u0440\u0430\u0437\u0443\u043c\u0435\u0435\u0442\u0441\u044f, \u043d\u0435 \u0432\u044b\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u044e \u043a\u0430\u043a \u0435\u0441\u0442\u044c. \u0412\u043e-\u043f\u0435\u0440\u0432\u044b\u0445, \u044d\u0442\u043e \u0431\u044b\u043b\u043e \u0431\u044b \u0436\u0435\u0441\u0442\u043e\u043a\u043e \u043f\u043e \u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u044e \u043a \u0441\u0435\u0440\u0432\u0435\u0440\u0443 (70 \u0441\u0435\u043a\u0443\u043d\u0434 \u0441\u0442\u0435\u0440\u0435\u043e 44.1\/16 \u2014 \u044d\u0442\u043e ~12 \u043c\u0435\u0433\u0430\u0431\u0430\u0439\u0442 \u043d\u0430 \u043a\u0430\u0436\u0434\u044b\u0439 \u0442\u0435\u0441\u0442, \u0430 \u0442\u0435\u0441\u0442\u043e\u0432 \u0443 \u043d\u0430\u0441 18). \u0412\u043e-\u0432\u0442\u043e\u0440\u044b\u0445, \u044d\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u0431\u0435\u0441\u0441\u043c\u044b\u0441\u043b\u0435\u043d\u043d\u043e \u2014 WAV \u043d\u0443\u0436\u0435\u043d \u0442\u043e\u043b\u044c\u043a\u043e \u043a\u0430\u043a \u043f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043e\u0447\u043d\u044b\u0439 \u0444\u043e\u0440\u043c\u0430\u0442 \u043f\u0440\u0438 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0435.\u0412\u0441\u0435 \u0430\u0443\u0434\u0438\u043e\u043f\u0440\u0438\u043c\u0435\u0440\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0432\u044b \u0443\u0441\u043b\u044b\u0448\u0438\u0442\u0435, \u0443\u043f\u0430\u043a\u043e\u0432\u0430\u043d\u044b \u0432 Opus 128 kbps. \u042d\u0442\u043e \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0439, \u0438\u0441\u043a\u043b\u044e\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u044b\u0439 \u043a\u043e\u0434\u0435\u043a, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0430 \u0431\u0438\u0442\u0440\u0435\u0439\u0442\u0435 128 kbps \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u0435\u0442 \u043f\u0440\u043e\u0437\u0440\u0430\u0447\u043d\u043e\u0435 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u043e \u2014 \u0442\u043e \u0435\u0441\u0442\u044c WAV \u0438 Opus \u043d\u0430 \u044d\u0442\u0438\u0445 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430\u0445 \u0437\u0432\u0443\u0447\u0430\u0442 \u0430\u0431\u0441\u043e\u043b\u044e\u0442\u043d\u043e \u0438\u0434\u0435\u043d\u0442\u0438\u0447\u043d\u043e \u0434\u043b\u044f \u0447\u0435\u043b\u043e\u0432\u0435\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0443\u0445\u0430, \u043d\u043e \u0444\u0430\u0439\u043b \u0432\u0435\u0441\u0438\u0442 \u0432 10 \u0440\u0430\u0437 \u043c\u0435\u043d\u044c\u0448\u0435. \u0422\u0430\u043a \u0447\u0442\u043e \u0432\u044b \u043d\u0435 \u0442\u0435\u0440\u044f\u0435\u0442\u0435 \u0440\u043e\u0432\u043d\u044b\u043c \u0441\u0447\u0451\u0442\u043e\u043c \u043d\u0438\u0447\u0435\u0433\u043e \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043f\u0440\u043e\u0441\u043b\u0443\u0448\u0438\u0432\u0430\u043d\u0438\u044f, \u0430 \u0441\u0435\u0440\u0432\u0435\u0440 \u0441\u043a\u0430\u0436\u0435\u0442 \u0432\u0430\u043c \u0441\u043f\u0430\u0441\u0438\u0431\u043e.\u0414\u043b\u044f \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0443\u044e\u0449\u0438\u0445\u0441\u044f: Opus \u2014 \u044d\u0442\u043e open-source \u043a\u043e\u0434\u0435\u043a \u043e\u0442 IETF (RFC 6716), \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0439 \u0432 YouTube, WhatsApp, Discord \u0438 WebRTC. \u041d\u0430 \u0431\u0438\u0442\u0440\u0435\u0439\u0442\u0435 128 kbps \u0434\u043b\u044f \u0441\u0442\u0435\u0440\u0435\u043e \u043e\u043d \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0432 \u0433\u0438\u0431\u0440\u0438\u0434\u043d\u043e\u043c \u0440\u0435\u0436\u0438\u043c\u0435: \u043d\u0438\u0436\u043d\u0438\u0435 \u0447\u0430\u0441\u0442\u043e\u0442\u044b \u043a\u043e\u0434\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u043b\u0438\u043d\u0435\u0439\u043d\u044b\u043c SILK-\u043a\u043e\u0434\u0435\u043a\u043e\u043c, \u0432\u0435\u0440\u0445\u043d\u0438\u0435 \u2014 MDCT \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 CELT. \u041f\u0440\u043e\u0449\u0435 \u0433\u043e\u0432\u043e\u0440\u044f \u2014 \u044d\u0442\u043e \u043b\u0443\u0447\u0448\u0435\u0435, \u0447\u0442\u043e \u0435\u0441\u0442\u044c \u0432 lossy audio \u043d\u0430 \u0441\u0435\u0433\u043e\u0434\u043d\u044f.\u0410\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430 \u043f\u0440\u043e\u0435\u043a\u0442\u0430\u041f\u0440\u043e\u0435\u043a\u0442 \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0438\u0437 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u043c\u043e\u0434\u0443\u043b\u0435\u0439:config.py          \u2014 \u043f\u0440\u0435\u0441\u0435\u0442\u044b FFT \u0438 \u0434\u0435\u0444\u043e\u043b\u0442\u043d\u044b\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438encoder.py         \u2014 \u0430\u0443\u0434\u0438\u043e \u2192 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435decoder.py         \u2014 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u2192 \u0430\u0443\u0434\u0438\u043ephase_generator.py \u2014 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0413\u0440\u0438\u0444\u0444\u0438\u043d\u0430-\u041b\u0438\u043c\u0430 \u0434\u043b\u044f \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u0444\u0430\u0437\u044btransforms.py      \u2014 Mid\/Side \u2194 Left\/Right \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u044futils.py           \u2014 \u0443\u0442\u0438\u043b\u0438\u0442\u044b (JSON, \u0440\u0430\u0437\u043c\u0435\u0440\u044b \u0444\u0430\u0439\u043b\u043e\u0432, \u043e\u0447\u0438\u0441\u0442\u043a\u0430)main.py            \u2014 \u043e\u0434\u0438\u043d\u043e\u0447\u043d\u044b\u0439 \u043f\u0440\u043e\u0433\u043e\u043d \u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d\u0430test_runner.py     \u2014 \u0431\u0430\u0442\u0447-\u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0444\u043e\u0440\u043c\u0430\u0442\u043e\u0432 \u0441\u0436\u0430\u0442\u0438\u044f\u041e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d (main.py)\u041f\u043e\u043b\u043d\u044b\u0439 \u0446\u0438\u043a\u043b \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0430\u043a:def full_pipeline(config: dict):    &#171;&#187;&#187;\u041f\u043e\u043b\u043d\u044b\u0439 \u0446\u0438\u043a\u043b: \u0430\u0443\u0434\u0438\u043e -&gt; \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 -&gt; \u0430\u0443\u0434\u0438\u043e (\u0441 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0435\u0439 \u0444\u0430\u0437\u044b).&#187;&#187;&#187;    preset = PRESETS[config[&#171;active_preset&#187;]]    n_fft = preset[&#171;N_FFT&#187;]    hop_length = preset[&#171;HOP_LENGTH&#187;]        # \u0428\u0430\u0433 1: MP3 -&gt; WAV    wav_temp = Path(data_dir) \/ &#171;temp_stereo.wav&#187;    mp3_to_wav(config[&#171;mp3_file&#187;], str(wav_temp))        # \u0428\u0430\u0433 2: WAV -&gt; \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435    image_path = str(Path(data_dir) \/ f&#187;spectrogram.{ext}&#187;)    metadata, _ = audio_to_image(wav_temp, image_path, n_fft, hop_length, config)        # \u0428\u0430\u0433 3: \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 -&gt; WAV    recovered_path = str(Path(data_dir) \/ &#171;recovered.wav&#187;)    audio_recovered = image_to_audio(image_path, recovered_path, metadata)        return audio_recovered\u041a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0432 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 (encoder.py)\u041a\u043b\u044e\u0447\u0435\u0432\u043e\u0439 \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442 \u2014 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0430\u0443\u0434\u0438\u043e \u0432 RGB-\u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0443:def audio_to_image(wav_path, image_path, n_fft, hop_length, config):    y, sr = librosa.load(wav_path, sr=44100, mono=False)        # Mid\/Side \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435    mid = (y[0] + y[1]) * 0.5    side = (y[0] &#8212; y[1]) * 0.5        # STFT    D_mid = librosa.stft(mid, n_fft=n_fft, hop_length=hop_length, window=&#8217;hann&#8217;)    D_side = librosa.stft(side, n_fft=n_fft, hop_length=hop_length, window=&#8217;hann&#8217;)        # \u0412 \u0434\u0435\u0446\u0438\u0431\u0435\u043b\u044b \u0438 \u0432 0..255    mag_mid_db = librosa.amplitude_to_db(np.abs(D_mid), ref=np.max)    mag_mid_norm = np.clip((mag_mid_db &#8212; mag_min) \/ (-mag_min) * 255, 0, 255).astype(np.uint8)        # RGB: G=Mid, B=Side, R=0    rgb = np.zeros((n_freqs, n_frames, 3), dtype=np.uint8)    rgb[:, :, 1] = mag_mid_norm   # \u0417\u0435\u043b\u0451\u043d\u044b\u0439 = Mid    rgb[:, :, 2] = mag_side_norm  # \u0421\u0438\u043d\u0438\u0439 = Side        img = Image.fromarray(np.flipud(rgb), &#8216;RGB&#8217;)    # &#8230; \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u0447\u0435\u0440\u0435\u0437 PIL \u0441 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u043c\u0438 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0430\u0410\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0441\u0440\u0435\u0437 \u0432\u044b\u0441\u043e\u043a\u0438\u0445 \u0447\u0430\u0441\u0442\u043e\u0442 \u2014 \u044d\u043a\u043e\u043d\u043e\u043c\u0438\u043c \u043c\u0435\u0441\u0442\u043e, \u043e\u0442\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u044f \u0442\u043e, \u0447\u0442\u043e \u0432\u0441\u0451 \u0440\u0430\u0432\u043d\u043e \u043d\u0435 \u0441\u043b\u044b\u0448\u043d\u043e:def _find_high_cut_auto(mag_mid_db, mag_side_db, freqs, threshold_db=-80, freq_min=8000):    mean_mag = np.maximum(np.mean(mag_mid_db, axis=1), np.mean(mag_side_db, axis=1))    # \u0421\u0433\u043b\u0430\u0436\u0438\u0432\u0430\u043d\u0438\u0435 \u0438 \u043f\u043e\u0438\u0441\u043a \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u043e\u0433\u043e \u043f\u0430\u0434\u0435\u043d\u0438\u044f \u043d\u0438\u0436\u0435 \u043f\u043e\u0440\u043e\u0433\u0430    below_threshold = mean_mag_smooth &lt; effective_threshold    for i in range(min_idx, len(freqs) &#8212; 5):        if np.all(below_threshold[i:i+5]):            return freqs[i], i\u0414\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0438 \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u0444\u0430\u0437\u044b (decoder.py + phase_generator.py)\u0421\u0430\u043c\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u2014 \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u0443\u0442\u0435\u0440\u044f\u043d\u043d\u043e\u0439 \u0444\u0430\u0437\u044b:def image_to_audio(image_path, output_wav_path, metadata):    img = Image.open(image_path).convert(&#8216;RGB&#8217;)    arr = np.array(img, dtype=np.float32)        # \u0414\u043e\u0441\u0442\u0430\u0451\u043c Mid \u0438 Side \u0438\u0437 \u0437\u0435\u043b\u0451\u043d\u043e\u0433\u043e \u0438 \u0441\u0438\u043d\u0435\u0433\u043e \u043a\u0430\u043d\u0430\u043b\u043e\u0432    mag_mid_norm = arr[:, :, 1] \/ 255.0  # \u0417\u0435\u043b\u0451\u043d\u044b\u0439    mag_side_norm = arr[:, :, 2] \/ 255.0  # \u0421\u0438\u043d\u0438\u0439        # \u041e\u0431\u0440\u0430\u0442\u043d\u043e \u0438\u0437 dB \u0432 \u0430\u043c\u043f\u043b\u0438\u0442\u0443\u0434\u0443    mag_mid = librosa.db_to_amplitude(mag_mid_db, ref=ref_mid)        # \u0413\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u0444\u0430\u0437\u044b \u0447\u0435\u0440\u0435\u0437 Griffin-Lim (fast, parallel)    phase_mid, phase_side = griffin_lim_stereo_parallel(        mag_mid, mag_side, n_fft, hop_length,        iterations=5000, mode=&#8217;fast&#8217;    )        # \u0412\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u043a\u043e\u043c\u043f\u043b\u0435\u043a\u0441\u043d\u043e\u0433\u043e \u0441\u043f\u0435\u043a\u0442\u0440\u0430 \u0438 \u043e\u0431\u0440\u0430\u0442\u043d\u043e\u0435 STFT    D_mid = mag_mid * np.exp(1j * phase_mid)    y_mid = librosa.istft(D_mid, hop_length=hop_length, window=&#8217;hann&#8217;)        # Mid\/Side -&gt; Left\/Right    left = mid + side    right = mid &#8212; side        return np.stack([left, right], axis=1)\u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0413\u0440\u0438\u0444\u0444\u0438\u043d\u0430-\u041b\u0438\u043c\u0430 (fast-\u0432\u0435\u0440\u0441\u0438\u044f \u0441 memory layout \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f\u043c\u0438):def griffin_lim_fast(magnitude, n_fft, hop_length, iterations=50, &#8230;):    rng = np.random.RandomState(random_seed)    angles = rng.uniform(-np.pi, np.pi, magnitude.shape).astype(np.float32)        for i in range(iterations):        # \u0421\u043e\u0431\u0438\u0440\u0430\u0435\u043c \u043a\u043e\u043c\u043f\u043b\u0435\u043a\u0441\u043d\u044b\u0439 \u0441\u043f\u0435\u043a\u0442\u0440 \u0441 \u0442\u0435\u043a\u0443\u0449\u0435\u0439 \u0444\u0430\u0437\u043e\u0439        stft_matrix = magnitude * np.exp(1j * angles)        # ISTFT -&gt; STFT \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u043d\u043e\u0432\u043e\u0439 \u043e\u0446\u0435\u043d\u043a\u0438 \u0444\u0430\u0437\u044b        y = librosa.istft(stft_matrix, hop_length=hop_length)        D_new = librosa.stft(y, n_fft=n_fft, hop_length=hop_length)        angles = np.angle(D_new)                # Early stopping        if improvement &lt; early_stop_threshold:            patience_counter += 1            if patience_counter &gt;= early_stop_patience:                return best_angles        return angles\u0422\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0444\u043e\u0440\u043c\u0430\u0442\u043e\u0432 \u0441\u0436\u0430\u0442\u0438\u044f (test_runner.py)\u042f \u043d\u0430\u043f\u0438\u0441\u0430\u043b \u0430\u0432\u0442\u043e\u0442\u0435\u0441\u0442\u0435\u0440, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0444\u043e\u0440\u043c\u0430\u0442\u0430 \u0438 \u0443\u0440\u043e\u0432\u043d\u044f \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0430:\u041a\u043e\u043d\u0432\u0435\u0440\u0442\u0438\u0440\u0443\u0435\u0442 MP3 \u2192 WAV\u041a\u043e\u0434\u0438\u0440\u0443\u0435\u0442 \u0432 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435\u0414\u0435\u043a\u043e\u0434\u0438\u0440\u0443\u0435\u0442 \u043e\u0431\u0440\u0430\u0442\u043d\u043e \u0432 WAV\u0421\u0447\u0438\u0442\u0430\u0435\u0442 \u0440\u0430\u0437\u043c\u0435\u0440 \u0444\u0430\u0439\u043b\u0430 \u0438 \u0432\u0440\u0435\u043c\u044f\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u044e\u0442\u0441\u044f \u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0435 \u043f\u0430\u043f\u043a\u0438 \u0441 \u043e\u0442\u0447\u0451\u0442\u0430\u043c\u0438. \u0412\u043e\u0442 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u0442\u0435\u0441\u0442\u043e\u0432:TEST_CONFIGS = {    &#171;png_max&#187;:       {&#171;output_format&#187;: &#171;png&#187;,   &#171;output_quality&#187;: 9,   &#171;output_lossless&#187;: True},    &#171;jpeg_q100&#187;:     {&#171;output_format&#187;: &#171;jpeg&#187;,  &#171;output_quality&#187;: 100},    &#171;jpeg_q75&#187;:      {&#171;output_format&#187;: &#171;jpeg&#187;,  &#171;output_quality&#187;: 75},    &#171;jpeg_q50&#187;:      {&#171;output_format&#187;: &#171;jpeg&#187;,  &#171;output_quality&#187;: 50},    &#171;jpeg_q25&#187;:      {&#171;output_format&#187;: &#171;jpeg&#187;,  &#171;output_quality&#187;: 25},    &#171;jpeg_q5&#187;:       {&#171;output_format&#187;: &#171;jpeg&#187;,  &#171;output_quality&#187;: 5},    &#171;webp_q100&#187;:     {&#171;output_format&#187;: &#171;webp&#187;,  &#171;output_quality&#187;: 100},    # &#8230; \u0438 \u0442\u0430\u043a \u0434\u0430\u043b\u0435\u0435 \u0434\u043b\u044f WebP \u0438 AVIF}\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u0442\u0435\u0441\u0442\u043e\u0432\u0412\u0430\u0436\u043d\u043e\u0435 \u0437\u0430\u043c\u0435\u0447\u0430\u043d\u0438\u0435: SNR \u0432 \u044d\u0442\u0438\u0445 \u0442\u0435\u0441\u0442\u0430\u0445 \u043d\u0435 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0435\u043d, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043d\u044b\u0439 \u0441\u0438\u0433\u043d\u0430\u043b \u0441\u0434\u0432\u0438\u043d\u0443\u0442 \u043f\u043e \u0444\u0430\u0437\u0435 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u0430 \u2014 \u043f\u0438\u043a\u0438 \u043c\u043e\u0433\u0443\u0442 \u043d\u0435 \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u0442\u044c, \u0445\u043e\u0442\u044f \u0437\u0432\u0443\u0447\u0438\u0442 \u0432\u0441\u0451 \u043f\u0440\u0438\u0435\u043c\u043b\u0435\u043c\u043e. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043e\u0446\u0435\u043d\u0438\u0432\u0430\u0442\u044c \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u043e \u043b\u0443\u0447\u0448\u0435 \u043d\u0430 \u0441\u043b\u0443\u0445 (\u0430\u0443\u0434\u0438\u043e\u043f\u0440\u0438\u043c\u0435\u0440\u044b \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u044b \u043a \u0441\u0442\u0430\u0442\u044c\u0435 \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0442\u0435\u0441\u0442\u0430).\u0422\u0435\u0441\u0442\u0420\u0430\u0437\u043c\u0435\u0440 (MB)\u0412\u0440\u0435\u043c\u044f \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f (\u0441\u0435\u043a)\u0412\u0440\u0435\u043c\u044f \u0434\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f (\u0441\u0435\u043a)\u0424\u0430\u0439\u043b\u044bPNG (lossless)8.471.9299.4spectrogram.png \/ recovered.opusWebP lossless6.6213.2294.2spectrogram.webp \/ recovered.opusWebP q1003.162.8185.5spectrogram.webp \/ recovered.opusWebP q750.661.7170.0spectrogram.webp \/ recovered.opusWebP q500.351.4164.3spectrogram.webp \/ recovered.opusWebP q250.161.2162.5spectrogram.webp \/ recovered.opusWebP q50.051.0176.7spectrogram.webp \/ recovered.opusJPEG q1004.571.1205.7spectrogram.jpg \/ recovered.opusJPEG q750.760.5158.9spectrogram.jpg \/ recovered.opusJPEG q500.450.5139.3spectrogram.jpg \/ recovered.opusJPEG q250.220.5162.3spectrogram.jpg \/ recovered.opusJPEG q50.040.5203.5spectrogram.jpg \/ recovered.opusAVIF lossless4.0621.1194.3spectrogram.avif \/ recovered.opusAVIF q1004.0620.9188.1spectrogram.avif \/ recovered.opusAVIF q751.2740.4164.0spectrogram.avif \/ recovered.opusAVIF q500.2830.8157.9spectrogram.avif \/ recovered.opusAVIF q250.0211.6171.1spectrogram.avif \/ recovered.opusAVIF q50.0045.1176.1spectrogram.avif \/ recovered.opus\u0418\u0441\u0445\u043e\u0434\u043d\u044b\u0439 MP3: 44.4 MB (264 \u0441\u0435\u043a, \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u043d\u044b\u0439 \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442 \u2014 70 \u0441\u0435\u043a) \u0420\u0430\u0437\u043c\u0435\u0440 \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043d\u043e\u0433\u043e WAV (70 \u0441\u0435\u043a \u0441\u0442\u0435\u0440\u0435\u043e 44.1\/16): ~12.1 MB \u0410\u0443\u0434\u0438\u043e\u043f\u0440\u0438\u043c\u0435\u0440\u044b \u0432\u044b\u043b\u043e\u0436\u0435\u043d\u044b \u0432 Opus 128 kbps: ~1.1 MB \u043a\u0430\u0436\u0434\u044b\u0439\u0410\u043d\u0430\u043b\u0438\u0437PNG \u0438 lossless-\u0444\u043e\u0440\u043c\u0430\u0442\u044b. PNG (8.47 MB) \u0438 WebP lossless (6.62 MB) \u2014 \u0441\u0430\u043c\u044b\u0435 \u0431\u043e\u043b\u044c\u0448\u0438\u0435, \u043d\u043e \u044d\u0442\u043e \u0447\u0435\u0441\u0442\u043d\u043e\u0435 \u0441\u0436\u0430\u0442\u0438\u0435 \u0431\u0435\u0437 \u043f\u043e\u0442\u0435\u0440\u044c. \u0418\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e, \u0447\u0442\u043e WebP lossless \u0441\u0436\u0430\u043b \u043b\u0443\u0447\u0448\u0435 PNG \u2014 \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u043d\u0430 22%. \u041f\u0440\u0438 \u044d\u0442\u043e\u043c PNG \u043a\u043e\u0434\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0431\u044b\u0441\u0442\u0440\u0435\u0435 \u0432\u0441\u0435\u0445 \u2014 1.9 \u0441\u0435\u043a\u0443\u043d\u0434\u044b \u043f\u0440\u043e\u0442\u0438\u0432 13.2 \u0443 WebP lossless.Lossy-\u0441\u0436\u0430\u0442\u0438\u0435: \u044d\u043a\u0441\u0442\u0440\u0435\u043c\u0430\u043b\u044c\u043d\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f. \u0421\u0430\u043c\u044b\u0439 \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u0438\u0439 \u0444\u0430\u0439\u043b \u2014 AVIF q5 (4 KB!). \u041d\u0430 70 \u0441\u0435\u043a\u0443\u043d\u0434 \u0441\u0442\u0435\u0440\u0435\u043e-\u0430\u0443\u0434\u0438\u043e! WebP q5 \u0432\u044b\u0434\u0430\u043b 51 KB, JPEG q5 \u2014 43 KB&#8230;.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-479564","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/479564","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=479564"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/479564\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=479564"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=479564"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=479564"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}