{"id":1714,"date":"2026-01-14T22:33:37","date_gmt":"2026-01-14T14:33:37","guid":{"rendered":"https:\/\/notes.coremix.net\/?p=1714"},"modified":"2026-01-14T22:35:40","modified_gmt":"2026-01-14T14:35:40","slug":"%e8%af%ad%e9%9f%b3%e8%bd%ac%e6%96%87%e5%ad%97%ef%bc%88%e7%94%a8%e4%ba%8eprompt%e6%87%92%e5%be%97%e8%be%93%e5%85%a5%ef%bc%89","status":"publish","type":"post","link":"https:\/\/notes.coremix.net\/?p=1714","title":{"rendered":"\u8bed\u97f3\u8f6c\u6587\u5b57\uff08\u7528\u4e8eprompt\u61d2\u5f97\u8f93\u5165\uff09"},"content":{"rendered":"<p>\u505a\u4e86\u4e2a\u8bed\u97f3\u8f6c\u6587\u5b57\u7684\u811a\u672c\uff0c\u5e95\u5c42\u662f\u6709\u9053\u667a\u4e91\u7684\u77ed\u8bed\u97f3\u8bc6\u522b\uff0c\u4e00\u6b21\u8bc6\u522b\u53ea\u89810.004\u5143\uff0c\u57fa\u672c\u53ef\u4ee5\u7528\u6765\u89e3\u653e\u53cc\u624b\uff0c\u5feb\u901f\u8ddfmini\u6a21\u578b\u786c\u521a\uff08\u4e0d\u8981token\uff09<br \/>\n\u5b9e\u6d4b\u6548\u679c\u4e0d\u9519\uff0c\u63a5\u8fd1100%\u7684\u51c6\u786e\u7387\uff0c\u5f88\u9002\u5408\u591a\u5f00agent\u3002<\/p>\n<p>\u8bc6\u522b\u811a\u672c\uff1a<\/p>\n<pre><pre class=\"brush: python; title: ; notranslate\" title=\"\">\n# -*- coding: utf-8 -*-\n&quot;&quot;&quot;\nRecord from microphone and send WAV to the existing Demo.py recognizer.\n\nUsage:\n  python mic_to_youdao.py --duration 5\n\nDependencies:\n  pip install -r requirements.txt\n&quot;&quot;&quot;\nimport argparse\nimport time\nimport uuid\nimport base64\nimport wave\nimport tempfile\nimport os\nimport json\nimport threading\n\nimport sounddevice as sd\nimport soundfile as sf\n\nimport Demo\n\ndef record_until_enter(path, samplerate=16000, channels=1):\n    &quot;&quot;&quot;Record from the default microphone until the user presses Enter.\n\n    Writes PCM_16 WAV to `path`.\n    &quot;&quot;&quot;\n    print(f&quot;Recording \u2014 samplerate={samplerate}, channels={channels}. Press Enter to stop.&quot;)\n    stop_event = threading.Event()\n\n    with sf.SoundFile(path, mode=&#039;w&#039;, samplerate=samplerate, channels=channels, subtype=&#039;PCM_16&#039;) as file:\n        def callback(indata, frames, time_info, status):\n            if status:\n                print(f&quot;Status: {status}&quot;)\n            file.write(indata.copy())\n\n        with sd.InputStream(samplerate=samplerate, channels=channels, dtype=&#039;int16&#039;, callback=callback):\n            try:\n                input()\n            except KeyboardInterrupt:\n                pass\n    print(f&quot;Saved recording to {path}&quot;)\n\ndef send_wav_to_youdao(wav_path):\n    # Use Demo.connect which expects a WAV file path and returns the response\n    print(&#039;Sending audio to Youdao...&#039;)\n    response = Demo.connect(wav_path)\n    return response\n\ndef extract_text_from_response(j):\n    # Heuristic extractor: prefer &#039;result&#039; lists or common keys, otherwise gather all strings\n    def recurse_collect(x, out):\n        if isinstance(x, str):\n            out.append(x)\n        elif isinstance(x, list):\n            for e in x:\n                recurse_collect(e, out)\n        elif isinstance(x, dict):\n            for v in x.values():\n                recurse_collect(v, out)\n\n    if j is None:\n        return &#039;&#039;\n    if isinstance(j, dict):\n        # common patterns\n        if &#039;result&#039; in j:\n            r = j&#x5B;&#039;result&#039;]\n            if isinstance(r, list):\n                return &#039;&#039;.join(&#x5B;str(x) for x in r])\n            if isinstance(r, str):\n                return r\n        if &#039;data&#039; in j and isinstance(j&#x5B;&#039;data&#039;], dict) and &#039;result&#039; in j&#x5B;&#039;data&#039;]:\n            r = j&#x5B;&#039;data&#039;]&#x5B;&#039;result&#039;]\n            if isinstance(r, list):\n                return &#039;&#039;.join(&#x5B;str(x) for x in r])\n            if isinstance(r, str):\n                return r\n\n    # fallback: collect all strings\n    out = &#x5B;]\n    recurse_collect(j, out)\n    return &#039;&#039;.join(out)\n\ndefault_prompt = &#039;&#039;\ndef main():\n    parser = argparse.ArgumentParser()\n    parser.add_argument(&#039;--samplerate&#039;, type=int, default=16000)\n    parser.add_argument(&#039;--channels&#039;, type=int, default=1)\n    parser.add_argument(&#039;--out&#039;, &#039;-o&#039;, help=&#039;\u8f93\u51fa WAV \u6587\u4ef6\u8def\u5f84\uff08\u53ef\u9009\uff09&#039;)\n    parser.add_argument(&#039;--prompt&#039;, &#039;-p&#039;, type=str, default=default_prompt, help=&#039;\u62fc\u63a5\u5230\u7ed3\u679c\u524d\u7684\u524d\u7f6e\u63d0\u793a\u6587\u672c&#039;)\n    args = parser.parse_args()\n\n    if args.out:\n        out_path = args.out\n    else:\n        fd, out_path = tempfile.mkstemp(suffix=&#039;.wav&#039;)\n        os.close(fd)\n\n    try:\n        print(&#039;\u5f00\u59cb\u5f55\u97f3\uff0c\u6309 Enter \u505c\u6b62\u5f55\u97f3&#039;)\n        record_until_enter(out_path, samplerate=args.samplerate, channels=args.channels)\n        response = send_wav_to_youdao(out_path)\n        # print raw json if possible\n        try:\n            j = response.json()\n            print(&#039;Raw JSON response:&#039;)\n            print(json.dumps(j, ensure_ascii=False, indent=2))\n        except Exception:\n            print(&#039;Raw response content:&#039;)\n            print(response.content)\n            j = None\n\n        concatenated = extract_text_from_response(j)\n        if args.prompt:\n            # show the prompt for clarity\n            print(&#039;Prompt:&#039;)\n            print(args.prompt)\n            if concatenated:\n                combined = args.prompt.rstrip() + &#039; &#039; + concatenated\n            else:\n                combined = args.prompt\n            print(&#039;Concatenated result (with prompt):&#039;)\n            print(combined)\n        else:\n            print(&#039;Concatenated result:&#039;)\n            print(concatenated)\n    finally:\n        if not args.out and os.path.exists(out_path):\n            os.remove(out_path)\n\nif __name__ == &#039;__main__&#039;:\n    main()\n# Response:\n# {&#039;result&#039;: &#x5B;&#039;\u4f60\u597d\u3002\u4f60\u3002&#039;], &#039;requestId&#039;: &#039;18112060-0fed-42c6-abfb-5143a5df810f&#039;, &#039;errorCode&#039;: &#039;0&#039;, &#039;complexResult&#039;: &#x5B;{&#039;sentence&#039;: &#039;\u4f60\u597d\u3002\u4f60\u3002&#039;, &#039;encoutput&#039;: &#039;&#039;, &#039;vad_id&#039;: 1, &#039;word_timestamps&#039;: &#x5B;0, 480, 600],t&#039;: &#039;&#039;, &#039;word_timestamps_eds&#039;: &#x5B;60, 600, 660], &#039;encoutput_shape&#039;: &#039;&#039;, &#039;vcoutput_shape&#039;: &#039;&#039;, &#039;words&#039;: &#x5B;&#039;\u4f60&#039;, &#039;\u597d\u3002&#039;, &#039;\u4f60\u3002&#039;], &#039;partial&#039;: False}]}\n\n<\/pre>\n<p>\u6709\u9053\u539f\u751fDemo\u811a\u672c\uff1aDemo.py<\/p>\n<pre><pre class=\"brush: python; title: ; notranslate\" title=\"\">\n# -*- coding: utf-8 -*-\nimport sys\nimport uuid\nimport requests\nimport wave\nimport base64\nimport hashlib\n\nfrom imp import reload\n\nimport time\n\nreload(sys)\n\nYOUDAO_URL = &#039;https:\/\/openapi.youdao.com\/asrapi&#039;\nAPP_KEY = &#039;your key&#039;\nAPP_SECRET = &#039;your secret&#039;\n\ndef truncate(q):\n    if q is None:\n        return None\n    size = len(q)\n    return q if size &amp;lt;= 20 else q&#x5B;0:10] + str(size) + q&#x5B;size-10:size]\n\ndef encrypt(signStr):\n    hash_algorithm = hashlib.sha256()\n    hash_algorithm.update(signStr.encode(&#039;utf-8&#039;))\n    return hash_algorithm.hexdigest()\n\ndef do_request(data):\n    headers = {&#039;Content-Type&#039;: &#039;application\/x-www-form-urlencoded&#039;}\n    return requests.post(YOUDAO_URL, data=data, headers=headers)\n\ndef connect(audio_file_path=&#039;\u97f3\u9891\u7684\u8def\u5f84&#039;, lang_type=&#039;zh-CHS&#039;):\n    &quot;&quot;&quot;Send a local WAV file to Youdao ASR and return the response.\n\n    audio_file_path: path to a .wav file\n    lang_type: language code (default &#039;zh-CHS&#039;)\n    &quot;&quot;&quot;\n    extension = audio_file_path&#x5B;audio_file_path.rindex(&#039;.&#039;)+1:]\n    if extension != &#039;wav&#039;:\n        raise ValueError(&#039;\u4e0d\u652f\u6301\u7684\u97f3\u9891\u7c7b\u578b: %s&#039; % extension)\n\n    wav_info = wave.open(audio_file_path, &#039;rb&#039;)\n    sample_rate = wav_info.getframerate()\n    nchannels = wav_info.getnchannels()\n    wav_info.close()\n    with open(audio_file_path, &#039;rb&#039;) as file_wav:\n        q = base64.b64encode(file_wav.read()).decode(&#039;utf-8&#039;)\n\n    data = {}\n    curtime = str(int(time.time()))\n    data&#x5B;&#039;curtime&#039;] = curtime\n    salt = str(uuid.uuid1())\n    signStr = APP_KEY + truncate(q) + salt + curtime + APP_SECRET\n    sign = encrypt(signStr)\n    data&#x5B;&#039;appKey&#039;] = APP_KEY\n    data&#x5B;&#039;q&#039;] = q\n    data&#x5B;&#039;salt&#039;] = salt\n    data&#x5B;&#039;sign&#039;] = sign\n    data&#x5B;&#039;signType&#039;] = &quot;v2&quot;\n    data&#x5B;&#039;langType&#039;] = lang_type\n    data&#x5B;&#039;rate&#039;] = sample_rate\n    data&#x5B;&#039;format&#039;] = &#039;wav&#039;\n    data&#x5B;&#039;channel&#039;] = nchannels\n    data&#x5B;&#039;type&#039;] = 1\n\n    response = do_request(data)\n    try:\n        print(response.json())\n    except Exception:\n        print(response.content)\n    return response\n\nif __name__ == &#039;__main__&#039;:\n    connect()\n<\/pre>\n<p>pip list: sounddevice soundfile requests<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u505a\u4e86\u4e2a\u8bed\u97f3\u8f6c\u6587\u5b57\u7684\u811a\u672c\uff0c\u5e95\u5c42\u662f\u6709\u9053\u667a\u4e91\u7684\u77ed\u8bed\u97f3\u8bc6\u522b\uff0c\u4e00\u6b21\u8bc6\u522b\u53ea\u89810.004\u5143\uff0c\u57fa\u672c\u53ef\u4ee5\u7528\u6765\u89e3\u653e\u53cc\u624b\uff0c\u5feb\u901f\u8ddfmi [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-1714","post","type-post","status-publish","format-standard","hentry","category-uncategorized"],"blocksy_meta":[],"_links":{"self":[{"href":"https:\/\/notes.coremix.net\/index.php?rest_route=\/wp\/v2\/posts\/1714","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/notes.coremix.net\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/notes.coremix.net\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/notes.coremix.net\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/notes.coremix.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=1714"}],"version-history":[{"count":3,"href":"https:\/\/notes.coremix.net\/index.php?rest_route=\/wp\/v2\/posts\/1714\/revisions"}],"predecessor-version":[{"id":1718,"href":"https:\/\/notes.coremix.net\/index.php?rest_route=\/wp\/v2\/posts\/1714\/revisions\/1718"}],"wp:attachment":[{"href":"https:\/\/notes.coremix.net\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1714"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/notes.coremix.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1714"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/notes.coremix.net\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1714"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}