{"id":326352,"date":"2021-07-13T09:00:16","date_gmt":"2021-07-13T09:00:16","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=326352"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=326352","title":{"rendered":"\u042d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442 \u0434\u043b\u044f \u0441\u043e\u0442\u0440\u0443\u0434\u043d\u0438\u043a\u0430 \u0441 \u043d\u0430\u0440\u0443\u0448\u0435\u043d\u0438\u0435\u043c \u0441\u043b\u0443\u0445\u0430, \u0447. 2, \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430 \u0441\u0435\u0431\u0435"},"content":{"rendered":"\n<div class=\"post__text post__text_v2\" id=\"post-content-body\">\n<p>\u041f\u0440\u0438\u0432\u0435\u0442! \u0412 <a href=\"https:\/\/habr.com\/ru\/company\/cloud4y\/blog\/565014\/\">\u043f\u0435\u0440\u0432\u043e\u0439 \u0447\u0430\u0441\u0442\u0438<\/a> \u043c\u044b \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u043b\u0438, \u0437\u0430\u0447\u0435\u043c \u0432\u043e\u043e\u0431\u0449\u0435 \u0440\u0435\u0448\u0438\u043b\u0438 \u0437\u0430\u043d\u044f\u0442\u044c\u0441\u044f \u044d\u0442\u0438\u043c \u0432\u043e\u043f\u0440\u043e\u0441\u043e\u043c, \u0430 \u0442\u0430\u043a\u0436\u0435 \u043f\u043e\u0434\u0435\u043b\u0438\u043b\u0438\u0441\u044c \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u043e\u043c \u0441\u0442\u0430\u0442\u044c\u0438, \u0441\u0442\u0430\u0432\u0448\u0435\u0439 \u0434\u043b\u044f \u043d\u0430\u0441 \u043e\u0442\u043f\u0440\u0430\u0432\u043d\u043e\u0439 \u0442\u043e\u0447\u043a\u043e\u0439 \u0434\u043b\u044f \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0445 \u0438\u0437\u044b\u0441\u043a\u0430\u043d\u0438\u0439. \u0422\u0435\u043f\u0435\u0440\u044c \u0445\u043e\u0442\u0438\u043c \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u0442\u044c, \u043a\u0430\u043a \u043c\u044b \u0434\u043e\u0440\u0430\u0431\u043e\u0442\u0430\u043b\u0438 \u0438\u0434\u0435\u044e \u043f\u043e\u0434 \u043d\u0430\u0448\u0435\u0433\u043e \u0441\u043e\u0442\u0440\u0443\u0434\u043d\u0438\u043a\u0430.<\/p>\n<p>\u041e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0435 \u0441\u043f\u0430\u0441\u0438\u0431\u043e \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0442\u043e\u0440\u0430\u043c, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043e\u0442\u043c\u0435\u0442\u0438\u043b\u0438\u0441\u044c \u0432 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u044f\u0445 \u043a \u043f\u0435\u0440\u0432\u043e\u0439 \u0447\u0430\u0441\u0442\u0438.  \u0423\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u0441 \u043a\u043e\u0441\u0442\u043d\u043e\u0439 \u043f\u0440\u043e\u0432\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u044c\u044e, \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d\u044b\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0432\u0440\u043e\u0434\u0435 Equalizer APO 1.2.1, \u0441\u043b\u0443\u0445\u043e\u0432\u044b\u0435 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u0441 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u043e\u0439 Bluetooth  \u2014 \u043c\u044b \u0441\u043e\u0431\u0440\u0430\u043b\u0438 \u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u043b\u0438 \u0432\u0441\u0435 \u0432\u0430\u0448\u0438 \u0438\u0434\u0435\u0438. \u041c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c, \u0447\u0442\u043e-\u0442\u043e \u0438\u0437 \u044d\u0442\u043e\u0433\u043e \u0438 \u0432\u044b\u0439\u0434\u0435\u0442. \u041d\u043e \u043c\u044b \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0435\u043c \u043e \u0441\u0432\u043e\u0451\u043c \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0435. \u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e, \u043e\u043d \u0442\u043e\u0436\u0435 \u043a\u043e\u043c\u0443-\u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u043b\u0435\u0437\u0435\u043d. <\/p>\n<h2>\u041f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0430<\/h2>\n<p>\u0414\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u043d\u0443\u0436\u043d\u043e \u043f\u043e\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0441\u0432\u043e\u0438 HL-\u0430\u0443\u0434\u0438\u0433\u0440\u0430\u043c\u043c\u044b (&#8216;Hearing Levels&#8217;). \u0421\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u043c wav-\u043e\u0431\u0440\u0430\u0437\u0446\u044b \u043d\u0430 \u043a\u043b\u044e\u0447\u0435\u0432\u044b\u0445 \u0447\u0430\u0441\u0442\u043e\u0442\u0430\u0445 \u0441 \u043f\u043e\u0441\u0442\u0435\u043f\u0435\u043d\u043d\u043e \u0432\u043e\u0437\u0440\u0430\u0441\u0442\u0430\u044e\u0449\u0435\u0439 \u0433\u0440\u043e\u043c\u043a\u043e\u0441\u0442\u044c\u044e \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <code>gen_hl_samples.py<\/code>, \u043f\u0440\u043e\u0441\u043b\u0443\u0448\u0430\u0435\u043c \u0438\u0445 \u0438 \u0437\u0430\u043f\u0438\u0448\u0435\u043c \u0432\u0440\u0435\u043c\u044f, \u043a\u043e\u0433\u0434\u0430 \u0441\u0442\u0430\u043b\u043e \u0441\u043b\u044b\u0448\u043d\u043e \u043a\u0430\u0436\u0434\u044b\u0439 \u0438\u0437 \u043e\u0431\u0440\u0430\u0437\u0446\u043e\u0432. \u0414\u0430\u043b\u0435\u0435 \u043f\u043e &#171;\u043b\u0438\u043d\u0435\u0439\u043a\u0435&#187; \u0441\u043e\u043f\u043e\u0441\u0442\u0430\u0432\u0438\u043c \u0432\u0440\u0435\u043c\u044f \u0441 \u0443\u0440\u043e\u0432\u043d\u0435\u043c \u0433\u0440\u043e\u043c\u043a\u043e\u0441\u0442\u0438 \u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u043c \u0441\u0432\u043e\u044e \u0430\u0443\u0434\u0438\u043e\u0433\u0440\u0430\u043c\u043c\u0443 \u0432 \u0432\u0438\u0434\u0435 \u043d\u0430\u0431\u043e\u0440\u0430 &#171;\u0447\u0430\u0441\u0442\u043e\u0442\u0430&#187; \u2014 &#171;\u0443\u0440\u043e\u0432\u0435\u043d\u044c \u0441\u043b\u044b\u0448\u0438\u043c\u043e\u0441\u0442\u0438 \u0447\u0430\u0441\u0442\u043e\u0442\u044b&#187;.<\/p>\n<p>\u0412 \u0430\u0432\u0442\u043e\u0440\u0441\u043a\u0438\u0439 \u043a\u043e\u0434 <code>gen_hl_samples.py<\/code> \u0431\u044b\u043b\u0438 \u0432\u043d\u0435\u0441\u0435\u043d\u044b \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f:<\/p>\n<ul>\n<li>\n<p>\u0432\u043e-\u043f\u0435\u0440\u0432\u044b\u0445, \u0432 \u0434\u043e\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u043a wav-\u0444\u0430\u0439\u043b\u0430\u043c \u0432\u043c\u0435\u0441\u0442\u043e \u0432\u044b\u0432\u043e\u0434\u0430 \u0432 \u043a\u043e\u043d\u0441\u043e\u043b\u044c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 &#171;\u0432\u0440\u0435\u043c\u044f \u2014 \u0434\u0411&#187; \u0441\u0442\u0430\u043b\u0438 \u0432\u044b\u0432\u043e\u0434\u0438\u0442\u044c \u0441\u0432\u043e\u0435\u043e\u0431\u0440\u0430\u0437\u043d\u0443\u044e &#171;\u043b\u0438\u043d\u0435\u0439\u043a\u0443&#187;: \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u044b\u0439 \u0444\u0430\u0439\u043b\u0438\u043a \u0441\u043e \u0448\u043a\u0430\u043b\u043e\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u043c\u043e\u0433\u0430\u0435\u0442 \u043f\u043e \u043c\u043e\u043c\u0435\u043d\u0442\u0443 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u0443\u0440\u043e\u0432\u0435\u043d\u044c \u0441\u043b\u044b\u0448\u0438\u043c\u043e\u0441\u0442\u0438 (\u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u044b\u0439 \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u043a\u043b\u044e\u0447\u0435\u0432\u044b\u0445 \u0447\u0430\u0441\u0442\u043e\u0442)<\/p>\n<p>  \u041f\u0440\u0438\u043c\u0435\u0440 \u043b\u0438\u043d\u0435\u0439\u043a\u0438<\/p>\n<pre><code>MIN      0:00        0:01        0:02        0:03        0:04        0:05        0:06        0:07        0:08        0:09        0:10     MAX \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500    volume \u2502 -90.00 dB \u2502 -80.00 dB \u2502 -70.00 dB \u2502 -60.00 dB \u2502 -50.00 dB \u2502 -40.00 dB \u2502 -30.00 dB \u2502 -20.00 dB \u2502 -10.00 dB \u2502   0.00 dB \u2502    volume amplitude \u2502   0.00003 \u2502   0.00010 \u2502   0.00032 \u2502   0.00100 \u2502   0.00316 \u2502   0.01000 \u2502   0.03162 \u2502   0.10000 \u2502   0.31623 \u2502   1.00000 \u2502 amplitude <\/code><\/pre>\n<\/li>\n<\/ul>\n<ul>\n<li>\n<p>\u0432\u043e-\u0432\u0442\u043e\u0440\u044b\u0445, \u0441\u043c\u0435\u043d\u0438\u043b\u0438 \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0433\u0440\u043e\u043c\u043a\u043e\u0441\u0442\u0438 \u043d\u0430 \u0432\u043e\u0437\u0440\u0430\u0441\u0442\u0430\u043d\u0438\u0435, \u0434\u0430\u0431\u044b \u0441\u0440\u0430\u0437\u0443 \u043d\u0435 \u043e\u0433\u043b\u043e\u0445\u043d\u0443\u0442\u044c, \u043d\u0430\u0447\u0430\u0432 \u043f\u0440\u043e\u0441\u043b\u0443\u0448\u0438\u0432\u0430\u0442\u044c \u043e\u0431\u0440\u0430\u0437\u0435\u0446. \u0412 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u0435 \u0433\u0440\u043e\u043c\u043a\u043e\u0441\u0442\u044c \u043e\u0431\u0440\u0430\u0437\u0446\u043e\u0432 \u0443\u0431\u044b\u0432\u0430\u043b\u0430.<\/p>\n<\/li>\n<\/ul>\n<h3>gen_hl_samples.py<\/h3>\n<p>\u0413\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440 \u043e\u0431\u0440\u0430\u0437\u0446\u043e\u0432 \u0434\u043b\u044f \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u044f \u0441\u0432\u043e\u0435\u0439 HL-\u0430\u0443\u0434\u0438\u043e\u0433\u0440\u0430\u043c\u043c\u044b: \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442 \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0439 \u0447\u0430\u0441\u0442\u043e\u0442\u044b \u0438\u0437 \u0441\u043f\u0438\u0441\u043a\u0430 <code>[125, 250, 500, 1000, 2000, 4000, 6000]<\/code> wav-\u0444\u0430\u0439\u043b, \u0433\u0440\u043e\u043c\u043a\u043e\u0441\u0442\u044c \u043d\u0430\u0440\u0430\u0441\u0442\u0430\u0435\u0442 \u043e\u0442 <code>vol_min<\/code> \u0434\u043e <code>vol_max<\/code> \u0441\u043e \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c\u044e <code>vol_delta<\/code> \u0434\u0411\/\u0441\u0435\u043a<\/p>\n<pre><code class=\"python\">import numpy as np from scipy.io import wavfile   def db_to_amplitude(level_dB):  # \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0434\u0411 \u0432 \u0430\u043c\u043b\u0438\u0442\u0443\u0434\u0443     return np.power(10.0, level_dB \/ 20.0)   def amplitude_to_db(amplitude):  # \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0430\u043c\u043b\u0438\u0442\u0443\u0442\u044b \u0432 \u0434\u0411     return 20 * np.log10(amplitude)   def line_aka(time, frequency, volume, time_str='', scale_str='', vol_str='', amp_str=''):     if len(time_str) == 0 or len(scale_str) == 0 or len(vol_str) == 0 or len(amp_str) == 0:         time_str = f\"MIN      {time \/\/ 60:0&gt;1.0f}:{time % 60:0&gt;2.0f}\"  # \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u043e\u0442\u043c\u0435\u0442\u043a\u0438 \u0434\u043b\u044f \u0448\u043a\u0430\u043b\u044b         scale_str = f\"\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\"  # \u0448\u043a\u0430\u043b\u0430         # vol_str = f\"  {frequency: &gt;4} Hz \u2502\"  # \u043e\u0442\u043c\u0435\u0442\u043a\u0438 \u0443\u0440\u043e\u0432\u043d\u044f \u0442\u043e\u043d\u0430         vol_str = f\"   volume \u2502\"  # \u043e\u0442\u043c\u0435\u0442\u043a\u0438 \u0443\u0440\u043e\u0432\u043d\u044f \u0442\u043e\u043d\u0430         amp_str = f\"amplitude \u2502\"     else:         time_str += f\"{' ' * 8}{time \/\/ 60:0&gt;1.0f}:{time % 60:0&gt;2.0f}\"         scale_str += f\"{'\u2500' * 11}\u253c\"         vol_str += f\"{volume: &gt;7.2f} dB \u2502\"         amp_str += f\" {db_to_amplitude(volume): &gt;9.5f} \u2502\"      return time_str, scale_str, vol_str, amp_str   if __name__ == \"__main__\":     sampleRate = 44100     duration = 1  # \u0441\u0435\u043a, \u0434\u043b\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0437\u0432\u0443\u0447\u0430\u043d\u0438\u044f \u0442\u043e\u043d\u0430 \u0432 \u043e\u0431\u0440\u0430\u0437\u0446\u0435 \u043d\u0430 \u0442\u0435\u043a\u0443\u0449\u0435\u043c \u0443\u0440\u043e\u0432\u043d\u0435\u043c \u0433\u0440\u043e\u043c\u043a\u043e\u0441\u0442\u0438      sampleCount = sampleRate * duration      s = ''  # \u0448\u043a\u0430\u043b\u0430 \u0432\u0440\u0435\u043c\u044f\/\u0443\u0440\u043e\u0432\u0435\u043d\u044c \u0433\u0440\u043e\u043c\u043a\u043e\u0441\u0442\u0438 \u0442\u043e\u043d\u0430     for freq in [125, 250, 500, 1000, 2000, 4000, 6000]:  # \u0413\u0446, \u0447\u0430\u0441\u0442\u043e\u0442\u0430 \u0442\u043e\u043d\u043e\u0432 \u043e\u0431\u0440\u0430\u0437\u0446\u043e\u0432         samples = np.array([])          # amp = amp_delta = 0.01  # \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u0430\u044f \u0430\u043c\u043b\u0438\u0442\u0443\u0434\u0430 \u0438 \u0448\u0430\u0433 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0430\u043c\u043f\u043b\u0438\u0442\u0443\u0434\u044b         # amp_max = 0.1           # \u043a\u043e\u043d\u0435\u0447\u043d\u0430\u044f \u0430\u043c\u043f\u043b\u0438\u0442\u0443\u0434\u0430         vol_min = -90           # \u0434\u0411, \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u044b\u0439 \u0443\u0440\u043e\u0432\u0435\u043d\u044c \u0433\u0440\u043e\u043c\u043a\u043e\u0441\u0442\u0438         vol_max = 0             # \u0434\u0411, \u043a\u043e\u043d\u0435\u0447\u043d\u044b\u0439 \u0443\u0440\u043e\u0432\u0435\u043d\u044c \u0433\u0440\u043e\u043c\u043a\u043e\u0441\u0442\u0438         vol_delta = 1           # \u0434\u0411, \u0448\u0430\u0433         t = 0                   # \u0441\u0435\u043a, \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u0432\u0440\u0435\u043c\u0435\u043d\u0438          s_time, s_scale, s_dB, s_amp = line_aka(t, freq, None)          for vol_dB in range(vol_min, vol_max + vol_delta, vol_delta):             time_points_array = np.linspace(t, t + duration, sampleCount)              samples_new = np.sin(2 * np.pi * freq * time_points_array)             samples_new *= db_to_amplitude(vol_dB)             samples = np.append(samples, samples_new)              t += duration             s_time, s_scale, s_dB, s_amp = line_aka(t, freq, vol_dB, s_time, s_scale, s_dB, s_amp)          # \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u0447\u0430\u0441\u0442\u043e\u0442\u043d\u043e\u0433\u043e \u043e\u0431\u0440\u0430\u0437\u0446\u0430 \u0432 \u0444\u0430\u0439\u043b         wavfile.write(f\".\/wav_files\/sine_{freq}.wav\", sampleRate, samples)         print(f\"{freq: &gt;4} Hz wav file done!\")      s = f\"{s_time}     MAX\\n{s_scale}\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\\n{s_dB}    volume\\n{s_amp} amplitude\"     # print(s)      with open(f\".\/wav_files\/sine_hearing_levels_scale.txt\", 'w', encoding='utf-8') as file_handle:         file_handle.write(s) <\/code><\/pre>\n<pre><code> 125 Hz wav file done!  250 Hz wav file done!  500 Hz wav file done! 1000 Hz wav file done! 2000 Hz wav file done! 4000 Hz wav file done! 6000 Hz wav file done! <\/code><\/pre>\n<p>\u0410\u0443\u0434\u0438\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u0433\u043e\u0442\u043e\u0432\u044b. \u0412\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u043c \u0434\u0430\u043d\u043d\u044b\u0435 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <code>matplotlib<\/code> \u0438 <code>numpy<\/code>.<\/p>\n<h3>image_builder.py<\/h3>\n<pre><code class=\"python\"># https:\/\/blog.demofox.org\/2015\/04\/14\/decibels-db-and-amplitude\/ #   0 \u0434\u0411 \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 \u043f\u043e\u043b\u043d\u044b\u0439 \u0443\u0440\u043e\u0432\u0435\u043d\u044c \u0441\u0438\u0433\u043d\u0430\u043b\u0430: \u0430\u043c\u043f\u043b\u0438\u0442\u0443\u0434\u0430 == 1.0, \u0442.\u0435. 100% \u0433\u0440\u043e\u043c\u043a\u043e\u0441\u0442\u044c #   \u043a\u0430\u0436\u0434\u044b\u0435 6 \u0434\u0411 \u0441\u0438\u0433\u043d\u0430\u043b \u0438\u0437\u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f \u0432 ~2 \u0440\u0430\u0437\u0430 #       +n \u0434\u0411 - \u0443\u0432\u0435\u043b\u0438\u0447\u0435\u043d\u0438\u0435 \u0433\u0440\u043e\u043c\u043a\u043e\u0441\u0442\u0438 #       -n \u0434\u042c - \u0443\u043c\u0435\u043d\u044c\u0448\u0435\u043d\u0438\u0435 \u0433\u0440\u043e\u043c\u043a\u043e\u0441\u0442\u0438  import matplotlib.pyplot as plt from matplotlib.ticker import EngFormatter, FuncFormatter, PercentFormatter import numpy as np import matplotlib as mpl from mpl_toolkits.axes_grid1 import make_axes_locatable   def db_to_amplitude(level_db):  # \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0434\u0411 \u0432 \u0430\u043c\u043b\u0438\u0442\u0443\u0434\u0443     return np.power(10.0, level_db \/ 20.0)   def amplitude_to_db(amplitude):  # \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0430\u043c\u043b\u0438\u0442\u0443\u0442\u044b \u0432 \u0434\u0411     return 20 * np.log10(amplitude)   audiograms = {  # decibel-frequency audiograms     1: np.array([  # An_         [125, -48.0],         [250, -42.0],         [500, -52.0],         [1000, -36.0],         [2000, -23.0],         [4000, -29.0],         [6000, -19.0],     ]),     2: np.array([  # Mi_         [125, -76.0],         [250, -68.0],         [500, -72.0],         [1000, -73.0],         [2000, -77.0],         [4000, -83.0],         [6000, -78.0],     ])}  for k, a in audiograms.items():     min_y, max_y = a[:, 1].min() * 1.1, 0     img_width, img_height = 16, 9      fig, ax = plt.subplots(1, 1, figsize=(img_width, img_height))     plt.xticks(rotation='vertical')     fig.suptitle(f\"\u0410\u0443\u0434\u0438\u043e\u0433\u0440\u0430\u043c\u043c\u0430 {k} \u0441\u043e\u0442\u0440\u0443\u0434\u043d\u0438\u043a\u0430 Cloud4y\")  # , fontsize=14)     fig.patch.set_facecolor('white')      ax.plot(a[:, 0], a[:, 1], '-o')     ax.set_xscale('log')      ax.set_xlabel(r'\u0427\u0430\u0441\u0442\u043e\u0442\u0430 \u0441\u0438\u0433\u043d\u0430\u043b\u0430')     ax.set_ylabel(r'\u043b\u0443\u0447\u0448\u0435   &lt;&lt;&lt;   \u0423\u0440\u043e\u0432\u0435\u043d\u044c \u0441\u043b\u0443\u0445\u0430 (\u0441\u043b\u044b\u0448\u0438\u043c\u043e\u0441\u0442\u044c \u0441\u0438\u0433\u043d\u0430\u043b\u0430)   &gt;&gt;&gt;   \u0445\u0443\u0436\u0435')     ax.set_ylim(min_y, max_y)     ax.xaxis.set_major_formatter(EngFormatter(unit='\u0413\u0446'))     ax.yaxis.set_major_formatter(EngFormatter(unit='\u0434\u0411'))     ax.xaxis.set_ticks(a[:, 0])     ax.yaxis.set_major_locator(plt.MultipleLocator(10))     ax.yaxis.set_minor_locator(plt.MultipleLocator(2))     ax.grid(axis='y')      # \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0435 \u043e\u0441\u0438 - \u0441\u043f\u043e\u0441\u043e\u0431 1     y2 = ax.secondary_yaxis('right', functions=(db_to_amplitude, amplitude_to_db))     y2.set_yscale('log')     y2.set_ylabel(r'\u0410\u043c\u043f\u043b\u0438\u0442\u0443\u0434\u0430 \u0441\u0438\u0433\u043d\u0430\u043b\u0430')     y2.yaxis.set_major_formatter(FuncFormatter(lambda x, pos: f\"{x: .3f}\"))      y3 = ax.secondary_yaxis(1.1, functions=(db_to_amplitude, amplitude_to_db))     y3.set_yscale('log')     y3.set_ylabel(r'\u0413\u0440\u043e\u043c\u043a\u043e\u0441\u0442\u044c \u0441\u0438\u0433\u043d\u0430\u043b\u0430')     # y3.yaxis.set_major_formatter(FuncFormatter(lambda x, pos: f\"{x * 100:5.1f} %\"))     y3.yaxis.set_major_formatter(PercentFormatter(xmax=1, decimals=1, symbol=' %', is_latex=False))      # # \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0435 \u043e\u0441\u0438 - \u0441\u043f\u043e\u0441\u043e\u0431 2 - \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043d\u0430\u043b\u043e\u0436\u0435\u043d\u0438\u0435 2\u0433\u043e \u0433\u0440\u0430\u0444\u0438\u043a\u0430 \u043d\u0430 1\u0439 \u0432\u043c\u0435\u0441\u0442\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f Y-\u043e\u0441\u0438     # #     \u0447\u0442\u043e\u0431\u044b \u0433\u0440\u0430\u0444\u0438\u043a\u0438 \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u043b\u0438, \u043d\u0443\u0436\u043d\u043e \u043f\u043e\u0434\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u043f\u0440\u0435\u0434\u0435\u043b\u044b     # ax2 = ax.twinx()     # ax2.set_yscale('log')     # ax2.plot(df[:, 0], db_to_amplitude(df[:, 1]), 'y:x')     # ax2.set_ylabel(r'Signal Amplitude')     # ax2.set_ylim(db_to_amplitude(min_y), db_to_amplitude(max_y))     # ax2.yaxis.set_major_formatter(FuncFormatter(lambda x, pos: f\"{x:.3f}\"))     # ax2.xaxis.set_ticks(df[:, 0])      ax.axhline(y=a[:, 1].max() + 1, linestyle=\"-\", color='C2')   # demo_1_audible_normally     ax.axhline(y=np.median(a[:, 1]), linestyle=\"-\", color='C1')  # demo_2_audible_partially     ax.axhline(y=a[:, 1].min() - 1, linestyle=\"-\", color='C3')   # demo_3_not_audible      labels = [         \"HL-\u0410\u0443\u0434\u0438\u043e\u0433\u0440\u0430\u043c\u043c\u0430 (Hearing Level)\",         f\"demo_1: {a[:, 1].max() + 1: .0f} \u0434\u0411 \u2261 {db_to_amplitude(a[:, 1].max() + 1): .5f}, \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u043d\u0435 \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f\",         f\"demo_2: {np.median(a[:, 1]): .0f} \u0434\u0411 \u2261 {db_to_amplitude(np.median(a[:, 1])): .5f}, \u0434\u043b\u044f \u0447\u0430\u0441\u0442\u0438\u0447\u043d\u043e\u0439 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u043a\u0438\",         f\"demo_3: {a[:, 1].min() - 1: .0f} \u0434\u0411 \u2261 {db_to_amplitude(a[:, 1].min() - 1): .5f}, \u0434\u043b\u044f \u043f\u043e\u043b\u043d\u043e\u0439 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u043a\u0438 \u043f\u043e \u0430\u0443\u0434\u0438\u043e\u0433\u0440\u0430\u043c\u043c\u0435\",     ]     plt.legend(labels=labels)      divider = make_axes_locatable(ax)     cax = divider.append_axes(\"left\", size=\"0.7%\", pad=-.09)     cax.set_ylim(min_y, max_y)     norm = mpl.colors.Normalize(vmin=min_y, vmax=max_y)     cmap = mpl.cm.ScalarMappable(norm=norm, cmap='RdYlGn_r', )     fig.colorbar(cmap, cax=cax)     cax.yaxis.set_major_locator(plt.MultipleLocator(10))     cax.yaxis.set_minor_locator(plt.MultipleLocator(2))     cax.set_yticklabels([])      fig.tight_layout()     plt.show() <\/code><\/pre>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/964\/d8c\/85c\/964d8c85c6e90094420e35478446cbd1.png\" width=\"1147\" height=\"638\"><figcaption><\/figcaption><\/figure>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/353\/593\/33f\/35359333f76ab11a8c55dd9e87c1b50d.png\" width=\"1147\" height=\"638\"><figcaption><\/figcaption><\/figure>\n<p>\u041d\u0430 \u043a\u0430\u0436\u0434\u043e\u0439 \u0430\u0443\u0434\u0438\u043e\u0433\u0440\u0430\u043c\u043c\u0435 \u043e\u0442\u043c\u0435\u0447\u0435\u043d\u044b \u0442\u0440\u0438 \u0443\u0440\u043e\u0432\u043d\u044f \u0433\u0440\u043e\u043c\u043a\u043e\u0441\u0442\u0438, &#8216;\u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e \u0441\u043b\u044b\u0448\u043d\u043e&#8217;, &#8216;\u0447\u0430\u0441\u0442\u0438\u0447\u043d\u043e \u0441\u043b\u044b\u0448\u043d\u043e&#8217;, &#8216;\u0441\u043e\u0432\u0441\u0435\u043c \u043d\u0435 \u0441\u043b\u044b\u0448\u043d\u043e&#8217;, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043c\u044b \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u043c \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <code>gen_continuous_sample.py<\/code> \u0434\u0435\u043c\u043a\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0437\u0430\u0442\u0435\u043c \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u0435\u043c \u0438\u0445 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u043e\u043c, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043d\u044f\u0442\u044c, \u043d\u0430\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0445\u043e\u0440\u043e\u0448\u043e \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u0442 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430.<\/p>\n<h3>gen_continuous_sample.py<\/h3>\n<p>\u0413\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u043e\u0431\u0440\u0430\u0437\u0446\u043e\u0432 \u0441 \u0442\u0440\u0435\u043c\u044f \u0440\u0430\u0437\u043d\u044b\u043c\u0438 \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u044b\u043c\u0438 \u0443\u0440\u043e\u0432\u043d\u044f\u043c\u0438 \u0433\u0440\u043e\u043c\u043a\u043e\u0441\u0442\u0438, \u0447\u0430\u0441\u0442\u043e\u0442\u0430 \u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f \u043e\u0442 <code>freq_start<\/code> \u0434\u043e <code>freq_end<\/code> \u0441\u043e \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c\u044e <code>freq_inc\/time_inc<\/code> \u0413\u0446\/\u0441\u0435\u043a.<\/p>\n<pre><code class=\"python\">from scipy.io import wavfile import numpy as np   def db_to_amplitude(level_db):  # \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0434\u0411 \u0432 \u0430\u043c\u043b\u0438\u0442\u0443\u0434\u0443     return np.power(10.0, level_db \/ 20.0)   def amplitude_to_db(amplitude):  # \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0430\u043c\u043b\u0438\u0442\u0443\u0442\u044b \u0432 \u0434\u0411     return 20 * np.log10(amplitude)   def generate_samples(sample_rate, level=-20.0):     amp = db_to_amplitude(level)  # \u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 \u0430\u043c\u043b\u0438\u0442\u0443\u0434\u044b (\u0443\u0440\u043e\u0432\u043d\u044f \u0433\u0440\u043e\u043c\u043a\u043e\u0441\u0442\u0438) \u0441\u0438\u0433\u043d\u0430\u043b\u0430 (1 \u2261 0 dB)      freq_start = 125  # \u0413\u0446     freq_end = 8000  # \u0413\u0446      freq_inc = 25  # \u0413\u0446, \u0448\u0430\u0433 \u0443\u0432\u0435\u043b\u0438\u0447\u0435\u043d\u0438\u044f \u0442\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u0438     time_inc = .25  # \u0441\u0435\u043a, \u0434\u043b\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0441\u0438\u0433\u043d\u0430\u043b\u0430 \u043f\u0435\u0440\u0435\u0434 \u0443\u0432\u0435\u043b\u0438\u0447\u0435\u043d\u0438\u0435\u043c \u0442\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u0438      print(f\"amplitude {amp: .5f} \u2261 {np.round(20 * np.log10(amp), 2)} dB\")      inc_sample_count = int(sample_rate * time_inc)     sample = np.array([])      freq = freq_start     t = 0.0     while freq &lt; freq_end:         time_points_array = np.linspace(t, t + time_inc, inc_sample_count, endpoint=False)          new_samples = np.sin(2 * np.pi * freq * time_points_array)         new_samples *= amp          sample = np.append(sample, new_samples)          freq += freq_inc         t += time_inc      return sample   if __name__ == '__main__':     levels_a = {'demo_1_audible_normally': -18.0, 'demo_2_audible_partially': -36.0, 'demo_3_not_audible': -53.0}  # An_     levels_m = {'demo_1_audible_normally': -67.0, 'demo_2_audible_partially': -76.0, 'demo_3_not_audible': -84.0}  # Mi_     levels = {1: levels_a, 2: levels_m}     sampleRate = 44100      for k, l in levels.items():         for name, level in l.items():             generated_samples = generate_samples(sampleRate, level=level)             wavfile.write(f\".\/wav_files\/{k}_{name}.wav\", sampleRate, generated_samples) <\/code><\/pre>\n<pre><code>amplitude  0.12589 \u2261 -18.0 dB amplitude  0.01585 \u2261 -36.0 dB amplitude  0.00224 \u2261 -53.0 dB amplitude  0.00045 \u2261 -67.0 dB amplitude  0.00016 \u2261 -76.0 dB amplitude  0.00006 \u2261 -84.0 dB <\/code><\/pre>\n<p>\u0414\u0435\u043c\u043e-wav \u0433\u043e\u0442\u043e\u0432\u044b \u0434\u043b\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <code>gain.py<\/code>.<\/p>\n<h3>gain.py<\/h3>\n<pre><code class=\"python\">from scipy.io import wavfile  import numpy as np import time import os.path   # \u043d\u0430\u0445\u043e\u0434\u0438\u0442 \u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0433\u043b\u0430\u0432\u043d\u0443\u044e \u0447\u0430\u0441\u0442\u043e\u0442\u0443 \u0432 \u0437\u0430\u0434\u0430\u043d\u043d\u043e\u043c \u043e\u043a\u043d\u0435 \u0438 \u0443\u0440\u043e\u0432\u0435\u043d\u044c \u0441\u0438\u0433\u043d\u0430\u043b\u0430 def get_dominant_freq(sample_rate, window):     # \u043e\u0431\u043b\u0430\u0441\u0442\u044c \u0447\u0430\u0441\u0442\u043e\u0442 \u043e\u043a\u043d\u0430     yf = np.fft.fft(window)     yf = np.abs(2 * yf \/ len(window))      window_size = len(window)     window_half = len(window) \/\/ 2      max_amp = yf[:window_half].max()     max_amp_idx = yf[:window_half].argmax()      # \u043f\u043e\u0438\u0441\u043a \u0447\u0430\u0441\u0442\u043e\u0442\u044b \u043f\u043e \u0435\u0451 \u0438\u043d\u0434\u0435\u043a\u0441\u0443     frequency = sample_rate * max_amp_idx \/ window_size  # frequency = (sample_rate\/2) * max_amp_idx \/ (window_size\/2)      return frequency, amplitude_to_db(max_amp)   def get_gain(freq, dB, audiogram):  # \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0439 \u0441\u0434\u0432\u0438\u0433 \u0443\u0440\u043e\u0432\u043d\u044f \u0434\u043b\u044f \u0441\u0438\u0433\u043d\u0430\u043b\u0430 \u0434\u043b\u044f \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u0439 \u0447\u0430\u0441\u0442\u043e\u0442\u044b \u0441\u043e\u0433\u043b\u0430\u0441\u043d\u043e \u0430\u0443\u0434\u0438\u043e\u0433\u0440\u0430\u043c\u043c\u0435     threshold = None      if freq &lt; audiogram[0][0]:         threshold = audiogram[0][1]     else:         for i in range(len(audiogram) - 1):             if freq &gt;= audiogram[i + 1][0]:                 continue             threshold = (audiogram[i + 1][1] - audiogram[i][1]) * \\                         (freq - audiogram[i][0]) \/ (audiogram[i + 1][0] - audiogram[i][0]) + audiogram[i][1]             break          if threshold is None:             threshold = audiogram[-1][1]      if threshold &lt;= dB:  # \u0443\u0440\u043e\u0432\u0435\u043d\u044c \u0441\u0438\u0433\u043d\u0430\u043b\u0430 \u0443\u0436\u0435 \u0432 \u0437\u043e\u043d\u0435 \u0441\u043b\u044b\u0448\u0438\u043c\u043e\u0441\u0442\u0438         return 0.0     else:  # \u0441\u0434\u0432\u0438\u0433 \u0443\u0440\u043e\u0432\u043d\u044f \u0441\u0438\u0433\u043d\u0430\u043b\u0430 \u0432 \u0437\u043e\u043d\u0443 \u0441\u043b\u044b\u0448\u0438\u043c\u043e\u0441\u0442\u0438         return threshold - dB + 3   def db_to_amplitude(dB):  # \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0434\u0411 \u0432 \u0430\u043c\u043b\u0438\u0442\u0443\u0434\u0443     return np.power(10.0, dB \/ 20.0)   def amplitude_to_db(amp):  # \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0430\u043c\u043b\u0438\u0442\u0443\u0442\u044b \u0432 \u0434\u0411     return 20 * np.log10(amp)   if __name__ == \"__main__\":     start_time = time.time()      df_1 = np.array([  # An_         [125, -48.0],         [250, -42.0],         [500, -52.0],         [1000, -36.0],         [2000, -23.0],         [4000, -29.0],         [6000, -19.0],     ])     df_2 = np.array([  # Mi_         [125, -76.0],         [250, -68.0],         [500, -72.0],         [1000, -73.0],         [2000, -77.0],         [4000, -83.0],         [6000, -78.0],     ])      # \u0441\u0447\u0438\u0442\u044b\u0432\u0430\u043d\u0438\u0435 \u0434\u0435\u043c\u043e-\u0444\u0430\u0439\u043b\u043e\u0432     wavfiles = [         ['1_demo_1_audible_normally.wav', '1_demo_2_audible_partially.wav', '1_demo_3_not_audible.wav'],         ['2_demo_1_audible_normally.wav', '2_demo_2_audible_partially.wav', '2_demo_3_not_audible.wav']     ]      for files, audiogram in zip(wavfiles, [df_1, df_2]):         for file in files:             file_name = file.split('.')[0]             sampleRate, samples = wavfile.read(os.path.join(os.getcwd(), 'wav_files', file), mmap=True)             outSamples = np.array([])  # \u043d\u0430\u0431\u043e\u0440 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u043d\u044b\u0445 \u0443\u0447\u0430\u0441\u0442\u043a\u043e\u0432 \u0434\u043b\u044f \u043d\u043e\u0432\u043e\u0433\u043e \u0444\u0430\u0439\u043b\u0430             windowSize = 512             sampleIdx = 0             while sampleIdx &lt; len(samples):                 window = samples[sampleIdx:sampleIdx + windowSize]                  freq, dB = get_dominant_freq(sampleRate, window)                 gain = get_gain(freq, dB, audiogram=audiogram)                  startSec = np.round(sampleIdx \/ sampleRate, 2)                 endSec = np.round((sampleIdx + windowSize) \/ sampleRate, 2)                  if gain &gt; 0.0:                     # print(f\"{file_name}\\t{startSec: &gt;6.3f}..{endSec: &lt;6.3f}s\\tGAINED\\t{freq: &gt;8.2f} Hz\\tvol {dB: &gt;6.2f} dB\\tgain: {gain: &gt;6.2f} dB\")                     amp = db_to_amplitude(gain)                     amplified = window * amp                 else:                     # print(f\"{file_name}\\t{startSec: &gt;6.3f}..{endSec: &lt;6.3f}s\\tSTOCK\\t{freq: &gt;8.2f} Hz\\tvol {dB: &gt;6.2f} dB\\tgain: {gain: &gt;6.2f} dB\")                     amplified = window                  outSamples = np.append(outSamples, amplified)                  sampleIdx += windowSize              processed_file = os.path.join(os.getcwd(), 'wav_files', f\"{file_name}_processed.wav\")             wavfile.write(processed_file, sampleRate, outSamples)             print('ready', os.path.relpath(processed_file))      print(f\"{(time.time() - start_time)} seconds\") <\/code><\/pre>\n<pre><code>ready wav_files\\1_demo_1_audible_normally_processed.wav ready wav_files\\1_demo_2_audible_partially_processed.wav ready wav_files\\1_demo_3_not_audible_processed.wav ready wav_files\\2_demo_1_audible_normally_processed.wav ready wav_files\\2_demo_2_audible_partially_processed.wav ready wav_files\\2_demo_3_not_audible_processed.wav 180.6359121799469 seconds <\/code><\/pre>\n<p>\u0412\u0441\u0451 \u0433\u043e\u0442\u043e\u0432\u043e! \u041c\u043e\u0436\u043d\u043e \u043f\u043e\u0441\u043b\u0443\u0448\u0430\u0442\u044c \u0434\u0435\u043c\u043a\u0438, \u043e\u0446\u0435\u043d\u0438\u0442\u044c \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0443, \u043f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u0442\u044c \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0435 \u0430\u0443\u0434\u0438\u043e\u0444\u0430\u0439\u043b\u044b, \u043d\u0430\u043a\u043e\u043d\u0435\u0446. \u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043d\u0435 \u0438\u0434\u0435\u0430\u043b\u0435\u043d, \u043d\u043e \u0432\u043f\u043e\u043b\u043d\u0435 \u0440\u0430\u0431\u043e\u0447\u0438\u0439, \u0434\u0435\u043c\u043a\u0438 \u0441\u0442\u0430\u043b\u043e \u0441\u043b\u044b\u0448\u043d\u043e.<\/p>\n<p>\u0420\u0430\u0434\u0438 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0430 \u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0433\u043e \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044f \u043c\u043e\u0436\u043d\u043e \u0434\u0430\u0436\u0435 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0444\u0430\u0439\u043b\u044b &#171;\u0434\u043e&#187; \u0438 &#171;\u043f\u043e\u0441\u043b\u0435&#187; \u0432 <code>Praat<\/code>. \u0421\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u0432\u0438\u0434\u043d\u043e \u0438\u0437\u044a\u044f\u043d \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430: \u0443\u0441\u0438\u043b\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u0442\u0435 \u0447\u0430\u0441\u0442\u043e\u0442\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0437\u0430\u0432\u0435\u0434\u043e\u043c\u043e \u043d\u0430\u0445\u043e\u0434\u044f\u0442\u0441\u044f \u0432 \u0437\u043e\u043d\u0435 \u0441\u043b\u044b\u0448\u0438\u043c\u043e\u0441\u0442\u0438 \u0438 \u0443\u0441\u0438\u043b\u0438\u0432\u0430\u0442\u044c\u0441\u044f \u043d\u0435 \u0434\u043e\u043b\u0436\u043d\u044b. \u042d\u0442\u043e \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u0437\u0430\u043c\u0435\u0442\u043d\u043e \u043d\u0430 \u043f\u0435\u0440\u0432\u043e\u0439 \u0434\u0435\u043c\u043a\u0435, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0431\u044b\u043b\u0430 \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0430 \u0437\u0430\u0432\u0435\u0434\u043e\u043c\u043e \u0441\u043b\u044b\u0448\u0438\u043c\u043e\u0439 \u043d\u0430 \u0432\u0441\u0435\u043c \u0447\u0430\u0441\u0442\u043e\u0442\u043d\u043e\u043c \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0435:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/c27\/a6f\/905\/c27a6f90556c82d3bf3c3a3c836943b6.png\" width=\"1307\" height=\"1306\"><figcaption><\/figcaption><\/figure>\n<p>\u0421\u043f\u0430\u0441\u0438\u0431\u043e \u0437\u0430 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u0438 \u0431\u0443\u0434\u044c\u0442\u0435 \u0437\u0434\u043e\u0440\u043e\u0432\u044b!<\/p>\n<hr>\n<p><strong>\u0427\u0442\u043e \u0435\u0449\u0451 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u0433\u043e \u0435\u0441\u0442\u044c \u0432 \u0431\u043b\u043e\u0433\u0435&nbsp;<\/strong><a href=\"https:\/\/www.cloud4y.ru\/?utm_source=habr&amp;utm_medium=referral&amp;utm_campaign=article\"><strong>Cloud4Y<\/strong><\/a><\/p>\n<p>\u2192&nbsp;<a href=\"https:\/\/habr.com\/ru\/company\/cloud4y\/blog\/565074\/\">\u0418\u0437\u0443\u0447\u0430\u0435\u043c \u0441\u0432\u043e\u0451 \u0436\u0435\u043b\u0435\u0437\u043e: \u0441\u0431\u0440\u043e\u0441 \u043f\u0430\u0440\u043e\u043b\u0435\u0439 BIOS \u043d\u0430 \u043d\u043e\u0443\u0442\u0431\u0443\u043a\u0430\u0445<\/a><\/p>\n<p>\u2192&nbsp;<a href=\"https:\/\/habr.com\/ru\/company\/cloud4y\/blog\/547164\/\">\u0427\u0430\u0441\u0442\u044b\u0435 \u043e\u0448\u0438\u0431\u043a\u0438 \u0432 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430\u0445 Nginx, \u0438\u0437-\u0437\u0430 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0432\u0435\u0431-\u0441\u0435\u0440\u0432\u0435\u0440 \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u0443\u044f\u0437\u0432\u0438\u043c\u044b\u043c<\/a><\/p>\n<p>\u2192&nbsp;<a href=\"https:\/\/habr.com\/ru\/company\/cloud4y\/news\/t\/566874\/\">\u0425\u043e\u043c\u044f\u043a \u0442\u043e\u0440\u0433\u0443\u0435\u0442 \u043a\u0440\u0438\u043f\u0442\u043e\u0432\u0430\u043b\u044e\u0442\u043e\u0439 \u043d\u0435 \u0445\u0443\u0436\u0435, \u0447\u0435\u043c \u0442\u0440\u0435\u0439\u0434\u0435\u0440<\/a>  <\/p>\n<p>\u2192&nbsp;<a href=\"https:\/\/habr.com\/ru\/company\/cloud4y\/blog\/555722\/\">\u041e\u0431\u043b\u0430\u0447\u043d\u0430\u044f \u043a\u0443\u0445\u043d\u044f: \u0433\u043e\u0442\u043e\u0432\u0438\u043c \u0434\u0430\u043d\u043d\u044b\u0435 \u0434\u043b\u044f \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433\u0430 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e vCloud API \u0438 \u0441\u043a\u043e\u0440\u043e\u0432\u0430\u0440\u043a\u0438<\/a><\/p>\n<p>\u2192&nbsp;<a href=\"https:\/\/habr.com\/ru\/company\/cloud4y\/blog\/565014\/\">\u042d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442 \u0434\u043b\u044f \u0441\u043e\u0442\u0440\u0443\u0434\u043d\u0438\u043a\u0430 \u0441 \u043d\u0430\u0440\u0443\u0448\u0435\u043d\u0438\u0435\u043c \u0441\u043b\u0443\u0445\u0430, \u0447. 1<\/a>  <\/p>\n<p>\u041f\u043e\u0434\u043f\u0438\u0441\u044b\u0432\u0430\u0439\u0442\u0435\u0441\u044c \u043d\u0430 \u043d\u0430\u0448&nbsp;<a href=\"https:\/\/t.me\/cloud4y\">Telegram<\/a>-\u043a\u0430\u043d\u0430\u043b, \u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u043f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u043e\u0447\u0435\u0440\u0435\u0434\u043d\u0443\u044e \u0441\u0442\u0430\u0442\u044c\u044e. \u041f\u0438\u0448\u0435\u043c \u043d\u0435 \u0447\u0430\u0449\u0435 \u0434\u0432\u0443\u0445 \u0440\u0430\u0437 \u0432 \u043d\u0435\u0434\u0435\u043b\u044e \u0438 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e \u0434\u0435\u043b\u0443.<\/p>\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\/company\/cloud4y\/blog\/567318\/\"> https:\/\/habr.com\/ru\/company\/cloud4y\/blog\/567318\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"\n<div class=\"post__text post__text_v2\" id=\"post-content-body\">\n<p>\u041f\u0440\u0438\u0432\u0435\u0442! \u0412 <a href=\"https:\/\/habr.com\/ru\/company\/cloud4y\/blog\/565014\/\">\u043f\u0435\u0440\u0432\u043e\u0439 \u0447\u0430\u0441\u0442\u0438<\/a> \u043c\u044b \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u043b\u0438, \u0437\u0430\u0447\u0435\u043c \u0432\u043e\u043e\u0431\u0449\u0435 \u0440\u0435\u0448\u0438\u043b\u0438 \u0437\u0430\u043d\u044f\u0442\u044c\u0441\u044f \u044d\u0442\u0438\u043c \u0432\u043e\u043f\u0440\u043e\u0441\u043e\u043c, \u0430 \u0442\u0430\u043a\u0436\u0435 \u043f\u043e\u0434\u0435\u043b\u0438\u043b\u0438\u0441\u044c \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u043e\u043c \u0441\u0442\u0430\u0442\u044c\u0438, \u0441\u0442\u0430\u0432\u0448\u0435\u0439 \u0434\u043b\u044f \u043d\u0430\u0441 \u043e\u0442\u043f\u0440\u0430\u0432\u043d\u043e\u0439 \u0442\u043e\u0447\u043a\u043e\u0439 \u0434\u043b\u044f \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0445 \u0438\u0437\u044b\u0441\u043a\u0430\u043d\u0438\u0439. \u0422\u0435\u043f\u0435\u0440\u044c \u0445\u043e\u0442\u0438\u043c \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u0442\u044c, \u043a\u0430\u043a \u043c\u044b \u0434\u043e\u0440\u0430\u0431\u043e\u0442\u0430\u043b\u0438 \u0438\u0434\u0435\u044e \u043f\u043e\u0434 \u043d\u0430\u0448\u0435\u0433\u043e \u0441\u043e\u0442\u0440\u0443\u0434\u043d\u0438\u043a\u0430.<\/p>\n<p>\u041e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0435 \u0441\u043f\u0430\u0441\u0438\u0431\u043e \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0442\u043e\u0440\u0430\u043c, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043e\u0442\u043c\u0435\u0442\u0438\u043b\u0438\u0441\u044c \u0432 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u044f\u0445 \u043a \u043f\u0435\u0440\u0432\u043e\u0439 \u0447\u0430\u0441\u0442\u0438.  \u0423\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u0441 \u043a\u043e\u0441\u0442\u043d\u043e\u0439 \u043f\u0440\u043e\u0432\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u044c\u044e, \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d\u044b\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0432\u0440\u043e\u0434\u0435 Equalizer APO 1.2.1, \u0441\u043b\u0443\u0445\u043e\u0432\u044b\u0435 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u0441 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u043e\u0439 Bluetooth  \u2014 \u043c\u044b \u0441\u043e\u0431\u0440\u0430\u043b\u0438 \u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u043b\u0438 \u0432\u0441\u0435 \u0432\u0430\u0448\u0438 \u0438\u0434\u0435\u0438. \u041c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c, \u0447\u0442\u043e-\u0442\u043e \u0438\u0437 \u044d\u0442\u043e\u0433\u043e \u0438 \u0432\u044b\u0439\u0434\u0435\u0442. \u041d\u043e \u043c\u044b \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0435\u043c \u043e \u0441\u0432\u043e\u0451\u043c \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0435. \u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e, \u043e\u043d \u0442\u043e\u0436\u0435 \u043a\u043e\u043c\u0443-\u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u043b\u0435\u0437\u0435\u043d. <\/p>\n<h2>\u041f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0430<\/h2>\n<p>\u0414\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u043d\u0443\u0436\u043d\u043e \u043f\u043e\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0441\u0432\u043e\u0438 HL-\u0430\u0443\u0434\u0438\u0433\u0440\u0430\u043c\u043c\u044b (&#8216;Hearing Levels&#8217;). \u0421\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u043c wav-\u043e\u0431\u0440\u0430\u0437\u0446\u044b \u043d\u0430 \u043a\u043b\u044e\u0447\u0435\u0432\u044b\u0445 \u0447\u0430\u0441\u0442\u043e\u0442\u0430\u0445 \u0441 \u043f\u043e\u0441\u0442\u0435\u043f\u0435\u043d\u043d\u043e \u0432\u043e\u0437\u0440\u0430\u0441\u0442\u0430\u044e\u0449\u0435\u0439 \u0433\u0440\u043e\u043c\u043a\u043e\u0441\u0442\u044c\u044e \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <code>gen_hl_samples.py<\/code>, \u043f\u0440\u043e\u0441\u043b\u0443\u0448\u0430\u0435\u043c \u0438\u0445 \u0438 \u0437\u0430\u043f\u0438\u0448\u0435\u043c \u0432\u0440\u0435\u043c\u044f, \u043a\u043e\u0433\u0434\u0430 \u0441\u0442\u0430\u043b\u043e \u0441\u043b\u044b\u0448\u043d\u043e \u043a\u0430\u0436\u0434\u044b\u0439 \u0438\u0437 \u043e\u0431\u0440\u0430\u0437\u0446\u043e\u0432. \u0414\u0430\u043b\u0435\u0435 \u043f\u043e &#171;\u043b\u0438\u043d\u0435\u0439\u043a\u0435&#187; \u0441\u043e\u043f\u043e\u0441\u0442\u0430\u0432\u0438\u043c \u0432\u0440\u0435\u043c\u044f \u0441 \u0443\u0440\u043e\u0432\u043d\u0435\u043c \u0433\u0440\u043e\u043c\u043a\u043e\u0441\u0442\u0438 \u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u043c \u0441\u0432\u043e\u044e \u0430\u0443\u0434\u0438\u043e\u0433\u0440\u0430\u043c\u043c\u0443 \u0432 \u0432\u0438\u0434\u0435 \u043d\u0430\u0431\u043e\u0440\u0430 &#171;\u0447\u0430\u0441\u0442\u043e\u0442\u0430&#187; \u2014 &#171;\u0443\u0440\u043e\u0432\u0435\u043d\u044c \u0441\u043b\u044b\u0448\u0438\u043c\u043e\u0441\u0442\u0438 \u0447\u0430\u0441\u0442\u043e\u0442\u044b&#187;.<\/p>\n<p>\u0412 \u0430\u0432\u0442\u043e\u0440\u0441\u043a\u0438\u0439 \u043a\u043e\u0434 <code>gen_hl_samples.py<\/code> \u0431\u044b\u043b\u0438 \u0432\u043d\u0435\u0441\u0435\u043d\u044b \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f:<\/p>\n<ul>\n<li>\n<p>\u0432\u043e-\u043f\u0435\u0440\u0432\u044b\u0445, \u0432 \u0434\u043e\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u043a wav-\u0444\u0430\u0439\u043b\u0430\u043c \u0432\u043c\u0435\u0441\u0442\u043e \u0432\u044b\u0432\u043e\u0434\u0430 \u0432 \u043a\u043e\u043d\u0441\u043e\u043b\u044c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 &#171;\u0432\u0440\u0435\u043c\u044f \u2014 \u0434\u0411&#187; \u0441\u0442\u0430\u043b\u0438 \u0432\u044b\u0432\u043e\u0434\u0438\u0442\u044c \u0441\u0432\u043e\u0435\u043e\u0431\u0440\u0430\u0437\u043d\u0443\u044e &#171;\u043b\u0438\u043d\u0435\u0439\u043a\u0443&#187;: \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u044b\u0439 \u0444\u0430\u0439\u043b\u0438\u043a \u0441\u043e \u0448\u043a\u0430\u043b\u043e\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u043c\u043e\u0433\u0430\u0435\u0442 \u043f\u043e \u043c\u043e\u043c\u0435\u043d\u0442\u0443 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u0443\u0440\u043e\u0432\u0435\u043d\u044c \u0441\u043b\u044b\u0448\u0438\u043c\u043e\u0441\u0442\u0438 (\u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u044b\u0439 \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u043a\u043b\u044e\u0447\u0435\u0432\u044b\u0445 \u0447\u0430\u0441\u0442\u043e\u0442)<\/p>\n<p>  \u041f\u0440\u0438\u043c\u0435\u0440 \u043b\u0438\u043d\u0435\u0439\u043a\u0438<\/p>\n<pre><code>MIN      0:00        0:01        0:02        0:03        0:04        0:05        0:06        0:07        0:08        0:09        0:10     MAX \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500    volume \u2502 -90.00 dB \u2502 -80.00 dB \u2502 -70.00 dB \u2502 -60.00 dB \u2502 -50.00 dB \u2502 -40.00 dB \u2502 -30.00 dB \u2502 -20.00 dB \u2502 -10.00 dB \u2502   0.00 dB \u2502    volume amplitude \u2502   0.00003 \u2502   0.00010 \u2502   0.00032 \u2502   0.00100 \u2502   0.00316 \u2502   0.01000 \u2502   0.03162 \u2502   0.10000 \u2502   0.31623 \u2502   1.00000 \u2502 amplitude <\/code><\/pre>\n<\/li>\n<\/ul>\n<ul>\n<li>\n<p>\u0432\u043e-\u0432\u0442\u043e\u0440\u044b\u0445, \u0441\u043c\u0435\u043d\u0438\u043b\u0438 \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0433\u0440\u043e\u043c\u043a\u043e\u0441\u0442\u0438 \u043d\u0430 \u0432\u043e\u0437\u0440\u0430\u0441\u0442\u0430\u043d\u0438\u0435, \u0434\u0430\u0431\u044b \u0441\u0440\u0430\u0437\u0443 \u043d\u0435 \u043e\u0433\u043b\u043e\u0445\u043d\u0443\u0442\u044c, \u043d\u0430\u0447\u0430\u0432 \u043f\u0440\u043e\u0441\u043b\u0443\u0448\u0438\u0432\u0430\u0442\u044c \u043e\u0431\u0440\u0430\u0437\u0435\u0446. \u0412 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u0435 \u0433\u0440\u043e\u043c\u043a\u043e\u0441\u0442\u044c \u043e\u0431\u0440\u0430\u0437\u0446\u043e\u0432 \u0443\u0431\u044b\u0432\u0430\u043b\u0430.<\/p>\n<\/li>\n<\/ul>\n<h3>gen_hl_samples.py<\/h3>\n<p>\u0413\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440 \u043e\u0431\u0440\u0430\u0437\u0446\u043e\u0432 \u0434\u043b\u044f \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u044f \u0441\u0432\u043e\u0435\u0439 HL-\u0430\u0443\u0434\u0438\u043e\u0433\u0440\u0430\u043c\u043c\u044b: \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442 \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0439 \u0447\u0430\u0441\u0442\u043e\u0442\u044b \u0438\u0437 \u0441\u043f\u0438\u0441\u043a\u0430 <code>[125, 250, 500, 1000, 2000, 4000, 6000]<\/code> wav-\u0444\u0430\u0439\u043b, \u0433\u0440\u043e\u043c\u043a\u043e\u0441\u0442\u044c \u043d\u0430\u0440\u0430\u0441\u0442\u0430\u0435\u0442 \u043e\u0442 <code>vol_min<\/code> \u0434\u043e <code>vol_max<\/code> \u0441\u043e \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c\u044e <code>vol_delta<\/code> \u0434\u0411\/\u0441\u0435\u043a<\/p>\n<pre><code class=\"python\">import numpy as np from scipy.io import wavfile   def db_to_amplitude(level_dB):  # \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0434\u0411 \u0432 \u0430\u043c\u043b\u0438\u0442\u0443\u0434\u0443     return np.power(10.0, level_dB \/ 20.0)   def amplitude_to_db(amplitude):  # \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0430\u043c\u043b\u0438\u0442\u0443\u0442\u044b \u0432 \u0434\u0411     return 20 * np.log10(amplitude)   def line_aka(time, frequency, volume, time_str='', scale_str='', vol_str='', amp_str=''):     if len(time_str) == 0 or len(scale_str) == 0 or len(vol_str) == 0 or len(amp_str) == 0:         time_str = f\"MIN      {time \/\/ 60:0&gt;1.0f}:{time % 60:0&gt;2.0f}\"  # \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u043e\u0442\u043c\u0435\u0442\u043a\u0438 \u0434\u043b\u044f \u0448\u043a\u0430\u043b\u044b         scale_str = f\"\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\"  # \u0448\u043a\u0430\u043b\u0430         # vol_str = f\"  {frequency: &gt;4} Hz \u2502\"  # \u043e\u0442\u043c\u0435\u0442\u043a\u0438 \u0443\u0440\u043e\u0432\u043d\u044f \u0442\u043e\u043d\u0430         vol_str = f\"   volume \u2502\"  # \u043e\u0442\u043c\u0435\u0442\u043a\u0438 \u0443\u0440\u043e\u0432\u043d\u044f \u0442\u043e\u043d\u0430         amp_str = f\"amplitude \u2502\"     else:         time_str += f\"{' ' * 8}{time \/\/ 60:0&gt;1.0f}:{time % 60:0&gt;2.0f}\"         scale_str += f\"{'\u2500' * 11}\u253c\"         vol_str += f\"{volume: &gt;7.2f} dB \u2502\"         amp_str += f\" {db_to_amplitude(volume): &gt;9.5f} \u2502\"      return time_str, scale_str, vol_str, amp_str   if __name__ == \"__main__\":     sampleRate = 44100     duration = 1  # \u0441\u0435\u043a, \u0434\u043b\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0437\u0432\u0443\u0447\u0430\u043d\u0438\u044f \u0442\u043e\u043d\u0430 \u0432 \u043e\u0431\u0440\u0430\u0437\u0446\u0435 \u043d\u0430 \u0442\u0435\u043a\u0443\u0449\u0435\u043c \u0443\u0440\u043e\u0432\u043d\u0435\u043c \u0433\u0440\u043e\u043c\u043a\u043e\u0441\u0442\u0438      sampleCount = sampleRate * duration      s = ''  # \u0448\u043a\u0430\u043b\u0430 \u0432\u0440\u0435\u043c\u044f\/\u0443\u0440\u043e\u0432\u0435\u043d\u044c \u0433\u0440\u043e\u043c\u043a\u043e\u0441\u0442\u0438 \u0442\u043e\u043d\u0430     for freq in [125, 250, 500, 1000, 2000, 4000, 6000]:  # \u0413\u0446, \u0447\u0430\u0441\u0442\u043e\u0442\u0430 \u0442\u043e\u043d\u043e\u0432 \u043e\u0431\u0440\u0430\u0437\u0446\u043e\u0432         samples = np.array([])          # amp = amp_delta = 0.01  # \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u0430\u044f \u0430\u043c\u043b\u0438\u0442\u0443\u0434\u0430 \u0438 \u0448\u0430\u0433 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0430\u043c\u043f\u043b\u0438\u0442\u0443\u0434\u044b         # amp_max = 0.1           # \u043a\u043e\u043d\u0435\u0447\u043d\u0430\u044f \u0430\u043c\u043f\u043b\u0438\u0442\u0443\u0434\u0430         vol_min = -90           # \u0434\u0411, \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u044b\u0439 \u0443\u0440\u043e\u0432\u0435\u043d\u044c \u0433\u0440\u043e\u043c\u043a\u043e\u0441\u0442\u0438         vol_max = 0             # \u0434\u0411, \u043a\u043e\u043d\u0435\u0447\u043d\u044b\u0439 \u0443\u0440\u043e\u0432\u0435\u043d\u044c \u0433\u0440\u043e\u043c\u043a\u043e\u0441\u0442\u0438         vol_delta = 1           # \u0434\u0411, \u0448\u0430\u0433         t = 0                   # \u0441\u0435\u043a, \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u0432\u0440\u0435\u043c\u0435\u043d\u0438          s_time, s_scale, s_dB, s_amp = line_aka(t, freq, None)          for vol_dB in range(vol_min, vol_max + vol_delta, vol_delta):             time_points_array = np.linspace(t, t + duration, sampleCount)              samples_new = np.sin(2 * np.pi * freq * time_points_array)             samples_new *= db_to_amplitude(vol_dB)             samples = np.append(samples, samples_new)              t += duration             s_time, s_scale, s_dB, s_amp = line_aka(t, freq, vol_dB, s_time, s_scale, s_dB, s_amp)          # \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u0447\u0430\u0441\u0442\u043e\u0442\u043d\u043e\u0433\u043e \u043e\u0431\u0440\u0430\u0437\u0446\u0430 \u0432 \u0444\u0430\u0439\u043b         wavfile.write(f\".\/wav_files\/sine_{freq}.wav\", sampleRate, samples)         print(f\"{freq: &gt;4} Hz wav file done!\")      s = f\"{s_time}     MAX\\n{s_scale}\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\\n{s_dB}    volume\\n{s_amp} amplitude\"     # print(s)      with open(f\".\/wav_files\/sine_hearing_levels_scale.txt\", 'w', encoding='utf-8') as file_handle:         file_handle.write(s) <\/code><\/pre>\n<pre><code> 125 Hz wav file done!  250 Hz wav file done!  500 Hz wav file done! 1000 Hz wav file done! 2000 Hz wav file done! 4000 Hz wav file done! 6000 Hz wav file done! <\/code><\/pre>\n<p>\u0410\u0443\u0434\u0438\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u0433\u043e\u0442\u043e\u0432\u044b. \u0412\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u043c \u0434\u0430\u043d\u043d\u044b\u0435 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <code>matplotlib<\/code> \u0438 <code>numpy<\/code>.<\/p>\n<h3>image_builder.py<\/h3>\n<pre><code class=\"python\"># https:\/\/blog.demofox.org\/2015\/04\/14\/decibels-db-and-amplitude\/ #   0 \u0434\u0411 \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 \u043f\u043e\u043b\u043d\u044b\u0439 \u0443\u0440\u043e\u0432\u0435\u043d\u044c \u0441\u0438\u0433\u043d\u0430\u043b\u0430: \u0430\u043c\u043f\u043b\u0438\u0442\u0443\u0434\u0430 == 1.0, \u0442.\u0435. 100% \u0433\u0440\u043e\u043c\u043a\u043e\u0441\u0442\u044c #   \u043a\u0430\u0436\u0434\u044b\u0435 6 \u0434\u0411 \u0441\u0438\u0433\u043d\u0430\u043b \u0438\u0437\u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f \u0432 ~2 \u0440\u0430\u0437\u0430 #       +n \u0434\u0411 - \u0443\u0432\u0435\u043b\u0438\u0447\u0435\u043d\u0438\u0435 \u0433\u0440\u043e\u043c\u043a\u043e\u0441\u0442\u0438 #       -n \u0434\u042c - \u0443\u043c\u0435\u043d\u044c\u0448\u0435\u043d\u0438\u0435 \u0433\u0440\u043e\u043c\u043a\u043e\u0441\u0442\u0438  import matplotlib.pyplot as plt from matplotlib.ticker import EngFormatter, FuncFormatter, PercentFormatter import numpy as np import matplotlib as mpl from mpl_toolkits.axes_grid1 import make_axes_locatable   def db_to_amplitude(level_db):  # \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0434\u0411 \u0432 \u0430\u043c\u043b\u0438\u0442\u0443\u0434\u0443     return np.power(10.0, level_db \/ 20.0)   def amplitude_to_db(amplitude):  # \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0430\u043c\u043b\u0438\u0442\u0443\u0442\u044b \u0432 \u0434\u0411     return 20 * np.log10(amplitude)   audiograms = {  # decibel-frequency audiograms     1: np.array([  # An_         [125, -48.0],         [250, -42.0],         [500, -52.0],         [1000, -36.0],         [2000, -23.0],         [4000, -29.0],         [6000, -19.0],     ]),     2: np.array([  # Mi_         [125, -76.0],         [250, -68.0],         [500, -72.0],         [1000, -73.0],         [2000, -77.0],         [4000, -83.0],         [6000, -78.0],     ])}  for k, a in audiograms.items():     min_y, max_y = a[:, 1].min() * 1.1, 0     img_width, img_height = 16, 9      fig, ax = plt.subplots(1, 1, figsize=(img_width, img_height))     plt.xticks(rotation='vertical')     fig.suptitle(f\"\u0410\u0443\u0434\u0438\u043e\u0433\u0440\u0430\u043c\u043c\u0430 {k} \u0441\u043e\u0442\u0440\u0443\u0434\u043d\u0438\u043a\u0430 Cloud4y\")  # , fontsize=14)     fig.patch.set_facecolor('white')      ax.plot(a[:, 0], a[:, 1], '-o')     ax.set_xscale('log')      ax.set_xlabel(r'\u0427\u0430\u0441\u0442\u043e\u0442\u0430 \u0441\u0438\u0433\u043d\u0430\u043b\u0430')     ax.set_ylabel(r'\u043b\u0443\u0447\u0448\u0435   &lt;&lt;&lt;   \u0423\u0440\u043e\u0432\u0435\u043d\u044c \u0441\u043b\u0443\u0445\u0430 (\u0441\u043b\u044b\u0448\u0438\u043c\u043e\u0441\u0442\u044c \u0441\u0438\u0433\u043d\u0430\u043b\u0430)   &gt;&gt;&gt;   \u0445\u0443\u0436\u0435')     ax.set_ylim(min_y, max_y)     ax.xaxis.set_major_formatter(EngFormatter(unit='\u0413\u0446'))     ax.yaxis.set_major_formatter(EngFormatter(unit='\u0434\u0411'))     ax.xaxis.set_ticks(a[:, 0])     ax.yaxis.set_major_locator(plt.MultipleLocator(10))     ax.yaxis.set_minor_locator(plt.MultipleLocator(2))     ax.grid(axis='y')      # \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0435 \u043e\u0441\u0438 - \u0441\u043f\u043e\u0441\u043e\u0431 1     y2 = ax.secondary_yaxis('right', functions=(db_to_amplitude, amplitude_to_db))     y2.set_yscale('log')     y2.set_ylabel(r'\u0410\u043c\u043f\u043b\u0438\u0442\u0443\u0434\u0430 \u0441\u0438\u0433\u043d\u0430\u043b\u0430')     y2.yaxis.set_major_formatter(FuncFormatter(lambda x, pos: f\"{x: .3f}\"))      y3 = ax.secondary_yaxis(1.1, functions=(db_to_amplitude, amplitude_to_db))     y3.set_yscale('log')     y3.set_ylabel(r'\u0413\u0440\u043e\u043c\u043a\u043e\u0441\u0442\u044c \u0441\u0438\u0433\u043d\u0430\u043b\u0430')     # y3.yaxis.set_major_formatter(FuncFormatter(lambda x, pos: f\"{x * 100:5.1f} %\"))     y3.yaxis.set_major_formatter(PercentFormatter(xmax=1, decimals=1, symbol=' %', is_latex=False))      # # \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0435 \u043e\u0441\u0438 - \u0441\u043f\u043e\u0441\u043e\u0431 2 - \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043d\u0430\u043b\u043e\u0436\u0435\u043d\u0438\u0435 2\u0433\u043e \u0433\u0440\u0430\u0444\u0438\u043a\u0430 \u043d\u0430 1\u0439 \u0432\u043c\u0435\u0441\u0442\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f Y-\u043e\u0441\u0438     # #     \u0447\u0442\u043e\u0431\u044b \u0433\u0440\u0430\u0444\u0438\u043a\u0438 \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u043b\u0438, \u043d\u0443\u0436\u043d\u043e \u043f\u043e\u0434\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u043f\u0440\u0435\u0434\u0435\u043b\u044b     # ax2 = ax.twinx()     # ax2.set_yscale('log')     # ax2.plot(df[:, 0], db_to_amplitude(df[:, 1]), 'y:x')     # ax2.set_ylabel(r'Signal Amplitude')     # ax2.set_ylim(db_to_amplitude(min_y), db_to_amplitude(max_y))     # ax2.yaxis.set_major_formatter(FuncFormatter(lambda x, pos: f\"{x:.3f}\"))     # ax2.xaxis.set_ticks(df[:, 0])      ax.axhline(y=a[:, 1].max() + 1, linestyle=\"-\", color='C2')   # demo_1_audible_normally     ax.axhline(y=np.median(a[:, 1]), linestyle=\"-\", color='C1')  # demo_2_audible_partially     ax.axhline(y=a[:, 1].min() - 1, linestyle=\"-\", color='C3')   # demo_3_not_audible      labels = [         \"HL-\u0410\u0443\u0434\u0438\u043e\u0433\u0440\u0430\u043c\u043c\u0430 (Hearing Level)\",         f\"demo_1: {a[:, 1].max() + 1: .0f} \u0434\u0411 \u2261 {db_to_amplitude(a[:, 1].max() + 1): .5f}, \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u043d\u0435 \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f\",         f\"demo_2: {np.median(a[:, 1]): .0f} \u0434\u0411 \u2261 {db_to_amplitude(np.median(a[:, 1])): .5f}, \u0434\u043b\u044f \u0447\u0430\u0441\u0442\u0438\u0447\u043d\u043e\u0439 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u043a\u0438\",         f\"demo_3: {a[:, 1].min() - 1: .0f} \u0434\u0411 \u2261 {db_to_amplitude(a[:, 1].min() - 1): .5f}, \u0434\u043b\u044f \u043f\u043e\u043b\u043d\u043e\u0439 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u043a\u0438 \u043f\u043e \u0430\u0443\u0434\u0438\u043e\u0433\u0440\u0430\u043c\u043c\u0435\",     ]     plt.legend(labels=labels)      divider = make_axes_locatable(ax)     cax = divider.append_axes(\"left\", size=\"0.7%\", pad=-.09)     cax.set_ylim(min_y, max_y)     norm = mpl.colors.Normalize(vmin=min_y, vmax=max_y)     cmap = mpl.cm.ScalarMappable(norm=norm, cmap='RdYlGn_r', )     fig.colorbar(cmap, cax=cax)     cax.yaxis.set_major_locator(plt.MultipleLocator(10))     cax.yaxis.set_minor_locator(plt.MultipleLocator(2))     cax.set_yticklabels([])      fig.tight_layout()     plt.show() <\/code><\/pre>\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<p>\u041d\u0430 \u043a\u0430\u0436\u0434\u043e\u0439 \u0430\u0443\u0434\u0438\u043e\u0433\u0440\u0430\u043c\u043c\u0435 \u043e\u0442\u043c\u0435\u0447\u0435\u043d\u044b \u0442\u0440\u0438 \u0443\u0440\u043e\u0432\u043d\u044f \u0433\u0440\u043e\u043c\u043a\u043e\u0441\u0442\u0438, &#8216;\u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e \u0441\u043b\u044b\u0448\u043d\u043e&#8217;, &#8216;\u0447\u0430\u0441\u0442\u0438\u0447\u043d\u043e \u0441\u043b\u044b\u0448\u043d\u043e&#8217;, &#8216;\u0441\u043e\u0432\u0441\u0435\u043c \u043d\u0435 \u0441\u043b\u044b\u0448\u043d\u043e&#8217;, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043c\u044b \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u043c \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <code>gen_continuous_sample.py<\/code> \u0434\u0435\u043c\u043a\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0437\u0430\u0442\u0435\u043c \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u0435\u043c \u0438\u0445 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u043e\u043c, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043d\u044f\u0442\u044c, \u043d\u0430\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0445\u043e\u0440\u043e\u0448\u043e \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u0442 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430.<\/p>\n<h3>gen_continuous_sample.py<\/h3>\n<p>\u0413\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u043e\u0431\u0440\u0430\u0437\u0446\u043e\u0432 \u0441 \u0442\u0440\u0435\u043c\u044f \u0440\u0430\u0437\u043d\u044b\u043c\u0438 \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u044b\u043c\u0438 \u0443\u0440\u043e\u0432\u043d\u044f\u043c\u0438 \u0433\u0440\u043e\u043c\u043a\u043e\u0441\u0442\u0438, \u0447\u0430\u0441\u0442\u043e\u0442\u0430 \u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f \u043e\u0442 <code>freq_start<\/code> \u0434\u043e <code>freq_end<\/code> \u0441\u043e \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c\u044e <code>freq_inc\/time_inc<\/code> \u0413\u0446\/\u0441\u0435\u043a.<\/p>\n<pre><code class=\"python\">from scipy.io import wavfile import numpy as np   def db_to_amplitude(level_db):  #<\/code><\/pre>\n<\/div>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-326352","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/326352","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=326352"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/326352\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=326352"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=326352"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=326352"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}