{"id":350767,"date":"2023-07-25T21:01:10","date_gmt":"2023-07-25T21:01:10","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=350767"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=350767","title":{"rendered":"<span>\u041a\u0430\u043a \u043f\u043e\u0434\u0440\u0443\u0436\u0438\u0442\u044c Asterisk \u0441 \u043f\u043e\u0442\u043e\u043a\u043e\u0432\u044b\u043c \u0440\u0430\u0441\u043f\u043e\u0437\u043d\u0430\u0432\u0430\u043d\u0438\u0435\u043c \u043e\u0442 \u042f\u043d\u0434\u0435\u043a\u0441 SpeechKit \u0447\u0435\u0440\u0435\u0437 EAGI \u0438 Python<\/span>"},"content":{"rendered":"<div><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-1\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\u0414\u043e \u044d\u0442\u043e\u0433\u043e \u0441\u0430\u043c\u043e\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438, \u044f \u043d\u0438\u043a\u043e\u0433\u0434\u0430 \u043d\u0435 \u043f\u0438\u0441\u0430\u043b \u043a\u043e\u0434 \u043d\u0430 Pyhton \u0438 Node JS. \u0418 \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043c\u043d\u0435 \u0431\u044b\u043b\u043e \u043e\u0447\u0435\u043d\u044c \u0441\u043b\u043e\u0436\u043d\u043e \u0441\u043a\u0440\u0435\u0441\u0442\u0438\u0442\u044c \u044d\u0442\u0438 \u0441\u0438\u0441\u0442\u0435\u043c\u044b. \u0418 \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0440\u0435\u0448\u0438\u043b \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u043e\u0431 \u044d\u0442\u043e\u043c \u043f\u043e\u0441\u0442, \u0442\u0430\u043a \u043a\u0430\u043a \u0433\u043e\u0442\u043e\u0432\u044b\u0445 \u043f\u0440\u0438\u043c\u0435\u0440\u043e\u0432 \u0432 \u042f\u043d\u0434\u0435\u043a\u0441\u0435 \u043d\u0435\u0442 \u0437\u0430 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435\u043c MRCP \u043f\u0440\u043e \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0431\u044b\u043b\u043e \u043d\u0435\u043c\u0430\u043b\u043e \u043d\u0435\u043b\u0435\u0441\u0442\u043d\u044b\u0445 \u043e\u0442\u0437\u044b\u0432\u043e\u0432 \u043e\u0442 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 \u044d\u0442\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b, \u043d\u043e \u043f\u0440\u0443\u0444\u044b \u0432 \u0434\u0430\u043d\u043d\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u043d\u0435 \u043c\u043e\u0433\u0443. \u042f \u0440\u0435\u0448\u0438\u043b \u043d\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u044d\u0442\u0438\u043c \u043a\u043e\u0441\u0442\u044b\u043b\u0435\u043c \u0438 \u0438\u0437\u043e\u0431\u0440\u0435\u0441\u0442\u0438 \u0432\u0435\u043b\u043e\u0441\u0438\u043f\u0435\u0434 \u043d\u0430 \u043a\u043e\u0441\u0442\u044b\u043b\u044f\u0445 \u0441\u0430\u043c. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043c\u043d\u0435 \u0432 \u043f\u043e\u043c\u043e\u0449\u044c \u043f\u0440\u043e\u0441\u043b\u0443\u0436\u0438\u043b\u0430 \u0441\u0430\u043c\u0430 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f \u0441 \u042f\u043d\u0434\u0435\u043a\u0441\u0430 \u0438 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u0440\u0438\u043c\u0435\u0440\u044b \u0441 StackOverflow. <br \/>  <a name=\"habracut\"><\/a><br \/>  \u041a\u043e\u0434 \u0440\u0430\u0441\u043f\u043e\u0437\u043d\u0430\u0435\u0442 \u0438 \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u0435\u0442 \u0447\u0442\u043e \u0432\u044b \u0433\u043e\u0432\u043e\u0440\u0438\u043b\u0438 \u043d\u0430 \u0440\u0443\u0441\u0441\u043a\u043e\u043c \u043d\u0435\u043a\u0438\u0439 \u044d\u0445\u043e. <\/p>\n<p>  \u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u0447\u0438\u0442\u0430\u0435\u043c \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442 \u042f\u043d\u0434\u0435\u043a\u0441\u0430 \u043e \u043f\u043e\u0442\u043e\u043a\u043e\u0432\u043e\u043c \u0440\u0430\u0441\u043f\u043e\u0437\u043d\u0430\u0432\u0430\u043d\u0438\u0438 \u0441\u043b\u0435\u0434\u0443\u0435\u043c \u0432\u0441\u0435 \u0447\u0435\u0442\u043a\u043e \u043f\u043e \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u043c \u044f\u0437\u044b\u043a Python, \u0442\u0430\u043a \u043a\u0430\u043a \u0441 Node JS \u0443 \u043c\u0435\u043d\u044f \u043d\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c \u0447\u0438\u0442\u0430\u0442\u044c \u043f\u043e\u0442\u043e\u043a \u0438\u0437 Asteriska EAGI file descrition 3, \u0430 \u0442\u0430\u043a \u0432 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0435 \u043c\u043e\u0436\u0435\u0442\u0435 \u0441\u0430\u043c\u0438 \u043f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u0442\u044c \u0438, \u0435\u0441\u043b\u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0441\u044f \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u043e\u0431 \u044d\u0442\u043e\u043c \u0441\u0442\u0430\u0442\u044c\u044e \u0432 \u0445\u0430\u0431\u0440\u0435 \u0438 \u0434\u0430\u0442\u044c \u043c\u043d\u0435 \u043d\u0430 \u043d\u0435\u0433\u043e \u0441\u0441\u044b\u043b\u043a\u0443. <\/p>\n<p>  \u0414\u0430\u043b\u0435\u0435 \u043f\u0438\u0448\u0435\u043c \u044d\u043a\u0441\u0442\u0435\u043d\u0448. \u0417\u0434\u0435\u0441\u044c \u0432\u0441\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u0441 \u0442\u0435\u043b\u0435\u0444\u043e\u043d\u0430 \u0437\u0432\u043e\u043d\u0438\u043c 444 \u0438 \u043f\u043e \u0438\u0434\u0435\u0435 \u043c\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u0441\u043b\u044b\u0448\u0430\u0442\u044c \u0442\u043e, \u0447\u0442\u043e \u0433\u043e\u0432\u043e\u0440\u0438\u043b\u0438, \u043d\u043e \u043d\u0435 \u0441\u0435\u0439\u0447\u0430\u0441 \u044d\u0442\u043e \u0432 \u043a\u043e\u043d\u0446\u0435 \u0435\u0441\u043b\u0438 \u0443 \u0432\u0430\u0441 \u0432\u0441\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0441\u044f.<\/p>\n<pre><code class=\"plaintext\">;;YANDEX SPEACH exten = 444,1,Answer exten = 444,n,EAGI(test.py) exten = 444,n,Hangup <\/code><\/pre>\n<p>  \u0417\u0430\u0442\u0435\u043c \u043c\u0435\u043d\u044f\u0435\u043c \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043f\u0430\u043f\u043a\u0438 AGI, \u0432 \u0444\u0430\u0439\u043b\u0435 \/etc\/asterisk\/asterisk.conf<\/p>\n<p>  \u041d\u0430 \u0442\u0443 \u043f\u0430\u043f\u043a\u0443, \u0433\u0434\u0435 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d \u0443 \u043d\u0430\u0441 \u042f\u043d\u0434\u0435\u043a\u0441 cloudapi\/output (\u0438\u0437 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 \u044f\u043d\u0434\u0435\u043a\u0441\u0430). \u0418\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0432 \u044d\u0442\u043e\u043c \u0444\u0430\u0439\u043b\u0435 \u043d\u0430\u0447\u0438\u043d\u0430\u044e\u0442 \u0434\u0435\u0439\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c, \u043a\u0430\u043a \u044f \u0437\u0430\u043c\u0435\u0442\u0438\u043b, \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0441\u043b\u0435 \u043f\u0435\u0440\u0435\u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 Asterisk, \u0447\u0435\u0440\u0435\u0437 \u0441\u043b\u0443\u0436\u0431\u044b \u0438\u043b\u0438 kill.<\/p>\n<p>  \u0412\u043d\u0438\u043c\u0430\u043d\u0438\u0435, \u0431\u044b\u043b \u043f\u043e\u0434\u0432\u043e\u0445 \u0441\u043e \u0437\u043d\u0430\u043a\u043e\u043c! \u0435\u0433\u043e \u043d\u0430\u0434\u043e \u0431\u044b\u043b\u043e \u0443\u0434\u0430\u043b\u0438\u0442\u044c. <\/p>\n<p>  \u0414\u0430\u043b\u0435\u0435 \u0441\u0430\u043c \u043a\u043e\u0434, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043b\u0435\u0436\u0438\u0442 \u0432 \u043f\u0430\u043f\u043a\u0435 cloudapi output test.py<\/p>\n<pre><code class=\"python\">#!\/usr\/bin\/python3.6 #coding=utf8 import argparse from asterisk.agi import *  import requests import grpc import os import yandex.cloud.ai.stt.v2.stt_service_pb2 as stt_service_pb2 import yandex.cloud.ai.stt.v2.stt_service_pb2_grpc as stt_service_pb2_grpc agi = AGI() CHUNK_SIZE = 4000 folder = \"\u0431\u0435\u0440\u0435\u0442\u0435 \u0432 \u044f\u043d\u0434\u0435\u043a\u0441\u0435\" token = \"\u0431\u0435\u0440\u0435\u0442\u0435 \u0432 \u044f\u043d\u0434\u0435\u043a\u0441\u0435\" text = \"\"   def gen(folder_id):     # \u0417\u0430\u0434\u0430\u0442\u044c \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0440\u0430\u0441\u043f\u043e\u0437\u043d\u0430\u0432\u0430\u043d\u0438\u044f.     specification = stt_service_pb2.RecognitionSpec(         language_code='ru-RU',         profanity_filter=True,         model='general',         partial_results=True,         audio_encoding='LINEAR16_PCM',         sample_rate_hertz=8000     )      streaming_config = stt_service_pb2.RecognitionConfig(specification=specification, folder_id=folder_id)      # \u041e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u0441 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430\u043c\u0438 \u0440\u0430\u0441\u043f\u043e\u0437\u043d\u0430\u0432\u0430\u043d\u0438\u044f.     yield stt_service_pb2.StreamingRecognitionRequest(config=streaming_config)      # \u041f\u0440\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u0430\u0443\u0434\u0438\u043e\u0444\u0430\u0439\u043b \u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u0435\u0433\u043e \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u043f\u043e\u0440\u0446\u0438\u044f\u043c\u0438.     with os.fdopen(3, 'rb') as f:         data = f.read(CHUNK_SIZE)         while data != b'':             yield stt_service_pb2.StreamingRecognitionRequest(audio_content=data)             data = f.read(CHUNK_SIZE)   def run(folder_id, iam_token):     # \u0423\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 \u0441 \u0441\u0435\u0440\u0432\u0435\u0440\u043e\u043c.     cred = grpc.ssl_channel_credentials()     channel = grpc.secure_channel('stt.api.cloud.yandex.net:443', cred)     stub = stt_service_pb2_grpc.SttServiceStub(channel)      # \u041e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u0434\u043b\u044f \u0440\u0430\u0441\u043f\u043e\u0437\u043d\u0430\u0432\u0430\u043d\u0438\u044f.     it = stub.StreamingRecognize(gen(folder_id), metadata=(('authorization', 'Bearer %s' % iam_token),))      # \u041e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043e\u0442\u0432\u0435\u0442\u044b \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u0438 \u0432\u044b\u0432\u0435\u0441\u0442\u0438 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0432 \u043a\u043e\u043d\u0441\u043e\u043b\u044c.     try:         cont = True         while cont:                 agi.verbose('START START START')                 for r in it:                     try:                         agi.verbose('Start chunk: ')                         for alternative in r.chunks[0].alternatives:                             agi.verbose(alternative.text)                             if(alternative.text == \"\u043f\u0440\u0438\u0432\u0435\u0442\"):                                 cont = true                                 break                         if r.chunks[0].final:                             agi.verbose(\"FINAL\")                             with open(\"\/var\/lib\/asterisk\/agi-bin\/cloudapi\/output\/echo123.raw\", \"wb\") as f:                                 for audio_content in synthesize(alternative.text):                                     f.write(audio_content)                             agi.stream_file(\"\/var\/lib\/asterisk\/agi-bin\/cloudapi\/output\/echo123\")                     except LookupError:                         agi.verbose('Not available chunks')     except grpc._channel._Rendezvous as err:         agi.verbose('Error code %s, message: %s' % (err._state.code, err._state.details))   def synthesize(text):     url = 'https:\/\/tts.api.cloud.yandex.net\/speech\/v1\/tts:synthesize'     headers = {         'Authorization': 'Bearer '+token     }      data = {         'text': text,         'lang': 'ru-RU',         'folderId': folder,         'sampleRateHertz': '8000',         'format': 'lpcm'     }      with requests.post(url, headers=headers, data=data, stream=True) as resp:         if resp.status_code != 200:             raise RuntimeError(\"Invalid response received: code: %d, message: %s\" % (resp.status_code, resp.text))          for chunk in resp.iter_content(chunk_size=None):             yield chunk    if __name__ == '__main__':     run(folder,token)  <\/code><\/pre>\n<p>  \u0423 \u043c\u0435\u043d\u044f \u043d\u0435\u0442 \u0436\u0435\u043b\u0430\u043d\u0438\u044f \u043f\u0438\u0441\u0430\u0442\u044c, \u043a\u0430\u043a \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0442\u044c \u043f\u0438\u0442\u043e\u043d \u0438 \u0435\u0433\u043e \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u0432\u0441\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u0447\u0435\u0440\u0435\u0437 pip install. \u0422\u0430\u043a \u043a\u0430\u043a \u044d\u0442\u0430 \u0441\u0442\u0430\u0442\u044c\u044f \u043d\u0435 \u0434\u043b\u044f \u0441\u0430\u043c\u044b\u0445 \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u0438\u0445. \u041a\u0441\u0442\u0430\u0442\u0438, Asterisk \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u044f\u0435\u043c\u044b\u0439 \u0432 Ubuntu \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f\u0445, \u043d\u043e \u044f \u043d\u0435 \u0441\u043c\u043e\u0433 \u0438\u0437 \u043d\u0435\u0433\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043f\u043e\u0442\u043e\u043a \u0437\u0432\u0443\u043a\u0430, \u0447\u0435\u0440\u0435\u0437 EAGI. \u041f\u043e\u043b\u0443\u0447\u0438\u043b \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0441\u043b\u0435 \u0441\u043e\u0431\u0438\u0440\u0430\u043d\u0438\u044f Asterisk \u0438\u0437 \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u043e\u0432 \u0441 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0439 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u043e\u0439 menuconfig \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435\u043c eagi \u043f\u043e\u0442\u043e\u043a\u043e\u0432<\/div>\n<\/div>\n<\/div>\n<p> <!----> <!----><\/div>\n<p> <!----> <!----><br \/> \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\/750306\/\"> https:\/\/habr.com\/ru\/articles\/750306\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-1\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\u0414\u043e \u044d\u0442\u043e\u0433\u043e \u0441\u0430\u043c\u043e\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438, \u044f \u043d\u0438\u043a\u043e\u0433\u0434\u0430 \u043d\u0435 \u043f\u0438\u0441\u0430\u043b \u043a\u043e\u0434 \u043d\u0430 Pyhton \u0438 Node JS. \u0418 \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043c\u043d\u0435 \u0431\u044b\u043b\u043e \u043e\u0447\u0435\u043d\u044c \u0441\u043b\u043e\u0436\u043d\u043e \u0441\u043a\u0440\u0435\u0441\u0442\u0438\u0442\u044c \u044d\u0442\u0438 \u0441\u0438\u0441\u0442\u0435\u043c\u044b. \u0418 \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0440\u0435\u0448\u0438\u043b \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u043e\u0431 \u044d\u0442\u043e\u043c \u043f\u043e\u0441\u0442, \u0442\u0430\u043a \u043a\u0430\u043a \u0433\u043e\u0442\u043e\u0432\u044b\u0445 \u043f\u0440\u0438\u043c\u0435\u0440\u043e\u0432 \u0432 \u042f\u043d\u0434\u0435\u043a\u0441\u0435 \u043d\u0435\u0442 \u0437\u0430 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435\u043c MRCP \u043f\u0440\u043e \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0431\u044b\u043b\u043e \u043d\u0435\u043c\u0430\u043b\u043e \u043d\u0435\u043b\u0435\u0441\u0442\u043d\u044b\u0445 \u043e\u0442\u0437\u044b\u0432\u043e\u0432 \u043e\u0442 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 \u044d\u0442\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b, \u043d\u043e \u043f\u0440\u0443\u0444\u044b \u0432 \u0434\u0430\u043d\u043d\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u043d\u0435 \u043c\u043e\u0433\u0443. \u042f \u0440\u0435\u0448\u0438\u043b \u043d\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u044d\u0442\u0438\u043c \u043a\u043e\u0441\u0442\u044b\u043b\u0435\u043c \u0438 \u0438\u0437\u043e\u0431\u0440\u0435\u0441\u0442\u0438 \u0432\u0435\u043b\u043e\u0441\u0438\u043f\u0435\u0434 \u043d\u0430 \u043a\u043e\u0441\u0442\u044b\u043b\u044f\u0445 \u0441\u0430\u043c. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043c\u043d\u0435 \u0432 \u043f\u043e\u043c\u043e\u0449\u044c \u043f\u0440\u043e\u0441\u043b\u0443\u0436\u0438\u043b\u0430 \u0441\u0430\u043c\u0430 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f \u0441 \u042f\u043d\u0434\u0435\u043a\u0441\u0430 \u0438 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u0440\u0438\u043c\u0435\u0440\u044b \u0441 StackOverflow.   <\/p>\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-350767","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/350767","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=350767"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/350767\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=350767"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=350767"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=350767"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}