{"id":511,"date":"2020-05-05T21:55:36","date_gmt":"2020-05-05T13:55:36","guid":{"rendered":"https:\/\/www.iotch.xyz\/?p=511"},"modified":"2020-05-05T21:55:36","modified_gmt":"2020-05-05T13:55:36","slug":"%e4%bd%bf%e7%94%a8%e6%a0%91%e8%8e%93%e6%b4%be%e5%81%9a%e4%b8%80%e4%b8%aa%e6%99%ba%e8%83%bd%e9%9f%b3%e7%ae%b1","status":"publish","type":"post","link":"https:\/\/www.iotch.xyz\/?p=511","title":{"rendered":"\u4f7f\u7528\u6811\u8393\u6d3e\u505a\u4e00\u4e2a\u667a\u80fd\u97f3\u7bb1"},"content":{"rendered":"\n<h3 class=\"wp-block-heading\">\u529f\u80fd<\/h3>\n\n\n\n<p>\u76d1\u63a7\u58f0\u97f3\u3001\u8bc6\u522b\u8bed\u97f3\u3001\u8bed\u97f3\u5408\u6210\u3001\u97f3\u4e50\u64ad\u653e\u3001\u804a\u5929\u3001\u7269\u8054\u5f00\u5173<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\u9700\u8981\u5b89\u88c5\u7684\u5e93<\/h3>\n\n\n\n<p>Pyaudio + baidu-aip + MPG321<\/p>\n\n\n\n<p>\u4f8b\u5982\u6267\u884c<code>pip install baidu-aip<\/code>\u5373\u53ef<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\u8bbe\u5907<\/h3>\n\n\n\n<p>\u8bbe\u5907\u81ea\u884c\u6362\u5427\uff0c\u6211\u6ca1\u6709\u8bbe\u5907\u6240\u4ee5\u968f\u4fbf\u627e\u4e86\u6444\u50cf\u5934\u4e0a\u7684\u9ea6\u514b\u98ce\u548c\u8033\u673a<\/p>\n\n\n\n<p>\u9ea6\u514b\u98ce\uff1a\u6444\u50cf\u5934Playstation3 EYE \uff08\u542b\u9ea6\u514b\u98ce\u9635\u5217\uff09\uff0c\u53ea\u8981\u63d2\u5728USB\u53e3\u4e0a<\/p>\n\n\n\n<p>\u5916\u653e\u8bbe\u5907\uff1a\u666e\u901a\u8033\u673a\uff0c\u53ea\u8981\u63d2\u57283.5mm\u53e3\u4e0a<\/p>\n\n\n\n<h5 class=\"wp-block-heading\">\u8bed\u97f3\u5524\u9192<\/h5>\n\n\n\n<p>\u7f51\u4e0a\u7684\u6848\u4f8b\u57fa\u672c\u90fd\u662f\u9700\u8981\u642d\u914d\u6309\u94ae\u624d\u80fd\u76d1\u63a7\uff0c\u4e0d\u591f\u667a\u80fd\uff0c\u6240\u4ee5\u8fd9\u91cc\u5b9e\u73b0\u4e86\u8fbe\u5230\u4e00\u5b9a\u5206\u8d1d\u624d\u8bc6\u522b\u3002<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/i.loli.net\/2019\/07\/02\/5d1b136bf2e6396788.png\" alt=\"\u76d1\u63a7\u58f0\u97f3\" title=\"\u76d1\u63a7\u58f0\u97f3\"\/><\/figure>\n\n\n\n<h5 class=\"wp-block-heading\">\u8bed\u97f3\u529f\u80fd<\/h5>\n\n\n\n<p>\u4f7f\u7528ai.baidu.com\u63d0\u4f9b\u7684\u8bed\u97f3\u8bc6\u522b\u548c\u8bed\u97f3\u5408\u6210<\/p>\n\n\n\n<p>Python SDK\uff1a<a href=\"https:\/\/ai.baidu.com\/docs#\/ASR-Online-Python-SDK\/top\" target=\"_blank\"  rel=\"nofollow\" >\u8bed\u97f3\u8bc6\u522b\u6587\u6863<\/a>\u3001<a href=\"https:\/\/ai.baidu.com\/docs#\/TTS-Online-Python-SDK\/top\" target=\"_blank\"  rel=\"nofollow\" >\u8bed\u97f3\u5408\u6210\u6587\u6863<\/a><\/p>\n\n\n\n<h6 class=\"wp-block-heading\">\u8bed\u97f3\u8bc6\u522b<\/h6>\n\n\n\n<p>\u4e3e\u4f8b\uff0c\u8981\u5bf9\u6bb5\u4fdd\u5b58\u6709\u4e00\u6bb5\u8bed\u97f3\u7684\u8bed\u97f3\u6587\u4ef6\u8fdb\u884c\u8bc6\u522b\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># \u8bfb\u53d6\u6587\u4ef6\ndef get_file_content(filePath):\n    with open(filePath, 'rb') as fp:\n        return fp.read()\n\n# \u8bc6\u522b\u672c\u5730\u6587\u4ef6\nclient.asr(get_file_content('audio.pcm'), 'pcm', 16000, {\n    'dev_pid': 1536,\n})\n<\/code><\/pre>\n\n\n\n<h6 class=\"wp-block-heading\">\u8bed\u97f3\u5408\u6210<\/h6>\n\n\n\n<p>\u5408\u6210\u6587\u672c\u957f\u5ea6\u5fc5\u987b\u5c0f\u4e8e1024\u5b57\u8282\uff0c\u5982\u679c\u672c\u6587\u957f\u5ea6\u8f83\u957f\uff0c\u53ef\u4ee5\u91c7\u7528\u591a\u6b21\u8bf7\u6c42\u7684\u65b9\u5f0f\u3002\u6587\u672c\u957f\u5ea6\u4e0d\u53ef\u8d85\u8fc7\u9650\u5236<\/p>\n\n\n\n<p>\u4e3e\u4f8b\uff0c\u8981\u628a\u4e00\u6bb5\u6587\u5b57\u5408\u6210\u4e3a\u8bed\u97f3\u6587\u4ef6\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>result = client.synthesis('\u4f60\u597d\u767e\u5ea6', 'zh', 1, {\n    'vol': 5,\n})\n\n# \u8bc6\u522b\u6b63\u786e\u8fd4\u56de\u8bed\u97f3\u4e8c\u8fdb\u5236 \u9519\u8bef\u5219\u8fd4\u56dedict \u53c2\u7167\u4e0b\u9762\u9519\u8bef\u7801\nif not isinstance(result, dict):\n    with open('auido.mp3', 'wb') as f:\n        f.write(result)\n<\/code><\/pre>\n\n\n\n<h5 class=\"wp-block-heading\">\u97f3\u4e50\u64ad\u653e<\/h5>\n\n\n\n<p>\u6211\u662f\u5148\u4e0b\u8f7d\u597d\u4e00\u4e9b\u6b4c\u66f2\uff0c\u7136\u540e\u968f\u673a\u64ad\u653e\uff0c\u4f7f\u7528mpg321\u64ad\u653e\u3002<\/p>\n\n\n\n<h5 class=\"wp-block-heading\">\u804a\u5929<\/h5>\n\n\n\n<p>\u667a\u80fd\u673a\u5668\u4ebaAPI\u63a5\u53e3\u8bf4\u660e<br>\u652f\u6301\u529f\u80fd\uff1a\u5929\u6c14\u3001\u7ffb\u8bd1\u3001\u85cf\u5934\u8bd7\u3001\u7b11\u8bdd\u3001\u6b4c\u8bcd\u3001\u8ba1\u7b97\u3001\u57df\u540d\u4fe1\u606f\/\u5907\u6848\/\u6536\u5f55\u67e5\u8be2\u3001IP\u67e5\u8be2\u3001\u624b\u673a\u53f7\u7801\u5f52\u5c5e\u3001\u4eba\u5de5\u667a\u80fd\u804a\u5929\u3002<br>\u63a5\u53e3\u5730\u5740\uff1a<a href=\"http:\/\/api.qingyunke.com\/api.php?key=free&amp;appid=0&amp;msg=\u5173\u952e\u8bcd\" target=\"_blank\"  rel=\"nofollow\" >http:\/\/api.qingyunke.com\/api.php?key=free&amp;appid=0&amp;msg=\u5173\u952e\u8bcd<\/a><br>\u3000\u3000\u3000\u3000\u3000key\u3000\u56fa\u5b9a\u53c2\u6570free<br>\u3000\u3000\u3000\u3000\u3000appid \u8bbe\u7f6e\u4e3a0\uff0c\u8868\u793a\u667a\u80fd\u8bc6\u522b\uff0c\u53ef\u5ffd\u7565\u6b64\u53c2\u6570<br>\u3000\u3000\u3000\u3000\u3000msg\u3000\u5173\u952e\u8bcd\uff0c\u8bf7\u53c2\u8003\u4e0b\u65b9\u53c2\u6570\u793a\u4f8b\uff0c\u8be5\u53c2\u6570\u53ef\u667a\u80fd\u8bc6\u522b\uff0c\u8be5\u503c\u8bf7\u7ecf\u8fc7 urlencode \u5904\u7406\u540e\u518d\u63d0\u4ea4<br>\u8fd4\u56de\u7ed3\u679c\uff1a{\"result\":0,\"content\":\"\u5185\u5bb9\"}<br>\u3000\u3000\u3000\u3000\u3000result\u3000\u72b6\u6001\uff0c0\u8868\u793a\u6b63\u5e38\uff0c\u5176\u5b83\u6570\u5b57\u8868\u793a\u9519\u8bef<br>\u3000\u3000\u3000\u3000\u3000content\u3000\u4fe1\u606f\u5185\u5bb9<\/p>\n\n\n\n<h5 class=\"wp-block-heading\">\u7269\u8054\u5f00\u5173<\/h5>\n\n\n\n<p>\u76ee\u524d\u662f\u63a7\u5236GPIO\u8f93\u51fa\u6765\u5f00\u5173LED\u706f\uff0c\u53ef\u4ee5\u81ea\u884c\u7f16\u5199\u5916\u63a5\u522b\u7684\u4e1c\u897f\u3002<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\u6700\u7ec8\u4ee3\u7801<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>#!\/usr\/bin\/python3\n# -*- coding: utf-8 -*-\nimport pyaudio\nimport wave\nimport numpy as np\nfrom aip import AipSpeech\nimport json\nimport re\nimport RPi.GPIO as GPIO\nimport requests\nfrom urllib import parse\nimport os\nimport random\n\nLED_PIN_NUM = 21  # LED \u7684\u957f\u811a\u63a5\u7684GPIO\n\n\"\"\" \u4f60\u7684 APPID AK SK \"\"\"\nAPP_ID = 'appid'\nAPI_KEY = 'apikey'\nSECRET_KEY = 'secretkey'\n\nclient = AipSpeech(APP_ID, API_KEY, SECRET_KEY)\n\ndef get_file_content(filePath):\n    with open(filePath, 'rb') as fp:\n        return fp.read()\n\ndef asr(filePath):\n    try:\n        msg = client.asr(get_file_content(filePath), 'wav', 16000, {\n            'dev_pid': 1536,\n        })\n        print(msg)\n        if 'result' in msg:\n            return msg&#91;'result']\n        else:\n            return &#91;'']\n    except Exception:\n        return &#91;'']\n    \n\ndef tts(text):\n    print('tts', text)\n    result = client.synthesis(text, 'zh', 1, {\n        'vol': 5,\n        'per': 4\n    })\n    # \u8bc6\u522b\u6b63\u786e\u8fd4\u56de\u8bed\u97f3\u4e8c\u8fdb\u5236 \u9519\u8bef\u5219\u8fd4\u56dedict \u53c2\u7167\u4e0b\u9762\u9519\u8bef\u7801\n    if not isinstance(result, dict):\n        with open('cacheTTS.mp3', 'wb') as f:\n            f.write(result)\n            f.close()\n            os.system('mpg321 cacheTTS.mp3')\n            print('tts ok')\n            #os.system('rm -rf cacheTTS.mp3')\n            return 0\n    print('tts no')\n    return -1\n\ndef Monitor():\n    CHUNK = 512\n    FORMAT = pyaudio.paInt16\n    CHANNELS = 1\n    RATE = 16000\n    RECORD_SECONDS = 5\n    WAVE_OUTPUT_FILENAME = \"cache.wav\"\n    p = pyaudio.PyAudio()\n    stream = p.open(format=FORMAT,\n                    channels=CHANNELS,\n                    rate=RATE,\n                    input=True,\n                    frames_per_buffer=CHUNK)\n    print(\"\u5f00\u59cb\u7f13\u5b58\u5f55\u97f3\")\n    frames = &#91;]\n    flag = False\n    while (True):\n        try:\n            print('begin ')\n            if flag == False:\n                frames.clear()\n            for i in range(0, 50):\n                data = stream.read(CHUNK)\n                frames.append(data)\n            audio_data = np.fromstring(data, dtype=np.short)\n            large_sample_count = np.sum(audio_data > 800)\n            temp = np.max(audio_data)\n            print('max\uff1a', temp, ' sum:', large_sample_count)\n            if temp > 2000 or large_sample_count > 300:\n                print(\"\u68c0\u6d4b\u5230\u4fe1\u53f7\")\n                flag = True\n                continue\n            elif flag:\n                break\n        except Exception:\n            print('err')\n            return &#91;'']\n        \n    stream.stop_stream()\n    stream.close()\n    p.terminate()\n    wf = wave.open(WAVE_OUTPUT_FILENAME, 'wb')\n    wf.setnchannels(CHANNELS)\n    wf.setsampwidth(p.get_sample_size(FORMAT))\n    wf.setframerate(RATE)\n    wf.writeframes(b''.join(frames))\n    wf.close()\n    print('end')\n    asrMsg = asr(WAVE_OUTPUT_FILENAME)\n    return asrMsg\n\ndef checkRe(msgAsr, regex):\n    matchObj = re.match(regex, msgAsr)\n    if matchObj:\n        return True\n    else:\n        return False\n\ndef AI_openled():\n    print('led on')\n    GPIO.output(LED_PIN_NUM, GPIO.HIGH)\n\ndef AI_offled():\n    print('led off')\n    GPIO.output(LED_PIN_NUM, GPIO.LOW)\n\ndef AI_music():\n    print('music')\n    rd = random.randint(0, 5)\n    os.system('mpg321 .\/music\/'+ str(rd) +'.mp3')\n    return 1\n\ndef talk(msg):\n    global request\n    values = {'key': 'free', 'appid': '0', 'msg': msg}\n    data = parse.urlencode(values)\n\n    response = requests.get(\"http:\/\/api.qingyunke.com\/api.php?\" + data)\n    rdata = json.loads(response.text)\n\n    if 'content' in rdata:\n        return rdata&#91;'content'].replace(u'{br}', '\\n').replace('\u63d0\u793a\uff1a\u6309\u5206\u7c7b\u770b\u7b11\u8bdd\u8bf7\u53d1\u9001\u201c\u7b11\u8bdd\u5206\u7c7b\u201d', '')\n    else:\n        return ''\n\nif __name__ == '__main__':\n    GPIO.setmode(GPIO.BCM)\n    GPIO.setup(LED_PIN_NUM, GPIO.OUT)\n    GPIO.output(LED_PIN_NUM, GPIO.LOW)\n    while True:\n        \n        msgAsr = Monitor()\n        print('result', msgAsr)\n\n        if msgAsr&#91;0] != '' :\n            regex_OnpenLED = r'.*\u5f00.*\u706f.*'\n            regex_OnpenLED = r'.*\u8981\u6709\u5149.*'\n            regex_OffLED = r'.*\u5173.*\u706f.*'\n            regex_music = r'.*\u6b4c|(\u97f3\u4e50).*'\n            if(checkRe(msgAsr&#91;0], regex_OnpenLED)):\n                AI_openled()\n            elif(checkRe(msgAsr&#91;0], regex_OnpenLED)):\n                AI_openled()\n            elif(checkRe(msgAsr&#91;0], regex_OffLED)):\n                AI_offled()\n            elif(checkRe(msgAsr&#91;0], regex_music)):\n                AI_music()\n            else:\n                msgTalk = talk(msgAsr&#91;0])\n                if msgTalk != '':\n                    tts(msgTalk)\n\n        \n        client = AipSpeech(APP_ID, API_KEY, SECRET_KEY)\n\n    GPIO.cleanup()<\/code><\/pre>\n\n\n\n<p>\u539f\u6587\u94fe\u63a5\uff1a<a href=\"https:\/\/izoyo.cn\/index.php\/archives\/32\/\" target=\"_blank\" rel=\"noreferrer noopener\" rel=\"nofollow\" >https:\/\/izoyo.cn\/index.php\/archives\/32\/<\/a><\/p>\n<button class=\"simplefavorite-button\" data-postid=\"511\" data-siteid=\"1\" data-groupid=\"1\" data-favoritecount=\"0\" style=\"\">\u6536\u85cf <i class=\"sf-icon-star-empty\"><\/i><\/button>","protected":false},"excerpt":{"rendered":"<p>\u529f\u80fd \u76d1\u63a7\u58f0\u97f3\u3001\u8bc6\u522b\u8bed\u97f3\u3001\u8bed\u97f3\u5408\u6210\u3001\u97f3\u4e50\u64ad\u653e\u3001\u804a\u5929\u3001\u7269\u8054\u5f00\u5173 \u9700\u8981\u5b89\u88c5\u7684\u5e93 Pyaudio + baidu-aip + MPG32 &#8230;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[10],"tags":[],"class_list":["post-511","post","type-post","status-publish","format-standard","hentry","category-10"],"_links":{"self":[{"href":"https:\/\/www.iotch.xyz\/index.php?rest_route=\/wp\/v2\/posts\/511","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.iotch.xyz\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.iotch.xyz\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.iotch.xyz\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.iotch.xyz\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=511"}],"version-history":[{"count":0,"href":"https:\/\/www.iotch.xyz\/index.php?rest_route=\/wp\/v2\/posts\/511\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.iotch.xyz\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=511"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.iotch.xyz\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=511"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.iotch.xyz\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=511"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}