{"id":85130,"date":"2026-07-27T01:17:34","date_gmt":"2026-07-26T17:17:34","guid":{"rendered":"https:\/\/www.wsisp.com\/helps\/85130.html"},"modified":"2026-07-27T01:17:34","modified_gmt":"2026-07-26T17:17:34","slug":"%e7%ac%ac10%e7%ab%a0-streaming%ef%bc%88%e4%b8%8a%ef%bc%89%ef%bc%9a%e5%88%9d%e7%ba%a7%e9%9f%b3%e9%a2%91%e5%ba%94%e7%94%a8%ef%bc%881%ef%bc%89-%e9%a1%b9%e7%9b%ae%e4%b8%89%ef%bc%9a","status":"publish","type":"post","link":"https:\/\/www.wsisp.com\/helps\/85130.html","title":{"rendered":"\u7b2c10\u7ae0 Streaming\uff08\u4e0a\uff09\uff1a\u521d\u7ea7\u97f3\u9891\u5e94\u7528\uff081\uff09\u2014\u2014\u9879\u76ee\u4e09\uff1a\u81ea\u5efa\u670d\u52a1\u5668\u7684Mini-Omni\u5b9e\u65f6\u8bed\u97f3\u804a\u5929\u673a\u5668\u4eba"},"content":{"rendered":"<\/p>\n<h4>\u7b2c10\u7ae0 Streaming&#xff08;\u4e0a&#xff09;&#xff1a;\u521d\u7ea7\u97f3\u9891\u5e94\u7528&#xff08;1&#xff09;\u2014\u2014\u9879\u76ee\u4e09&#xff1a;\u81ea\u5efa\u670d\u52a1\u5668\u7684Mini-Omni\u5b9e\u65f6\u8bed\u97f3\u804a\u5929\u673a\u5668\u4eba<\/h4>\n<ul>\n<li>\u7b2c10\u7ae0 Streaming&#xff08;\u4e0a&#xff09;&#xff1a;\u521d\u7ea7\u97f3\u9891\u5e94\u7528<\/li>\n<li>\n<ul>\n<li>10.1 \u81ea\u52a8\u8bed\u97f3\u8bc6\u522b\u6280\u672f&#xff08;ASR&#xff09;<\/li>\n<li>\n<ul>\n<li>10.1.1 Whisper\u6a21\u578b\u4e0eFFmpeg\u6846\u67b6<\/li>\n<li>10.1.2 \u6784\u5efa\u5168\u4e0a\u4e0b\u6587\u548c\u5b9e\u65f6\u6d41\u5f0fASR\u6f14\u793a<\/li>\n<\/ul>\n<\/li>\n<li>10.2 Mini-Omni\u6784\u5efa\u5b9e\u65f6\u8bed\u97f3\u804a\u5929\u673a\u5668\u4eba<\/li>\n<li>\n<ul>\n<li>10.2.1 Mini-Omni&#xff1a;\u5b9e\u65f6\u8bed\u97f3\u591a\u6a21\u6001\u5927\u6a21\u578b<\/li>\n<li>10.2.2 \u9879\u76ee\u4e09&#xff1a;\u81ea\u5efa\u670d\u52a1\u5668\u7684Mini-Omni\u5b9e\u65f6\u8bed\u97f3\u804a\u5929\u673a\u5668\u4eba<\/li>\n<li>\n<ul>\n<li>1. \u672c\u5730\u90e8\u7f72Mini-Omni\u804a\u5929\u670d\u52a1\u5668<\/li>\n<li>2. \u5e94\u7528\u72b6\u6001\u3001\u62fc\u63a5\u97f3\u9891\u4e0e\u68c0\u6d4b\u505c\u987f<\/li>\n<li>3. \u6d41\u5f0f\u4f20\u8f93\u54cd\u5e94\u97f3\u9891<\/li>\n<li>4. \u7531gr.Blocks\u6784\u5efaGradio\u5e94\u7528<\/li>\n<li>5. \u542f\u52a8\u5e94\u7528\u53ca\u6f14\u793a\u6548\u679c<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<h2>\u7b2c10\u7ae0 Streaming&#xff08;\u4e0a&#xff09;&#xff1a;\u521d\u7ea7\u97f3\u9891\u5e94\u7528<\/h2>\n<p>\u7531\u4e8e\u6d41\u5f0f\u4f20\u8f93\u5185\u5bb9\u8f83\u591a&#xff0c;\u56e0\u6b64\u5c06\u5176\u5206\u4e3a\u521d\u7ea7\u97f3\u9891\u5e94\u7528\u3001\u9ad8\u7ea7\u97f3\u9891\u5e94\u7528\u548c\u89c6\u9891\u5e94\u7528\u4e09\u90e8\u5206\u3002\u672c\u7ae0\u97f3\u9891\u5e94\u7528\u90e8\u5206\u5305\u62ec\u81ea\u52a8\u8bed\u97f3\u8bc6\u522b\u6280\u672f&#xff08;ASR&#xff09;&#xff0c;\u81ea\u5efa\u670d\u52a1\u5668\u7684Mini-Omni\u6a21\u578b\u7684\u5bf9\u8bdd\u5f0f\u804a\u5929\u673a\u5668\u4eba&#xff0c;Groq\u4e0e\u5e26\u81ea\u52a8\u8bed\u97f3\u68c0\u6d4b\u529f\u80fd\u7684\u591a\u6a21\u6001Gradio\u5e94\u7528&#xff0c;Mistral\u5b9e\u73b0\u6d41\u5f0f\u4f20\u8f93\u97f3\u9891\u7684\u9b54\u529b8\u53f7\u7403\u3002\u9664\u4e86\u62c6\u89e3\u97f3\u9891\u5e94\u7528&#xff0c;\u8fd8\u4f1a\u8be6\u7ec6\u4ecb\u7ecd\u5e76\u5b9e\u6218\u5927\u6a21\u578b\u5e93Whisper\u3001Mini-Omni\u3001Groq\u548cMistral\u3002\u6b64\u5916&#xff0c;\u672c\u7ae0\u8fd8\u4f1a\u8be6\u7ec6\u8bb2\u89e3\u7528\u5230\u7684\u5176\u4ed6\u6280\u672f&#xff1a;&#064;ricky0123\/vad-web\u5b9e\u73b0\u8bed\u97f3\u6d3b\u52a8\u68c0\u6d4b\u529f\u80fd&#xff0c;Groq\u9ad8\u901f\u5927\u6a21\u578b\u8c03\u7528\u5e93&#xff0c;LiteLLM\u9ad8\u901f\u5f00\u6e90\u4ee3\u7406\u5e93&#xff0c;AI-SDK\u662fJavaScript\u7248\u5927\u6a21\u578b\u8c03\u7528\u5e93&#xff0c;HF Inference\u5728\u670d\u52a1\u5668\u4e0a\u8fd0\u884c\u63a8\u7406&#xff0c;Spaces ZeroGPU\u4e3aSpaces\u63d0\u4f9b\u52a8\u6001GPU\u5206\u914d\u65b9\u6848&#xff0c;Parler-TTS\u662f\u6587\u672c\u8f6c\u8bed\u97f3\u6a21\u578b\u3002\u793a\u4f8b\u7531\u6d45\u5165\u6df1\u9010\u6b65\u6dfb\u52a0\u8bed\u97f3\u8bc6\u522b\u3001\u667a\u80fd\u56de\u590d\u3001\u81ea\u52a8\u68c0\u6d4b\u53ca\u6d41\u5f0f\u4f20\u8f93\u3002\u901a\u8fc7\u672c\u7ae0\u7684\u5b66\u4e60&#xff0c;\u97f3\u9891\u9886\u57df\u7684\u5f00\u53d1\u8005\u53ef\u638c\u63e1Gradio\u76f8\u5173\u7684\u8bed\u97f3\u3001\u97f3\u9891\u7684\u751f\u6210\u53ca\u68c0\u6d4b\u6280\u672f&#xff0c;\u8fd8\u6709\u6700\u524d\u6cbf\u7684\u63a8\u7406API\u53ca\u52a0\u901f\u65b9\u6848\u3002<\/p>\n<h3>10.1 \u81ea\u52a8\u8bed\u97f3\u8bc6\u522b\u6280\u672f&#xff08;ASR&#xff09;<\/h3>\n<p>\u81ea\u52a8\u8bed\u97f3\u8bc6\u522b\u6280\u672f&#xff08;Automatic speech recognition&#xff1a;ASR&#xff09;\u4f5c\u4e3a\u673a\u5668\u5b66\u4e60\u4e2d\u5c06\u8bed\u97f3\u4fe1\u53f7\u8f6c\u6362\u4e3a\u6587\u672c\u7684\u91cd\u8981\u9886\u57df&#xff0c;\u6b63\u5904\u4e8e\u5feb\u901f\u53d1\u5c55\u9636\u6bb5\u3002\u5f53\u524dASR\u7b97\u6cd5\u5df2\u666e\u904d\u5e94\u7528\u4e8e\u667a\u80fd\u624b\u673a\u8bbe\u5907&#xff0c;\u5e76\u9010\u6b65\u6e17\u900f\u5230\u4e13\u4e1a\u5de5\u4f5c\u6d41\u7a0b\u4e2d&#xff0c;\u5982\u533b\u62a4\u4eba\u5458\u7684\u6570\u5b57\u52a9\u7406\u7cfb\u7edf\u3002\u7531\u4e8eASR\u7b97\u6cd5\u76f4\u63a5\u9762\u5411\u7ec8\u7aef\u7528\u6237&#xff0c;\u6240\u4ee5\u5fc5\u987b\u786e\u4fdd\u5176\u80fd\u591f\u5b9e\u65f6\u51c6\u786e\u5904\u7406\u5404\u79cd\u8bed\u97f3\u7279\u5f81&#xff08;\u5305\u62ec\u4e0d\u540c\u53e3\u97f3\u3001\u97f3\u9ad8\u53ca\u80cc\u666f\u566a\u58f0\u7b49&#xff09;\u3002 \u901a\u8fc7Gradio\u5e73\u53f0&#xff0c;\u5f00\u53d1\u8005\u53ef\u5feb\u901f\u6784\u5efaASR\u7b97\u6cd5\u6a21\u578b\u7684\u6f14\u793a\u7cfb\u7edf&#xff0c;\u4fbf\u4e8e\u6d4b\u8bd5\u56e2\u961f\u901a\u8fc7\u8bed\u97f3\u6587\u4ef6\u6216\u7531\u9ea6\u514b\u98ce\u7b49\u8bbe\u5907\u8fdb\u884c\u5b9e\u65f6\u9a8c\u8bc1\u3002\u672c\u8282\u5c06\u901a\u8fc7\u4e24\u79cd\u65b9\u5f0f\u6f14\u793a\u5982\u4f55\u5c06\u9884\u8bad\u7ec3\u8bed\u97f3\u8f6c\u6587\u672c\u6a21\u578b\u90e8\u7f72\u81f3Gradio\u4ea4\u4e92\u754c\u9762&#xff1a;\u7b2c\u4e00\u79cd\u91c7\u7528\u5168\u4e0a\u4e0b\u6587\u6a21\u5f0f&#xff0c;\u5373\u7528\u6237\u5b8c\u6210\u6574\u6bb5\u5f55\u97f3\u540e\u624d\u6267\u884c\u9884\u6d4b&#xff1b;\u7b2c\u4e8c\u79cd\u5c06\u6f14\u793a\u6539\u9020\u4e3a\u6d41\u5f0f\u5904\u7406\u6a21\u5f0f\u3002<\/p>\n<h4>10.1.1 Whisper\u6a21\u578b\u4e0eFFmpeg\u6846\u67b6<\/h4>\n<p>\u672c\u4f8b\u4f7f\u7528\u9884\u8bad\u7ec3\u8bed\u97f3\u8bc6\u522b\u6a21\u578b&#xff0c;\u9700\u8981\u4ee5\u4e0b\u4e24\u4e2aASR\u6280\u672f\u6784\u5efa\u6f14\u793a\u7cfb\u7edf&#xff1a;<\/p>\n<ul>\n<li>Whisper\u6a21\u578b&#xff1a;\u4f7f\u7528transformers\u4e2dWhisper\u6a21\u578b\u5b9e\u73b0\u8bed\u97f3\u8bc6\u522b\u3002Whisper\u662f\u7531OpenAI\u7684Alec Radford\u7b49\u4eba\u63d0\u51fa\u7684\u5148\u8fdb\u81ea\u52a8\u8bed\u97f3\u8bc6\u522bASR\u4e0e\u8bed\u97f3\u7ffb\u8bd1\u6a21\u578b&#xff0c;\u5728\u8d85\u8fc7500\u4e07\u5c0f\u65f6\u7684\u6807\u6ce8\u6570\u636e\u4e0a\u8bad\u7ec3\u800c\u6210&#xff0c;\u5c55\u73b0\u51fa\u5f3a\u5927\u7684\u96f6\u6837\u672c\u6cdb\u5316\u80fd\u529b&#xff0c;\u53ef\u9002\u5e94\u591a\u79cd\u6570\u636e\u96c6\u548c\u7814\u7a76\u9886\u57df&#xff0c;\u8bf7\u53c2\u9605whisper-large-v3-turbo&#x1f587;\ufe0f\u94fe\u63a510-1\u3002<\/li>\n<li>Ffmpeg\u6846\u67b6&#xff1a;\u5904\u7406\u9ea6\u514b\u98ce\u8f93\u5165\u6587\u4ef6&#xff0c;\u5b83\u662f\u9886\u5148\u7684\u591a\u5a92\u4f53\u6846\u67b6&#xff0c;\u80fd\u591f\u89e3\u7801\u3001\u7f16\u7801\u3001\u8f6c\u7801\u3001\u590d\u7528\u3001\u89e3\u590d\u7528\u3001\u6d41\u5f0f\u4f20\u8f93\u3001\u8fc7\u6ee4\u53ca\u64ad\u653e\u51e0\u4e4e\u6240\u6709\u4eba\u7c7b\u4e0e\u673a\u5668\u521b\u5efa\u7684\u5a92\u4f53\u5185\u5bb9\u3002\u8be5\u6846\u67b6\u652f\u6301\u4ece\u6700\u51b7\u95e8\u7684\u539f\u59cb\u683c\u5f0f\u5230\u6700\u524d\u6cbf\u7684\u6280\u672f\u6807\u51c6\u3002transformers\u5e93\u4f1a\u81ea\u5e26ffmpeg\u5e93&#xff0c;\u4f46\u6709\u65f6\u4f1a\u51fa\u73b0\u672a\u77e5\u9519\u8bef&#xff0c;\u6240\u4ee5\u5efa\u8bae\u5355\u72ec\u5b89\u88c5ffmpeg\u3002\u5728Windows\u5e73\u53f0\u4e0b&#xff0c;\u8fd8\u9700\u5355\u72ec\u4e0b\u8f7d&#xff0c;\u8be6\u7ec6\u4fe1\u606f\u8bf7\u53c2\u9605&#xff1a;FFmpeg&#x1f587;\ufe0f\u94fe\u63a510-2\u3002<\/li>\n<\/ul>\n<p>\u81ea\u52a8\u8bed\u97f3\u8bc6\u522bASR\u5e94\u7528\u5f00\u53d1\u5168\u90e8\u57fa\u4e8eTransformers&#xff0c;\u5148\u914d\u7f6eASR\u6a21\u578b\u2014\u2014\u53ef\u4ee5\u662f\u81ea\u884c\u8bad\u7ec3\u7684\u6a21\u578b&#xff0c;\u6216\u662f\u4e0b\u8f7d\u9884\u8bad\u7ec3\u6a21\u578b\u3002\u672c\u6559\u7a0b\u5c06\u4f7f\u7528Whisper\u57fa\u7840\u7684\u9884\u8bad\u7ec3ASR\u6a21\u578bwhisper-base.en\u3002\u7136\u540e\u6784\u5efa\u5168\u4e0a\u4e0b\u6587ASR\u6f14\u793a\u7cfb\u7edf\u548c\u5b9e\u65f6\u6d41\u5f0fASR\u6f14\u793a\u7cfb\u7edf\u3002<\/p>\n<h4>10.1.2 \u6784\u5efa\u5168\u4e0a\u4e0b\u6587\u548c\u5b9e\u65f6\u6d41\u5f0fASR\u6f14\u793a<\/h4>\n<p>\u6784\u5efa\u5168\u4e0a\u4e0b\u6587ASR\u6f14\u793a\u3002\u6240\u8c13\u5168\u4e0a\u4e0b\u6587\u5373\u7528\u6237\u9700\u5b8c\u6574\u5f55\u5236\u97f3\u9891\u540e&#xff0c;\u7cfb\u7edf\u624d\u4f1a\u8c03\u7528ASR\u6a21\u578b\u8fdb\u884c\u63a8\u7406\u3002\u5229\u7528Gradio\u5b9e\u73b0\u8fd9\u4e00\u529f\u80fd\u975e\u5e38\u7b80\u5355\u2014\u2014\u53ea\u9700\u57fa\u4e8e\u7ba1\u7ebf\u5bf9\u8c61\u521b\u5efa\u5f55\u5236\u5b8c\u6210\u540e\u7684\u5904\u7406\u51fd\u6570\u5373\u53ef\u3002\u5982\u4ee3\u780110-1\u6240\u793a&#xff1a;<\/p>\n<p> \u4ee3\u780110-1<\/p>\n<p><span class=\"token keyword\">import<\/span> gradio <span class=\"token keyword\">as<\/span> gr<br \/>\n<span class=\"token keyword\">from<\/span> transformers <span class=\"token keyword\">import<\/span> pipeline<br \/>\n<span class=\"token keyword\">import<\/span> numpy <span class=\"token keyword\">as<\/span> np<\/p>\n<p>transcriber <span class=\"token operator\">&#061;<\/span> pipeline<span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;automatic-speech-recognition&#034;<\/span><span class=\"token punctuation\">,<\/span> model<span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;openai\/whisper-base.en&#034;<\/span><span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token keyword\">def<\/span> <span class=\"token function\">transcribe<\/span><span class=\"token punctuation\">(<\/span>audio<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    sr<span class=\"token punctuation\">,<\/span> y <span class=\"token operator\">&#061;<\/span> audio<br \/>\n    <span class=\"token comment\"># Convert to mono if stereo<\/span><br \/>\n    <span class=\"token keyword\">if<\/span> y<span class=\"token punctuation\">.<\/span>ndim <span class=\"token operator\">&gt;<\/span> <span class=\"token number\">1<\/span><span class=\"token punctuation\">:<\/span><br \/>\n        y <span class=\"token operator\">&#061;<\/span> y<span class=\"token punctuation\">.<\/span>mean<span class=\"token punctuation\">(<\/span>axis<span class=\"token operator\">&#061;<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    y <span class=\"token operator\">&#061;<\/span> y<span class=\"token punctuation\">.<\/span>astype<span class=\"token punctuation\">(<\/span>np<span class=\"token punctuation\">.<\/span>float32<span class=\"token punctuation\">)<\/span><br \/>\n    y <span class=\"token operator\">\/&#061;<\/span> np<span class=\"token punctuation\">.<\/span><span class=\"token builtin\">max<\/span><span class=\"token punctuation\">(<\/span>np<span class=\"token punctuation\">.<\/span><span class=\"token builtin\">abs<\/span><span class=\"token punctuation\">(<\/span>y<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token keyword\">return<\/span> transcriber<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">{<\/span><span class=\"token string\">&#034;sampling_rate&#034;<\/span><span class=\"token punctuation\">:<\/span> sr<span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;raw&#034;<\/span><span class=\"token punctuation\">:<\/span> y<span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">[<\/span><span class=\"token string\">&#034;text&#034;<\/span><span class=\"token punctuation\">]<\/span>  <\/p>\n<p>demo <span class=\"token operator\">&#061;<\/span> gr<span class=\"token punctuation\">.<\/span>Interface<span class=\"token punctuation\">(<\/span>transcribe<span class=\"token punctuation\">,<\/span><br \/>\n    gr<span class=\"token punctuation\">.<\/span>Audio<span class=\"token punctuation\">(<\/span>sources<span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;microphone&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;text&#034;<\/span><span class=\"token punctuation\">)<\/span><br \/>\ndemo<span class=\"token punctuation\">.<\/span>launch<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><\/p>\n<p>Gradio\u754c\u9762\u5c06\u91c7\u7528\u5185\u7f6e\u7684gr.Audio\u7ec4\u4ef6&#xff1a;\u8f93\u5165\u7ec4\u4ef6\u5c06\u63a5\u6536\u7528\u6237\u9ea6\u514b\u98ce\u8f93\u5165\u5e76\u8fd4\u56de\u5f55\u97f3\u6587\u4ef6\u8def\u5f84&#xff0c;\u8f93\u51fa\u7ec4\u4ef6\u5c06\u4f7f\u7528\u6807\u51c6Textbox\u7ec4\u4ef6\u663e\u793a\u8bc6\u522b\u7ed3\u679c\u3002\u51fd\u6570transcribe()\u63a5\u53d7\u5355\u4e00\u53c2\u6570audio&#xff0c;\u8fd9\u662f\u4e00\u4e2a\u7528\u6237\u5f55\u5236\u97f3\u9891\u7684numpy\u6570\u7ec4&#xff1b;\u63a5\u6536\u5305\u542b\u91c7\u6837\u7387&#xff08;sr&#xff09;\u548c\u97f3\u9891\u6570\u636e&#xff08;y&#xff09;\u7684\u5143\u7ec4&#xff0c;\u8fdb\u884c\u200c\u58f0\u9053\u5904\u7406\u200c&#xff1a;\u5982\u679c\u97f3\u9891\u662f\u7acb\u4f53\u58f0&#xff08;\u591a\u58f0\u9053&#xff09;&#xff0c;\u901a\u8fc7\u53d6\u5e73\u5747\u503c\u8f6c\u6362\u4e3a\u5355\u58f0\u9053\u3002\u7ba1\u9053\u5bf9\u8c61transcriber\u671f\u671b\u97f3\u9891\u4e3afloat32\u683c\u5f0f&#xff0c;\u7136\u540e\u8fdb\u884c\u6700\u5927\u5f52\u4e00\u5316&#xff0c;\u6700\u540e\u4f7f\u7528\u7ba1\u9053\u8bc6\u522b\u8f6c\u5f55\u6587\u672c\u3002\u8fd0\u884c\u754c\u9762\u5982\u56fe10-1\u6240\u793a&#xff1a; <img decoding=\"async\" src=\"https:\/\/www.wsisp.com\/helps\/wp-content\/uploads\/2026\/07\/20260726171732-6a66412c87a44.png\" alt=\"\u5728\u8fd9\u91cc\u63d2\u5165\u56fe\u7247\u63cf\u8ff0\" \/><\/p>\n<p> \u56fe10-1<\/p>\n<p>\u6784\u5efa\u5b9e\u65f6\u6d41\u5f0fASR\u6f14\u793a&#xff0c;\u9700\u8fdb\u884c\u4ee5\u4e0b\u914d\u7f6e\u8c03\u6574&#xff1a; (1)\u5728Audio\u7ec4\u4ef6\u4e2d\u8bbe\u7f6estreaming&#061;True\u4ee5\u652f\u6301\u6d41\u5f0f\u4f20\u8f93\u3002 (2)\u5728gr.Interface\u4e2d\u542f\u7528live&#061;True\u53c2\u6570\u4ee5\u652f\u6301\u5b9e\u65f6\u4f20\u8f93\u3002 (3)\u6dfb\u52a0\u72b6\u6001\u5b58\u50a8\u673a\u5236state\u4ee5\u4fdd\u5b58\u7528\u6237\u97f3\u9891\u6d41\u3002 (4)\u5224\u65ad\u72b6\u6001&#xff0c;\u62fc\u63a5\u6d41\u6570\u636e&#xff0c;\u6839\u636e\u5b8c\u6574\u6d41\u6570\u636e\u751f\u6210\u8f6c\u5f55\u6587\u672c\u3002 \u6784\u5efa\u6d41\u5f0fASR\u6f14\u793a\u7cfb\u7edf\u7684\u5177\u4f53\u5b9e\u73b0\u5982\u4ee3\u780110-2\u6240\u793a&#xff1a;<\/p>\n<p> \u4ee3\u780110-2<\/p>\n<p><span class=\"token keyword\">import<\/span> gradio <span class=\"token keyword\">as<\/span> gr<br \/>\n<span class=\"token keyword\">from<\/span> transformers <span class=\"token keyword\">import<\/span> pipeline<br \/>\n<span class=\"token keyword\">import<\/span> numpy <span class=\"token keyword\">as<\/span> np<\/p>\n<p>transcriber <span class=\"token operator\">&#061;<\/span> pipeline<span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;automatic-speech-recognition&#034;<\/span><span class=\"token punctuation\">,<\/span> model<span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;openai\/whisper-base.en&#034;<\/span><span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token keyword\">def<\/span> <span class=\"token function\">transcribe<\/span><span class=\"token punctuation\">(<\/span>stream<span class=\"token punctuation\">,<\/span> new_chunk<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    sr<span class=\"token punctuation\">,<\/span> y <span class=\"token operator\">&#061;<\/span> new_chunk<br \/>\n    <span class=\"token comment\"># Convert to mono if stereo<\/span><br \/>\n    <span class=\"token keyword\">if<\/span> y<span class=\"token punctuation\">.<\/span>ndim <span class=\"token operator\">&gt;<\/span> <span class=\"token number\">1<\/span><span class=\"token punctuation\">:<\/span><br \/>\n        y <span class=\"token operator\">&#061;<\/span> y<span class=\"token punctuation\">.<\/span>mean<span class=\"token punctuation\">(<\/span>axis<span class=\"token operator\">&#061;<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    y <span class=\"token operator\">&#061;<\/span> y<span class=\"token punctuation\">.<\/span>astype<span class=\"token punctuation\">(<\/span>np<span class=\"token punctuation\">.<\/span>float32<span class=\"token punctuation\">)<\/span><br \/>\n    y <span class=\"token operator\">\/&#061;<\/span> np<span class=\"token punctuation\">.<\/span><span class=\"token builtin\">max<\/span><span class=\"token punctuation\">(<\/span>np<span class=\"token punctuation\">.<\/span><span class=\"token builtin\">abs<\/span><span class=\"token punctuation\">(<\/span>y<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token keyword\">if<\/span> stream <span class=\"token keyword\">is<\/span> <span class=\"token keyword\">not<\/span> <span class=\"token boolean\">None<\/span><span class=\"token punctuation\">:<\/span><br \/>\n        stream <span class=\"token operator\">&#061;<\/span> np<span class=\"token punctuation\">.<\/span>concatenate<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">[<\/span>stream<span class=\"token punctuation\">,<\/span> y<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token keyword\">else<\/span><span class=\"token punctuation\">:<\/span><br \/>\n        stream <span class=\"token operator\">&#061;<\/span> y<br \/>\n    <span class=\"token keyword\">return<\/span> stream<span class=\"token punctuation\">,<\/span> transcriber<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">{<\/span><span class=\"token string\">&#034;sampling_rate&#034;<\/span><span class=\"token punctuation\">:<\/span> sr<span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;raw&#034;<\/span><span class=\"token punctuation\">:<\/span> stream<span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">[<\/span><span class=\"token string\">&#034;text&#034;<\/span><span class=\"token punctuation\">]<\/span><\/p>\n<p>demo <span class=\"token operator\">&#061;<\/span> gr<span class=\"token punctuation\">.<\/span>Interface<span class=\"token punctuation\">(<\/span>transcribe<span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token punctuation\">[<\/span><span class=\"token string\">&#034;state&#034;<\/span><span class=\"token punctuation\">,<\/span> gr<span class=\"token punctuation\">.<\/span>Audio<span class=\"token punctuation\">(<\/span>sources<span class=\"token operator\">&#061;<\/span><span class=\"token punctuation\">[<\/span><span class=\"token string\">&#034;microphone&#034;<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">,<\/span> streaming<span class=\"token operator\">&#061;<\/span><span class=\"token boolean\">True<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token punctuation\">[<\/span><span class=\"token string\">&#034;state&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;text&#034;<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">,<\/span> live<span class=\"token operator\">&#061;<\/span><span class=\"token boolean\">True<\/span><span class=\"token punctuation\">)<\/span><br \/>\ndemo<span class=\"token punctuation\">.<\/span>launch<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><\/p>\n<p>\u8bf7\u6ce8\u610f&#xff0c;\u73b0\u5728\u6709\u4e00\u4e2a\u72b6\u6001\u53d8\u91cfstate\u7528\u4e8e\u8ddf\u8e2a\u6240\u6709\u97f3\u9891\u5386\u53f2\u3002\u968f\u7740\u63a5\u53e3\u8fd0\u884c&#xff0c;\u6bcf\u6b21\u6709\u65b0\u7684\u5c0f\u6bb5\u97f3\u9891\u65f6&#xff0c;\u5c06\u5176\u4f5c\u4e3anew_chunk&#xff0c;\u62fc\u63a5\u5230stream\u4e2d&#xff0c;\u5728transcribe\u51fd\u6570\u7684\u5165\u53c2stream\u4e2d\u8ddf\u8e2a\u8fc4\u4eca\u4e3a\u6b62\u6240\u6709\u7684\u97f3\u9891\u8bb0\u5f55&#xff1b;\u6700\u540e\u5c06\u5b58\u50a8\u5e76\u8fd4\u56de\u65b0\u7684\u5b8c\u6574\u97f3\u9891\u6d41stream&#xff0c;\u540c\u65f6\u8c03\u7528\u7ba1\u9053transcriber\u8fd4\u56de\u8f6c\u5f55\u6587\u672c\u3002\u6574\u4e2a\u8fc7\u7a0b\u53ea\u9700\u7b80\u5355\u5730\u5c06\u97f3\u9891\u62fc\u63a5\u5728\u4e00\u8d77&#xff0c;\u5e76\u5bf9\u6574\u4e2a\u97f3\u9891\u8c03\u7528\u8f6c\u5f55\u5668\u5bf9\u8c61\u3002\u4e5f\u53ef\u4ee5\u4f18\u5316\u4e3a\u5176\u5b83\u66f4\u6709\u6548\u7387\u7684\u5904\u7406\u65b9\u5f0f&#xff0c;\u6bd4\u5982\u6bcf\u6b21\u63a5\u6536\u5230\u65b0\u97f3\u9891\u7247\u6bb5\u65f6&#xff0c;\u4ec5\u91cd\u65b0\u5904\u7406\u6700\u540e5\u79d2\u7684\u97f3\u9891\u3002<\/p>\n<p>\u73b0\u5728&#xff0c;\u5f97\u76ca\u4e8e\u8bbe\u7f6egr.Interface\u7684\u53c2\u6570live\u53cagr.Audio\u7684\u53c2\u6570streaming&#xff0c;ASR\u6a21\u578b\u5c06\u5728\u7528\u6237\u8bf4\u8bdd\u65f6\u81ea\u52a8\u5f55\u97f3\u5e76\u8f6c\u5f55\u6587\u672c\u3002\u6b64\u65f6\u4ecd\u9700\u5355\u51fb\u201c\u5f55\u97f3\u201d&#xff0c;\u6ce8\u610f\u5728\u8fdb\u5ea6\u6761\u5f00\u59cb\u540e\u5f55\u97f3&#xff0c;\u8fd0\u884c\u754c\u9762\u5982\u56fe10-2\u6240\u793a&#xff1a; <img decoding=\"async\" src=\"https:\/\/www.wsisp.com\/helps\/wp-content\/uploads\/2026\/07\/20260726171732-6a66412cbbada.png\" alt=\"\u5728\u8fd9\u91cc\u63d2\u5165\u56fe\u7247\u63cf\u8ff0\" \/><\/p>\n<p> \u56fe10-2<\/p>\n<h3>10.2 Mini-Omni\u6784\u5efa\u5b9e\u65f6\u8bed\u97f3\u804a\u5929\u673a\u5668\u4eba<\/h3>\n<p>\u65b0\u4e00\u4ee3AI\u7528\u6237\u754c\u9762\u6b63\u671d\u7740\u539f\u751f\u97f3\u9891\u4f53\u9a8c\u53d1\u5c55&#xff0c;\u7528\u6237\u5c06\u80fd\u591f\u4e0e\u804a\u5929\u673a\u5668\u4eba\u5b9e\u65f6\u5bf9\u8bdd\u5e76\u63a5\u6536\u8bed\u97f3\u56de\u590d\u3002\u57fa\u4e8e\u8fd9\u4e00\u8303\u5f0f\u5df2\u5f00\u53d1\u51fa\u591a\u4e2a\u6a21\u578b&#xff0c;\u5305\u62ecGPT-4o\u548cMini-Omni\u3002\u672c\u8282\u5c06\u4ee5Mini-Omni\u4e3a\u4f8b\u9010\u6b65\u6784\u5efa\u5bf9\u8bdd\u5f0f\u804a\u5929\u5e94\u7528&#xff0c;\u5b83\u652f\u6301\u5b9e\u65f6\u97f3\u9891\u5904\u7406\u3001\u5bf9\u8bdd\u7ba1\u7406\u548c\u81ea\u52a8\u5faa\u73af\u5f55\u97f3&#xff0c;\u8bed\u97f3\u7ecf\u5904\u7406\u540e\u53ef\u751f\u6210\u54cd\u5e94&#xff0c;\u5e76\u53ef\u52a8\u6001\u66f4\u65b0\u5386\u53f2\u5c55\u793a\u3002\u672c\u8282\u9996\u5148\u4ecb\u7ecdMini-Omni\u5927\u6a21\u578b&#xff0c;\u7136\u540e\u6784\u5efa\u5b9e\u65f6\u8bed\u97f3\u804a\u5929\u673a\u5668\u4eba\u3002<\/p>\n<h4>10.2.1 Mini-Omni&#xff1a;\u5b9e\u65f6\u8bed\u97f3\u591a\u6a21\u6001\u5927\u6a21\u578b<\/h4>\n<p>Mini-Omni\u662f\u4e00\u6b3e\u5f00\u6e90\u591a\u6a21\u6001\u5927\u8bed\u8a00\u6a21\u578b&#xff0c;\u5177\u5907\u5b9e\u65f6\u542c\u8bf4\u4e0e\u540c\u6b65\u601d\u8003\u80fd\u529b\u3002\u8be5\u6a21\u578b\u91c7\u7528\u7aef\u5230\u7aef\u67b6\u6784&#xff0c;\u652f\u6301\u5b9e\u65f6\u8bed\u97f3\u8f93\u5165\u4e0e\u6d41\u5f0f\u97f3\u9891\u8f93\u51fa\u7684\u5bf9\u8bdd\u4ea4\u4e92&#xff0c;\u53ef\u5b9e\u73b0\u8f83\u5b8c\u6574\u7684\u8bed\u97f3\u4ea4\u4e92\u4f53\u9a8c&#xff0c;\u5176GitHub\u5730\u5740\u4e3a&#xff1a;gpt-omni\/mini-omni&#x1f587;\ufe0f\u94fe\u63a510-3\u3002<\/p>\n<p>Mini-Omni\u529f\u80fd\u7279\u6027\u5305\u62ec&#xff1a;\u2460\u5b9e\u65f6\u8bed\u97f3\u5bf9\u8bdd\u80fd\u529b&#xff0c;\u65e0\u9700\u989d\u5916\u914d\u7f6eASR\u6216TTS\u6a21\u578b\u3002\u2461\u601d\u8003\u4e0e\u8bed\u97f3\u540c\u6b65\u751f\u6210 &#xff0c;\u652f\u6301\u6587\u672c\u4e0e\u97f3\u9891\u5e76\u884c\u8f93\u51fa\u3002\u2462\u6d41\u5f0f\u97f3\u9891\u8f93\u51fa\u529f\u80fd\u3002\u2463\u652f\u6301\u201c\u8bed\u97f3\u8f6c\u6587\u672c\u201d\u4e0e\u201c\u8bed\u97f3\u8f6c\u8bed\u97f3\u201d\u7684\u6279\u91cf\u63a8\u7406\u6a21\u5f0f\u4ee5\u63d0\u5347\u6027\u80fd\u3002\u529f\u80fd\u793a\u610f\u56fe\u5982\u56fe10-3\u6240\u793a&#xff1a; <img decoding=\"async\" src=\"https:\/\/www.wsisp.com\/helps\/wp-content\/uploads\/2026\/07\/20260726171732-6a66412cf0928.png\" alt=\"\u5728\u8fd9\u91cc\u63d2\u5165\u56fe\u7247\u63cf\u8ff0\" \/><\/p>\n<p> \u56fe10-3<\/p>\n<p>\u53e6\u5916&#xff0c;\u5b98\u65b9\u5df2\u4e8e2024\u5e7410\u6708\u53d1\u5e03Mini-Omni2&#xff0c;\u5b83\u662f\u4e00\u6b3e\u5168\u4ea4\u4e92\u5f0f\u591a\u6a21\u6001\u6a21\u578b&#xff0c;\u652f\u6301\u56fe\u50cf\u3001\u97f3\u9891\u548c\u6587\u672c\u8f93\u5165\u3002\u5b83\u80fd\u4e0e\u7528\u6237\u8fdb\u884c\u7aef\u5230\u7aef\u7684\u5b9e\u65f6\u8bed\u97f3\u5bf9\u8bdd&#xff0c;\u652f\u6301\u8bed\u97f3\u6253\u65ad\u673a\u5236\u7684\u7075\u6d3b\u4ea4\u4e92&#xff0c;\u8bf7\u6839\u636e\u9700\u6c42\u9009\u62e9\u3002 \u8fd0\u884cMini-Omni\u5b98\u65b9\u793a\u4f8b&#xff0c;\u6b65\u9aa4\u5982\u4e0b&#xff1a; (1)\u9996\u5148&#xff0c;\u5b89\u88c5Mini-Omni\u3002\u521b\u5efa\u65b0conda\u73af\u5883\u5e76\u6fc0\u6d3b&#xff0c;\u514b\u9686Mini-Omni\u8d44\u6e90\u540e\u5b89\u88c5\u76ee\u5f55\u4e2d\u7684Python\u9700\u6c42\u5305&#xff0c;\u547d\u4ee4\u5982\u4e0b\u6240\u793a&#xff1a;<\/p>\n<p>conda create <span class=\"token parameter variable\">-n<\/span> omni <span class=\"token assign-left variable\">python<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token number\">3.13<\/span><br \/>\nconda activate omni<br \/>\n<span class=\"token function\">git<\/span> clone https:\/\/github.com\/gpt-omni\/mini-omni.git<br \/>\n<span class=\"token builtin class-name\">cd<\/span> mini-omni<br \/>\npip <span class=\"token function\">install<\/span> <span class=\"token parameter variable\">-r<\/span> requirements.txt<\/p>\n<p>(2)\u7136\u540e&#xff0c;\u542f\u52a8Mini-Omni\u670d\u52a1\u5668\u3002\u4ee5Linux\u4e3a\u4f8b&#xff0c;\u542f\u52a8\u547d\u4ee4\u5982\u4e0b\u6240\u793a&#xff1a;<\/p>\n<p><span class=\"token function\">sudo<\/span> <span class=\"token function\">apt-get<\/span> <span class=\"token function\">install<\/span> ffmpeg<br \/>\nconda activate omni<br \/>\n<span class=\"token builtin class-name\">cd<\/span> mini-omni<br \/>\npython3 server.py <span class=\"token parameter variable\">&#8211;ip<\/span> <span class=\"token string\">&#039;127.0.0.1&#039;<\/span> <span class=\"token parameter variable\">&#8211;port<\/span> <span class=\"token number\">60808<\/span><\/p>\n<p>(3)\u63a5\u7740&#xff0c;\u8fd0\u884cStreamLit\u6f14\u793a\u548cGradio\u6f14\u793a\u3002\u8fd0\u884cStreamLit\u6f14\u793a\u9700\u5148\u5b89\u88c5PyAudio&#xff1b;\u82e5\u51fa\u73b0\u9519\u8bef\u201cModuleNotFoundError: No module named \u2018utils.vad\u2019\u201d&#xff0c;\u8bf7\u5148\u6267\u884c\u547d\u4ee4&#xff1a;export PYTHONPATH&#061;.\/&#xff1b;\u53e6\u5916&#xff0c;\u8fd8\u9700\u914d\u7f6e\u670d\u52a1\u5668\u5730\u5740API_URL&#xff1b;\u6700\u540e&#xff0c;\u8fd0\u884c\u524d\u9700\u5148\u53d6\u6d88\u9759\u97f3\u8bbe\u7f6e\u3002\u8fd0\u884cGradio\u6f14\u793a\u547d\u4ee4\u5982\u4e0b&#xff1a;<\/p>\n<p><span class=\"token assign-left variable\">API_URL<\/span><span class=\"token operator\">&#061;<\/span>http:\/\/127.0.0.1:60808\/chat python3 webui\/omni_gradio.py<\/p>\n<p>(4)\u6700\u540e&#xff0c;\u4f7f\u7528\u63a8\u7406\u6d4b\u8bd5\u6f14\u793a\u3002\u672c\u5730\u6d4b\u8bd5\u547d\u4ee4\u5982\u4e0b&#xff1a;<\/p>\n<p>conda activate omni<br \/>\n<span class=\"token builtin class-name\">cd<\/span> mini-omni<br \/>\n<span class=\"token comment\"># test run the preset audio samples and questions<\/span><br \/>\npython inference.py<\/p>\n<h4>10.2.2 \u9879\u76ee\u4e09&#xff1a;\u81ea\u5efa\u670d\u52a1\u5668\u7684Mini-Omni\u5b9e\u65f6\u8bed\u97f3\u804a\u5929\u673a\u5668\u4eba<\/h4>\n<p>\u9879\u76ee\u9996\u5148\u5728\u672c\u5730\u90e8\u7f72\u57fa\u4e8eMini-Omni\u7684\u804a\u5929\u670d\u52a1\u5668&#xff0c;\u63a5\u7740\u8bb2\u8ff0\u804a\u5929\u673a\u5668\u4eba\u5982\u4f55\u8bbe\u7f6e\u5e94\u7528\u72b6\u6001\u3001\u5b58\u50a8\u97f3\u9891\u4ee5\u53ca\u68c0\u6d4b\u505c\u987f&#xff0c;\u968f\u540e\u8bb2\u8ff0\u6838\u5fc3\u903b\u8f91\u2014\u2014\u751f\u6210\u5e76\u62fc\u63a5\u54cd\u5e94\u97f3\u9891&#xff0c;\u518d\u8005\u4f7f\u7528Gradio\u6784\u5efa\u804a\u5929\u754c\u9762&#xff0c;\u6700\u540e\u8bb2\u8ff0\u542f\u52a8\u5e94\u7528\u6b65\u9aa4\u53ca\u7528\u6237\u4f53\u9a8c\u6548\u679c\u3002omni-mini\u804a\u5929\u673a\u5668\u4eba\u5e94\u7528\u5c06\u5b9e\u73b0\u4ee5\u4e0b\u7528\u6237\u4f53\u9a8c&#xff1a; (1)\u7528\u6237\u70b9\u51fb\u6309\u94ae\u5f00\u59cb\u5f55\u5236\u8bed\u97f3\u6d88\u606f\u3002 (2)\u5e94\u7528\u53ef\u4ee5\u68c0\u6d4b\u5230\u7528\u6237\u505c\u6b62\u8bf4\u8bdd\u540e\u81ea\u52a8\u7ed3\u675f\u5f55\u5236\u3002 (3)\u7528\u6237\u97f3\u9891\u4f20\u5165Mini-Omni\u6a21\u578b&#xff0c;\u6a21\u578b\u4f1a\u6d41\u5f0f\u8fd4\u56de\u54cd\u5e94\u3002 (4)Mini-Omni\u5b8c\u6210\u5e94\u7b54\u540e\u91cd\u65b0\u6fc0\u6d3b\u7528\u6237\u9ea6\u514b\u98ce\u3002 (5)\u6240\u6709\u5bf9\u8bdd\u5386\u53f2&#xff08;\u7528\u6237\u4e0eMini-Omni\u7684\u8bed\u97f3\u8bb0\u5f55&#xff09;\u663e\u793a\u5728\u804a\u5929\u754c\u9762\u4e2d\u3002<\/p>\n<h5>1. \u672c\u5730\u90e8\u7f72Mini-Omni\u804a\u5929\u670d\u52a1\u5668<\/h5>\n<p>\u5728\u5f00\u53d1\u804a\u5929\u5e94\u7528\u4e4b\u524d&#xff0c;\u9700\u8981\u5148\u5728\u672c\u5730\u90e8\u7f72\u4ee5Mini-Omni\u5927\u6a21\u578b\u4e3a\u540e\u53f0\u7684\u804a\u5929\u670d\u52a1\u5668&#xff0c;\u804a\u5929\u754c\u9762\u53d1\u9001\u7528\u6237\u8f93\u5165\u6d88\u606f\u5230\u804a\u5929\u670d\u52a1\u5668&#xff0c;\u804a\u5929\u670d\u52a1\u5668\u751f\u6210\u54cd\u5e94\u540e\u56de\u4f20\u3002\u9879\u76ee\u6587\u4ef6\u53ef\u5728\u7ebf\u4e0a\u4e0b\u8f7d\u538b\u7f29\u5305\u3002\u5b9a\u4e49Omni\u804a\u5929\u670d\u52a1\u5668\u5982\u4ee3\u780110-3\u6240\u793a&#xff1a;<\/p>\n<p> \u4ee3\u780110-3<\/p>\n<p><span class=\"token comment\"># server.py<\/span><br \/>\n<span class=\"token keyword\">import<\/span> flask<br \/>\n<span class=\"token keyword\">import<\/span> base64<br \/>\n<span class=\"token keyword\">import<\/span> tempfile<br \/>\n<span class=\"token keyword\">import<\/span> traceback<br \/>\n<span class=\"token keyword\">from<\/span> flask <span class=\"token keyword\">import<\/span> Flask<span class=\"token punctuation\">,<\/span> Response<span class=\"token punctuation\">,<\/span> stream_with_context<br \/>\n<span class=\"token keyword\">from<\/span> inference <span class=\"token keyword\">import<\/span> OmniInference<\/p>\n<p><span class=\"token keyword\">class<\/span> <span class=\"token class-name\">OmniChatServer<\/span><span class=\"token punctuation\">(<\/span><span class=\"token builtin\">object<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    <span class=\"token keyword\">def<\/span> <span class=\"token function\">__init__<\/span><span class=\"token punctuation\">(<\/span>self<span class=\"token punctuation\">,<\/span> ip<span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#039;127.0.0.1&#039;<\/span><span class=\"token punctuation\">,<\/span> port<span class=\"token operator\">&#061;<\/span><span class=\"token number\">60808<\/span><span class=\"token punctuation\">,<\/span> run_app<span class=\"token operator\">&#061;<\/span><span class=\"token boolean\">True<\/span><span class=\"token punctuation\">,<\/span><br \/>\n                 ckpt_dir<span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#039;.\/checkpoint&#039;<\/span><span class=\"token punctuation\">,<\/span> device<span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#039;cuda:0&#039;<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token operator\">&gt;<\/span> <span class=\"token boolean\">None<\/span><span class=\"token punctuation\">:<\/span><br \/>\n        self<span class=\"token punctuation\">.<\/span>client <span class=\"token operator\">&#061;<\/span> OmniInference<span class=\"token punctuation\">(<\/span>ckpt_dir<span class=\"token punctuation\">,<\/span> device<span class=\"token punctuation\">)<\/span><br \/>\n        self<span class=\"token punctuation\">.<\/span>client<span class=\"token punctuation\">.<\/span>warm_up<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        server <span class=\"token operator\">&#061;<\/span> Flask<span class=\"token punctuation\">(<\/span>__name__<span class=\"token punctuation\">)<\/span><br \/>\n        server<span class=\"token punctuation\">.<\/span>route<span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;\/chat&#034;<\/span><span class=\"token punctuation\">,<\/span> methods<span class=\"token operator\">&#061;<\/span><span class=\"token punctuation\">[<\/span><span class=\"token string\">&#034;POST&#034;<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">(<\/span>self<span class=\"token punctuation\">.<\/span>chat<span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token keyword\">if<\/span> run_app<span class=\"token punctuation\">:<\/span><br \/>\n            server<span class=\"token punctuation\">.<\/span>run<span class=\"token punctuation\">(<\/span>host<span class=\"token operator\">&#061;<\/span>ip<span class=\"token punctuation\">,<\/span> port<span class=\"token operator\">&#061;<\/span>port<span class=\"token punctuation\">,<\/span> threaded<span class=\"token operator\">&#061;<\/span><span class=\"token boolean\">False<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token keyword\">else<\/span><span class=\"token punctuation\">:<\/span><br \/>\n            self<span class=\"token punctuation\">.<\/span>server <span class=\"token operator\">&#061;<\/span> server<\/p>\n<p>    <span class=\"token keyword\">def<\/span> <span class=\"token function\">chat<\/span><span class=\"token punctuation\">(<\/span>self<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token operator\">&gt;<\/span> Response<span class=\"token punctuation\">:<\/span><br \/>\n        req_data <span class=\"token operator\">&#061;<\/span> flask<span class=\"token punctuation\">.<\/span>request<span class=\"token punctuation\">.<\/span>get_json<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token keyword\">try<\/span><span class=\"token punctuation\">:<\/span><br \/>\n            data_buf <span class=\"token operator\">&#061;<\/span> req_data<span class=\"token punctuation\">[<\/span><span class=\"token string\">&#034;audio&#034;<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">.<\/span>encode<span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;utf-8&#034;<\/span><span class=\"token punctuation\">)<\/span><br \/>\n            data_buf <span class=\"token operator\">&#061;<\/span> base64<span class=\"token punctuation\">.<\/span>b64decode<span class=\"token punctuation\">(<\/span>data_buf<span class=\"token punctuation\">)<\/span><br \/>\n            stream_stride <span class=\"token operator\">&#061;<\/span> req_data<span class=\"token punctuation\">.<\/span>get<span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;stream_stride&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">4<\/span><span class=\"token punctuation\">)<\/span><br \/>\n            max_tokens <span class=\"token operator\">&#061;<\/span> req_data<span class=\"token punctuation\">.<\/span>get<span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;max_tokens&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">2048<\/span><span class=\"token punctuation\">)<\/span><br \/>\n            <span class=\"token keyword\">with<\/span> tempfile<span class=\"token punctuation\">.<\/span>NamedTemporaryFile<span class=\"token punctuation\">(<\/span>suffix<span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;.wav&#034;<\/span><span class=\"token punctuation\">,<\/span> delete<span class=\"token operator\">&#061;<\/span><span class=\"token boolean\">False<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">as<\/span> f<span class=\"token punctuation\">:<\/span><br \/>\n                f<span class=\"token punctuation\">.<\/span>write<span class=\"token punctuation\">(<\/span>data_buf<span class=\"token punctuation\">)<\/span><br \/>\n                audio_generator <span class=\"token operator\">&#061;<\/span> self<span class=\"token punctuation\">.<\/span>client<span class=\"token punctuation\">.<\/span>run_AT_batch_stream<span class=\"token punctuation\">(<\/span>f<span class=\"token punctuation\">.<\/span>name<span class=\"token punctuation\">,<\/span> stream_stride<span class=\"token punctuation\">,<\/span> max_tokens<span class=\"token punctuation\">)<\/span><br \/>\n                <span class=\"token keyword\">return<\/span> Response<span class=\"token punctuation\">(<\/span>stream_with_context<span class=\"token punctuation\">(<\/span>audio_generator<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span> mimetype<span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;audio\/wav&#034;<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token keyword\">except<\/span> Exception <span class=\"token keyword\">as<\/span> e<span class=\"token punctuation\">:<\/span><br \/>\n            <span class=\"token keyword\">print<\/span><span class=\"token punctuation\">(<\/span>traceback<span class=\"token punctuation\">.<\/span>format_exc<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><\/p>\n<p><span class=\"token keyword\">def<\/span> <span class=\"token function\">server_app<\/span><span class=\"token punctuation\">(<\/span>ip<span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#039;127.0.0.1&#039;<\/span><span class=\"token punctuation\">,<\/span> port<span class=\"token operator\">&#061;<\/span><span class=\"token number\">60808<\/span><span class=\"token punctuation\">,<\/span> device<span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#039;cuda:0&#039;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    OmniChatServer<span class=\"token punctuation\">(<\/span>ip<span class=\"token punctuation\">,<\/span> port<span class=\"token operator\">&#061;<\/span>port<span class=\"token punctuation\">,<\/span> run_app<span class=\"token operator\">&#061;<\/span><span class=\"token boolean\">True<\/span><span class=\"token punctuation\">,<\/span> device<span class=\"token operator\">&#061;<\/span>device<span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token keyword\">if<\/span> __name__ <span class=\"token operator\">&#061;&#061;<\/span> <span class=\"token string\">&#034;__main__&#034;<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    <span class=\"token keyword\">import<\/span> fire<br \/>\n    fire<span class=\"token punctuation\">.<\/span>Fire<span class=\"token punctuation\">(<\/span>server_app<span class=\"token punctuation\">)<\/span><\/p>\n<p>\u8fd9\u6bb5\u4ee3\u7801\u5b9e\u73b0\u4e86\u4e00\u4e2a\u57fa\u4e8eFlask\u7684\u53ef\u72ec\u7acb\u8fd0\u884c\u7684\u97f3\u9891\u804a\u5929\u670d\u52a1\u5668&#xff0c;\u80fd\u591f\u63a5\u6536\u97f3\u9891\u8f93\u5165\u5e76\u6d41\u5f0f\u8fd4\u56de\u5904\u7406\u7ed3\u679c&#xff0c;\u4e3b\u8981\u529f\u80fd\u5305\u62ec&#xff1a;<\/p>\n<ul>\n<li>\u6a21\u578b\u52a0\u8f7d\u4e0e\u9884\u70ed\u200c&#xff1a;\u96c6\u6210OmniInference\u7c7b\u6765\u52a0\u8f7d\u4f4d\u4e8e.\/checkpoint\u76ee\u5f55\u4e0b\u7684\u6a21\u578b&#xff08;\u82e5\u6a21\u578b\u4e0d\u5b58\u5728\u5219\u4eceHugging Face Hub\u4e0b\u8f7d&#xff09;&#xff0c;\u5e76\u8c03\u7528warm_up()\u65b9\u6cd5\u8fdb\u884c\u9884\u70ed&#xff0c;\u4ee5\u63d0\u5347\u9996\u6b21\u63a8\u7406\u901f\u5ea6\u3002<\/li>\n<li>Web\u670d\u52a1\u5668\u521d\u59cb\u5316\u200c&#xff1a;\u4f7f\u7528Flask\u6846\u67b6\u521b\u5efaWeb\u670d\u52a1\u5668&#xff0c;\u5e76\u63d0\u4f9b\u8def\u7531\u4e3a\/chat\u7684POST\u63a5\u53e3&#xff0c;\u6b64\u8def\u7531\u4f1a\u8c03\u7528chat\u51fd\u6570&#xff1b;\u7136\u540e\u6839\u636erun_app\u5224\u65ad\u662f\u5426\u542f\u52a8\u670d\u52a1\u5668\u6765\u76d1\u542c\u6307\u5b9aIP\u548c\u7aef\u53e3&#xff08;\u9ed8\u8ba4127.0.0.1:60808&#xff09;\u3002<\/li>\n<li>\u5904\u7406\u8bf7\u6c42\u97f3\u9891\u6570\u636e&#xff1a;chat\u51fd\u6570\u4eceRequest\u4e2d\u63a5\u6536\u97f3\u9891\u6570\u636e\u5e76\u4f7f\u7528Base64\u683c\u5f0f\u89e3\u7801&#xff0c;\u4ece\u800c\u83b7\u53d6\u97f3\u9891\u6570\u636e\u7684\u6d41\u6b65\u957f&#xff08;stream_stride&#xff09;\u548c\u6700\u5927\u751f\u6210\u4ee4\u724c\u6570&#xff08;max_tokens&#xff09;&#xff1b;\u7136\u540e\u5c06\u97f3\u9891\u6570\u636e\u4fdd\u5b58\u4e3a\u4e34\u65f6WAV\u6587\u4ef6\u3002<\/li>\n<li>\u751f\u6210\u97f3\u9891\u5e76\u8f6c\u6587\u672c\u5904\u7406&#xff1a;\u8c03\u7528OmniInference\u7684run_AT_batch_stream\u65b9\u6cd5\u751f\u6210\u8bed\u97f3\u56de\u590d&#xff0c;\u7136\u540e\u8c03\u7528stream_with_context\u8fdb\u884c\u6d41\u5f0f\u97f3\u9891\u8f6c\u6587\u672c\u5904\u7406&#xff08;ASR&#xff09;&#xff0c;\u5e76\u4ee5\u6d41\u5f0f\u65b9\u5f0f\u8fd4\u56de\u751f\u6210\u7684\u97f3\u9891\u54cd\u5e94&#xff08;audio\/wav\u683c\u5f0f&#xff09;\u548c\u6587\u672c\u3002\u5173\u4e8eOmniInference\u5b9e\u73b0&#xff0c;\u8bf7\u53c2\u8003\u6587\u4ef6inference.py\u4e2d\u6e90\u7801\u3002<\/li>\n<li>\u9519\u8bef\u5904\u7406&#xff1a;\u901a\u8fc7traceback.format_exc()\u6355\u83b7\u5e76\u6253\u5370\u5f02\u5e38\u5806\u6808\u4fe1\u606f\u3002<\/li>\n<li>\u90e8\u7f72\u4e0e\u542f\u52a8\u65b9\u5f0f&#xff1a;\u652f\u6301\u901a\u8fc7\u51fd\u6570server_app\u7075\u6d3b\u914d\u7f6e\u53c2\u6570&#xff08;\u5982IP\u3001\u7aef\u53e3\u3001\u8bbe\u5907&#xff09;\u540e\u542f\u52a8&#xff0c;\u6216\u4f7f\u7528fire\u5e93\u5b9e\u73b0\u547d\u4ee4\u884c\u542f\u52a8&#xff08;\u5982python script.py server_app&#xff09;\u3002<\/li>\n<\/ul>\n<p>\u5728\u672c\u5730\u90e8\u7f72\u804a\u5929\u670d\u52a1\u5668&#xff0c;\u5982\u4ee3\u780110-4\u6240\u793a&#xff1a;<\/p>\n<p> \u4ee3\u780110-4<\/p>\n<p><span class=\"token comment\"># app.py<\/span><br \/>\n<span class=\"token keyword\">from<\/span> huggingface_hub <span class=\"token keyword\">import<\/span> snapshot_download<br \/>\n<span class=\"token keyword\">from<\/span> threading <span class=\"token keyword\">import<\/span> Thread<br \/>\n<span class=\"token keyword\">from<\/span> server <span class=\"token keyword\">import<\/span> server_app<\/p>\n<p>repo_id <span class=\"token operator\">&#061;<\/span> <span class=\"token string\">&#034;gpt-omni\/mini-omni&#034;<\/span><br \/>\nsnapshot_download<span class=\"token punctuation\">(<\/span>repo_id<span class=\"token punctuation\">,<\/span> local_dir<span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;.\/checkpoint&#034;<\/span><span class=\"token punctuation\">,<\/span> revision<span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;main&#034;<\/span><span class=\"token punctuation\">)<\/span><br \/>\ndevice <span class=\"token operator\">&#061;<\/span> <span class=\"token string\">&#034;cuda:0&#034;<\/span> <span class=\"token keyword\">if<\/span> torch<span class=\"token punctuation\">.<\/span>cuda<span class=\"token punctuation\">.<\/span>is_available<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">else<\/span> <span class=\"token string\">&#034;cpu&#034;<\/span><br \/>\n<span class=\"token keyword\">print<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string-interpolation\"><span class=\"token string\">f&#034;Using device: <\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>device<span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\">&#034;<\/span><\/span><span class=\"token punctuation\">)<\/span><br \/>\nthread <span class=\"token operator\">&#061;<\/span> Thread<span class=\"token punctuation\">(<\/span>target<span class=\"token operator\">&#061;<\/span>server_app<span class=\"token punctuation\">,<\/span> daemon<span class=\"token operator\">&#061;<\/span><span class=\"token boolean\">True<\/span><span class=\"token punctuation\">,<\/span> args<span class=\"token operator\">&#061;<\/span><span class=\"token punctuation\">(<\/span>IP<span class=\"token punctuation\">,<\/span> PORT<span class=\"token punctuation\">,<\/span> device<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><br \/>\nthread<span class=\"token punctuation\">.<\/span>start<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><\/p>\n<p>\u5728\u672c\u5730\u90e8\u7f72\u4e4b\u524d&#xff0c;\u9700\u8981\u901a\u8fc7\u51fd\u6570snapshot_download\u4eceHugging Face Hub\u4e0b\u8f7dmini-omni\u5927\u6a21\u578b&#xff0c;\u5e76\u4fdd\u5b58\u5728local_dir\u76ee\u5f55&#xff0c;\u670d\u52a1\u5668server_app\u542f\u52a8\u65f6\u4f1a\u81ea\u52a8\u52a0\u8f7d\u76ee\u5f55.\/checkpoint\u4e2d\u7684\u5927\u6a21\u578b&#xff1b;\u7136\u540e\u4f7f\u7528\u7ebf\u7a0b\u542f\u52a8\u6a21\u578b&#xff0c;\u8bbe\u7f6e\u7ebf\u7a0b\u7684daemon&#061;True\u610f\u5473\u7740\u8be5\u7ebf\u7a0b\u662f\u5b88\u62a4\u7ebf\u7a0b&#xff0c;\u8868\u793a\u7a0b\u5e8f\u7684\u7ec8\u6b62\u65b9\u5f0f&#xff0c;\u5373\u5f53\u804a\u5929\u754c\u9762\u7684\u4e3b\u7a0b\u5e8f\u7ec8\u6b62\u65f6&#xff0c;\u4f1a\u540c\u65f6\u7ed3\u675f\u670d\u52a1\u5668\u8fdb\u7a0b\u3002\u5b88\u62a4\u7ebf\u7a0b\u7684\u4e3b\u8981\u7279\u6027\u662f&#xff1a;\u4e3b\u7a0b\u5e8f\u5728\u9000\u51fa\u65f6&#xff0c;\u4e0d\u4f1a\u7b49\u5f85\u5b88\u62a4\u7ebf\u7a0b\u8fd0\u884c\u5b8c\u6210\u540e\u624d\u9000\u51fa&#xff0c;\u800c\u662f\u76f4\u63a5\u9000\u51fa\u8fd0\u884c\u73af\u5883&#xff0c;\u4f7f\u5f97\u5b88\u62a4\u7ebf\u7a0b\u4e5f\u4f1a\u968f\u4e4b\u7ed3\u675f\u3002<\/p>\n<h5>2. \u5e94\u7528\u72b6\u6001\u3001\u62fc\u63a5\u97f3\u9891\u4e0e\u68c0\u6d4b\u505c\u987f<\/h5>\n<p>\u73b0\u5728\u9010\u6b65\u5b9e\u73b0\u5ba2\u6237\u7aef\u7684\u804a\u5929\u673a\u5668\u4eba\u5e94\u7528\u3002\u672c\u5c0f\u8282\u5185\u5bb9\u5305\u62ec\u5e94\u7528\u72b6\u6001\u3001\u5b58\u50a8\u97f3\u9891\u4e0e\u68c0\u6d4b\u505c\u987f&#xff1a;\u5728\u6bcf\u4e2a\u65b0\u97f3\u9891\u7247\u6bb5\u5230\u8fbe\u65f6&#xff0c;\u5ba2\u6237\u7aef\u9996\u5148\u62fc\u63a5\u5e76\u5b58\u50a8\u97f3\u9891&#xff0c;\u7136\u540e\u5224\u65ad\u7528\u6237\u662f\u5426\u5df2\u505c\u6b62\u8bf4\u8bdd\u4ee5\u5224\u65ad\u662f\u5426\u7ee7\u7eed\u5f55\u97f3\u3002 \u5e94\u7528\u72b6\u6001\u7c7b&#xff1a;AppState\u3002\u9996\u5148&#xff0c;\u4f7f\u7528AppState\u7c7b\u6765\u8fdb\u884c\u97f3\u9891\u5904\u7406\u548c\u8bb0\u5f55\u5bf9\u8bdd\u72b6\u6001&#xff0c;\u5982\u4ee3\u780110-5\u6240\u793a&#xff1a; \u4ee3\u780110-5<\/p>\n<p><span class=\"token keyword\">from<\/span> dataclasses <span class=\"token keyword\">import<\/span> dataclass<span class=\"token punctuation\">,<\/span> field<br \/>\n<span class=\"token decorator annotation punctuation\">&#064;dataclass<\/span><br \/>\n<span class=\"token keyword\">class<\/span> <span class=\"token class-name\">AppState<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    stream<span class=\"token punctuation\">:<\/span> np<span class=\"token punctuation\">.<\/span>ndarray <span class=\"token operator\">|<\/span> <span class=\"token boolean\">None<\/span> <span class=\"token operator\">&#061;<\/span> <span class=\"token boolean\">None<\/span><br \/>\n    sampling_rate<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">int<\/span> <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><br \/>\n    pause_detected<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">bool<\/span> <span class=\"token operator\">&#061;<\/span> <span class=\"token boolean\">False<\/span><br \/>\n    started_talking<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">bool<\/span> <span class=\"token operator\">&#061;<\/span>  <span class=\"token boolean\">False<\/span><br \/>\n    stopped<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">bool<\/span> <span class=\"token operator\">&#061;<\/span> <span class=\"token boolean\">False<\/span><br \/>\n    conversation<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">list<\/span> <span class=\"token operator\">&#061;<\/span> field<span class=\"token punctuation\">(<\/span>default_factory<span class=\"token operator\">&#061;<\/span><span class=\"token builtin\">list<\/span><span class=\"token punctuation\">)<\/span><\/p>\n<p>AppState\u7c7b\u4e3b\u8981\u5c5e\u6027\u5305\u62ec&#xff1a;<\/p>\n<ul>\n<li>\u97f3\u9891\u6d41\u7ba1\u7406\u200c&#xff1a;stream\u5b58\u50a8\u5f53\u524d\u97f3\u9891\u6570\u636e\u7247\u6bb5&#xff0c;sampling_rate\u8bb0\u5f55\u91c7\u6837\u7387\u3002<\/li>\n<li>\u6682\u505c\u68c0\u6d4b\u200c&#xff1a;pause_detected\u6807\u8bc6\u662f\u5426\u68c0\u6d4b\u5230\u9759\u9ed8\u95f4\u9694\u3002<\/li>\n<li>\u5bf9\u8bdd\u72b6\u6001\u200c&#xff1a;started_talking\u6807\u8bc6\u662f\u5426\u5f00\u59cb\u8bf4\u8bdd&#xff0c;stopped\u6807\u8bc6\u662f\u5426\u7ed3\u675f\u5f55\u97f3\u3002<\/li>\n<li>\u5bf9\u8bdd\u5386\u53f2\u200c&#xff1a;conversation\u8bb0\u5f55\u5b8c\u6574\u7684\u5bf9\u8bdd\u8bb0\u5f55&#xff08;\u5217\u8868\u7c7b\u578b&#xff09;\u3002\u521d\u59cb\u5316\u7a7a\u5217\u8868\u4f7f\u7528field(default_factory&#061;list)&#xff0c;\u786e\u4fdd\u6bcf\u6b21\u5b9e\u4f8b\u5316\u65f6\u521b\u5efa\u72ec\u7acb\u7684\u5217\u8868\u5bf9\u8c61\u3002<\/li>\n<\/ul>\n<p>\u62fc\u63a5\u5e76\u5b58\u50a8\u97f3\u9891\u3002\u5b9a\u4e49\u5904\u7406\u7528\u6237\u97f3\u9891\u7684process_audio\u51fd\u6570&#xff0c;\u5982\u4ee3\u780110-6\u6240\u793a&#xff1a;<\/p>\n<p> \u4ee3\u780110-6<\/p>\n<p><span class=\"token keyword\">import<\/span> numpy <span class=\"token keyword\">as<\/span> np<br \/>\n<span class=\"token keyword\">from<\/span> utils <span class=\"token keyword\">import<\/span> determine_pause<br \/>\n<span class=\"token keyword\">def<\/span> <span class=\"token function\">process_audio<\/span><span class=\"token punctuation\">(<\/span>audio<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">tuple<\/span><span class=\"token punctuation\">,<\/span> state<span class=\"token punctuation\">:<\/span> AppState<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    <span class=\"token keyword\">if<\/span> state<span class=\"token punctuation\">.<\/span>stream <span class=\"token keyword\">is<\/span> <span class=\"token boolean\">None<\/span><span class=\"token punctuation\">:<\/span><br \/>\n        state<span class=\"token punctuation\">.<\/span>stream <span class=\"token operator\">&#061;<\/span> audio<span class=\"token punctuation\">[<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">]<\/span><br \/>\n        state<span class=\"token punctuation\">.<\/span>sampling_rate <span class=\"token operator\">&#061;<\/span> audio<span class=\"token punctuation\">[<\/span><span class=\"token number\">0<\/span><span class=\"token punctuation\">]<\/span><br \/>\n    <span class=\"token keyword\">else<\/span><span class=\"token punctuation\">:<\/span><br \/>\n        state<span class=\"token punctuation\">.<\/span>stream <span class=\"token operator\">&#061;<\/span> np<span class=\"token punctuation\">.<\/span>concatenate<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">(<\/span>state<span class=\"token punctuation\">.<\/span>stream<span class=\"token punctuation\">,<\/span> audio<span class=\"token punctuation\">[<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><\/p>\n<p>    pause_detected <span class=\"token operator\">&#061;<\/span> determine_pause<span class=\"token punctuation\">(<\/span>state<span class=\"token punctuation\">.<\/span>stream<span class=\"token punctuation\">,<\/span> state<span class=\"token punctuation\">.<\/span>sampling_rate<span class=\"token punctuation\">,<\/span> state<span class=\"token punctuation\">)<\/span><br \/>\n    state<span class=\"token punctuation\">.<\/span>pause_detected <span class=\"token operator\">&#061;<\/span> pause_detected<br \/>\n    <span class=\"token keyword\">if<\/span> state<span class=\"token punctuation\">.<\/span>pause_detected <span class=\"token keyword\">and<\/span> state<span class=\"token punctuation\">.<\/span>started_talking<span class=\"token punctuation\">:<\/span><br \/>\n        <span class=\"token keyword\">return<\/span> gr<span class=\"token punctuation\">.<\/span>Audio<span class=\"token punctuation\">(<\/span>recording<span class=\"token operator\">&#061;<\/span><span class=\"token boolean\">False<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span> state<br \/>\n    <span class=\"token keyword\">return<\/span> <span class=\"token boolean\">None<\/span><span class=\"token punctuation\">,<\/span> state<\/p>\n<p>\u8be5\u51fd\u6570\u63a5\u6536\u4e24\u4e2a\u8f93\u5165\u53c2\u6570&#xff1a;\u5f53\u524d\u8f93\u5165\u97f3\u9891\u7247\u6bb5&#xff08;\u7531\u91c7\u6837\u7387sampling_rate\u548c\u97f3\u9891\u6d41numpy\u6570\u7ec4\u7ec4\u6210\u7684\u5143\u7ec4&#xff09;\u548c\u5f53\u524d\u5e94\u7528\u72b6\u6001\u3002\u5b83\u4f1a\u5c06\u65b0\u97f3\u9891\u7247\u6bb5\u4e0e\u73b0\u6709\u97f3\u9891\u6d41\u62fc\u63a5&#xff0c;\u5e76\u8c03\u7528determine_pause\u51fd\u6570\u68c0\u6d4b\u5f53\u524d\u6d41\u4e2d\u7684\u9759\u9ed8\u95f4\u9694\u3002\u5982\u679c\u68c0\u6d4b\u5230\u9759\u9ed8\u4e14state.started_talking\u4e3aTrue&#xff0c;\u5373\u5f00\u542f\u5f55\u97f3\u4f46\u65e0\u8bed\u97f3\u65f6&#xff0c;\u8fd4\u56degr.Audio(recording&#061;False)\u505c\u6b62\u5f55\u97f3&#xff1b;\u5426\u5219&#xff0c;\u8fd4\u56deNone\u7ee7\u7eed\u5f55\u97f3\u3002<\/p>\n<p>\u68c0\u6d4b\u505c\u987f\u3002omni-mini\u9879\u76ee\u7279\u6709determine_pause\u51fd\u6570&#xff0c;\u5982\u4ee3\u780110-7\u6240\u793a&#xff1a; \u4ee3\u780110-7<\/p>\n<p><span class=\"token keyword\">def<\/span> <span class=\"token function\">determine_pause<\/span><span class=\"token punctuation\">(<\/span>audio<span class=\"token punctuation\">:<\/span> np<span class=\"token punctuation\">.<\/span>ndarray<span class=\"token punctuation\">,<\/span> sampling_rate<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">int<\/span><span class=\"token punctuation\">,<\/span> state<span class=\"token punctuation\">:<\/span> AppState<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token operator\">&gt;<\/span> <span class=\"token builtin\">bool<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    <span class=\"token triple-quoted-string string\">&#034;&#034;&#034;Take in the stream, determine if a pause happened&#034;&#034;&#034;<\/span><br \/>\n    temp_audio <span class=\"token operator\">&#061;<\/span> audio<br \/>\n    dur_vad<span class=\"token punctuation\">,<\/span> _<span class=\"token punctuation\">,<\/span> time_vad <span class=\"token operator\">&#061;<\/span> run_vad<span class=\"token punctuation\">(<\/span>temp_audio<span class=\"token punctuation\">,<\/span> sampling_rate<span class=\"token punctuation\">)<\/span><br \/>\n    duration <span class=\"token operator\">&#061;<\/span> <span class=\"token builtin\">len<\/span><span class=\"token punctuation\">(<\/span>audio<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">\/<\/span> sampling_rate<\/p>\n<p>    <span class=\"token keyword\">if<\/span> dur_vad <span class=\"token operator\">&gt;<\/span> <span class=\"token number\">0.5<\/span> <span class=\"token keyword\">and<\/span> <span class=\"token keyword\">not<\/span> state<span class=\"token punctuation\">.<\/span>started_talking<span class=\"token punctuation\">:<\/span><br \/>\n        <span class=\"token keyword\">print<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;started talking&#034;<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        state<span class=\"token punctuation\">.<\/span>started_talking <span class=\"token operator\">&#061;<\/span> <span class=\"token boolean\">True<\/span><br \/>\n        <span class=\"token keyword\">return<\/span> <span class=\"token boolean\">False<\/span><br \/>\n    <span class=\"token keyword\">print<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string-interpolation\"><span class=\"token string\">f&#034;duration_after_vad: <\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>dur_vad<span class=\"token punctuation\">:<\/span><span class=\"token format-spec\">.3f<\/span><span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\"> s, time_vad: <\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>time_vad<span class=\"token punctuation\">:<\/span><span class=\"token format-spec\">.3f<\/span><span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\"> s&#034;<\/span><\/span><span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token keyword\">return<\/span> <span class=\"token punctuation\">(<\/span>duration <span class=\"token operator\">&#8211;<\/span> dur_vad<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&gt;<\/span> <span class=\"token number\">0.8<\/span><\/p>\n<p>\u8be5\u51fd\u6570\u5b9e\u73b0\u97f3\u9891\u6d41\u4e2d\u7684\u9759\u9ed8\u68c0\u6d4b&#xff0c;\u6838\u5fc3\u529f\u80fd\u5305\u62ec&#xff1a;<\/p>\n<ul>\n<li>VAD\u5904\u7406\u200c&#xff1a;\u8c03\u7528run_vad\u51fd\u6570\u68c0\u6d4b\u97f3\u9891\u4e2d\u7684\u8bed\u97f3\u6d3b\u52a8&#xff08;VAD&#xff09;\u65f6\u957f\u548c\u65f6\u95f4\u6233\u3002<\/li>\n<li>\u72b6\u6001\u66f4\u65b0\u200c&#xff1a;\u6839\u636eVAD\u65f6\u957f\u66f4\u65b0\u8bf4\u8bdd\u72b6\u6001&#xff08;started_talking&#xff09;\u3002<\/li>\n<li>\u9759\u9ed8\u5224\u65ad\u200c&#xff1a;\u5f53VAD\u65f6\u957f\u5927\u4e8e0.5\u79d2\u4e14started_talking\u4e3aFalse\u65f6&#xff0c;\u6ca1\u6709\u53d1\u751f\u9759\u9ed8&#xff1b;\u5982\u679cVAD\u65f6\u957f\u4e0e\u603b\u65f6\u957f\u7684\u5dee\u503c\u5927\u4e8e1\u79d2&#xff0c;\u5219\u53d1\u751f\u9759\u9ed8\u3002<\/li>\n<li>\u9608\u503c\u8bbe\u7f6e\u200c&#xff1a;VAD\u65f6\u957f\u9608\u503c\u4e3a0.5\u79d2&#xff0c;\u9759\u9ed8\u65f6\u957f\u9608\u503c\u4e3a1\u79d2&#xff0c;\u53ef\u6839\u636e\u9700\u6c42\u8c03\u6574\u3002<\/li>\n<\/ul>\n<h5>3. \u6d41\u5f0f\u4f20\u8f93\u54cd\u5e94\u97f3\u9891<\/h5>\n<p>\u5b58\u50a8\u7528\u6237\u97f3\u9891\u540e&#xff0c;\u9700\u8981\u6839\u636e\u97f3\u9891\u6570\u636e\u751f\u6210\u804a\u5929\u673a\u5668\u4eba\u7684\u54cd\u5e94\u5e76\u6d41\u5f0f\u4f20\u8f93\u3002 \u751f\u6210\u56de\u590d\u8bed\u97f3\u3002speaking\u51fd\u6570\u4e5fomni-mini\u9879\u76ee\u7279\u6709&#xff0c;\u5982\u4ee3\u780110-8\u6240\u793a&#xff1a;<\/p>\n<p> \u4ee3\u780110-8<\/p>\n<p><span class=\"token keyword\">import<\/span> requests<br \/>\nIP <span class=\"token operator\">&#061;<\/span> <span class=\"token string\">&#034;0.0.0.0&#034;<\/span><br \/>\nPORT <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">60808<\/span><br \/>\nAPI_URL <span class=\"token operator\">&#061;<\/span> <span class=\"token string-interpolation\"><span class=\"token string\">f&#034;http:\/\/<\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>IP<span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\">:<\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>PORT<span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\">\/chat&#034;<\/span><\/span><br \/>\n<span class=\"token comment\"># playing parameters<\/span><br \/>\nOUT_CHANNELS <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">1<\/span><br \/>\nOUT_RATE <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">24000<\/span><br \/>\nOUT_SAMPLE_WIDTH <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">2<\/span><br \/>\nOUT_CHUNK <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">5760<\/span><\/p>\n<p><span class=\"token keyword\">def<\/span> <span class=\"token function\">speaking<\/span><span class=\"token punctuation\">(<\/span>audio_bytes<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">str<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    base64_encoded <span class=\"token operator\">&#061;<\/span> <span class=\"token builtin\">str<\/span><span class=\"token punctuation\">(<\/span>base64<span class=\"token punctuation\">.<\/span>b64encode<span class=\"token punctuation\">(<\/span>audio_bytes<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span> encoding<span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;utf-8&#034;<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    files <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">{<\/span><span class=\"token string\">&#034;audio&#034;<\/span><span class=\"token punctuation\">:<\/span> base64_encoded<span class=\"token punctuation\">}<\/span><br \/>\n    <span class=\"token keyword\">with<\/span> requests<span class=\"token punctuation\">.<\/span>post<span class=\"token punctuation\">(<\/span>API_URL<span class=\"token punctuation\">,<\/span> json<span class=\"token operator\">&#061;<\/span>files<span class=\"token punctuation\">,<\/span> stream<span class=\"token operator\">&#061;<\/span><span class=\"token boolean\">True<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">as<\/span> response<span class=\"token punctuation\">:<\/span><br \/>\n        <span class=\"token keyword\">try<\/span><span class=\"token punctuation\">:<\/span><br \/>\n            <span class=\"token keyword\">for<\/span> chunk <span class=\"token keyword\">in<\/span> response<span class=\"token punctuation\">.<\/span>iter_content<span class=\"token punctuation\">(<\/span>chunk_size<span class=\"token operator\">&#061;<\/span>OUT_CHUNK<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span><br \/>\n                <span class=\"token keyword\">if<\/span> chunk<span class=\"token punctuation\">:<\/span><br \/>\n                    <span class=\"token comment\"># Create an audio segment from the numpy array<\/span><br \/>\n                    audio_segment <span class=\"token operator\">&#061;<\/span> AudioSegment<span class=\"token punctuation\">(<\/span>chunk<span class=\"token punctuation\">,<\/span><br \/>\n                        frame_rate<span class=\"token operator\">&#061;<\/span>OUT_RATE<span class=\"token punctuation\">,<\/span><br \/>\n                        sample_width<span class=\"token operator\">&#061;<\/span>OUT_SAMPLE_WIDTH<span class=\"token punctuation\">,<\/span><br \/>\n                        channels<span class=\"token operator\">&#061;<\/span>OUT_CHANNELS<span class=\"token punctuation\">)<\/span><\/p>\n<p>                    <span class=\"token comment\"># Export the audio segment to MP3 bytes &#8211; use a high bitrate to maximise quality<\/span><br \/>\n                    mp3_io <span class=\"token operator\">&#061;<\/span> io<span class=\"token punctuation\">.<\/span>BytesIO<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n                    audio_segment<span class=\"token punctuation\">.<\/span>export<span class=\"token punctuation\">(<\/span>mp3_io<span class=\"token punctuation\">,<\/span> <span class=\"token builtin\">format<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;mp3&#034;<\/span><span class=\"token punctuation\">,<\/span> bitrate<span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;320k&#034;<\/span><span class=\"token punctuation\">)<\/span><br \/>\n                    <span class=\"token comment\"># Get the MP3 bytes<\/span><br \/>\n                    mp3_bytes <span class=\"token operator\">&#061;<\/span> mp3_io<span class=\"token punctuation\">.<\/span>getvalue<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n                    mp3_io<span class=\"token punctuation\">.<\/span>close<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n                    <span class=\"token keyword\">yield<\/span> mp3_bytes<br \/>\n        <span class=\"token keyword\">except<\/span> Exception <span class=\"token keyword\">as<\/span> e<span class=\"token punctuation\">:<\/span><br \/>\n            <span class=\"token keyword\">raise<\/span> gr<span class=\"token punctuation\">.<\/span>Error<span class=\"token punctuation\">(<\/span><span class=\"token string-interpolation\"><span class=\"token string\">f&#034;Error during audio streaming: <\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>e<span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\">&#034;<\/span><\/span><span class=\"token punctuation\">)<\/span><\/p>\n<p>\u901a\u8fc7\u4e0a\u8ff0\u673a\u5236&#xff0c;\u51fd\u6570\u53ef\u5b9e\u73b0\u9ad8\u6548\u3001\u5b9e\u65f6\u7684\u97f3\u9891\u683c\u5f0f\u8f6c\u6362\u4e0e\u6d41\u5f0f\u5904\u7406&#xff0c;\u652f\u6301\u9ad8\u97f3\u8d28\u97f3\u9891\u4f20\u8f93&#xff0c;\u6838\u5fc3\u529f\u80fd\u5305\u62ec&#xff1a;<\/p>\n<ul>\n<li>Base64\u7f16\u7801\u200c&#xff1a;\u4f7f\u7528utf-8\u683c\u5f0f\u5c06\u539f\u59cb\u97f3\u9891\u5b57\u8282\u7f16\u7801\u4e3aBase64\u5b57\u7b26\u4e32&#xff0c;\u4ee5\u4fbf\u9002\u914dAPI\u4f20\u8f93\u683c\u5f0f&#xff1b;\u7136\u540e\u5c06\u200cBase64\u5b57\u7b26\u4e32\u8f6c\u4e3aJSON\u683c\u5f0f\u3002<\/li>\n<li>POST\u8bf7\u6c42\u200c&#xff1a;\u5c06\u97f3\u9891\u6570\u636e\u901a\u8fc7requests.post()\u53d1\u9001\u5230API_URL&#xff0c;\u540c\u65f6\u542f\u7528\u6d41\u5f0f\u54cd\u5e94&#xff08;stream&#061;True&#xff09;&#xff1b;\u7136\u540e\u901a\u8fc7iter_content\u6309OUT_CHUNK\u5927\u5c0f\u5206\u6bb5\u8bfb\u53d6API\u54cd\u5e94\u6570\u636e&#xff0c;\u907f\u514d\u4e00\u6b21\u6027\u52a0\u8f7d\u5927\u6587\u4ef6\u800c\u5bfc\u81f4\u5185\u5b58\u6ea2\u51fa\u3002<\/li>\n<li>\u97f3\u9891\u683c\u5f0f\u8f6c\u6362\u200c&#xff1a;\u5148\u5c06\u4e8c\u8fdb\u5236\u5757\u8f6c\u6362\u4e3apydub.AudioSegment\u5bf9\u8c61&#xff1b;\u7136\u540e\u7531io.BytesIO()\u521b\u5efa\u5185\u5b58\u5b57\u8282\u6d41&#xff0c;\u7528\u4e8e\u5728\u5185\u5b58\u4e2d\u5904\u7406\u4e8c\u8fdb\u5236\u6570\u636e\u6d41&#xff08;\u53e6\u6709io.StringIO\u5904\u7406\u5b57\u7b26\u4e32\u6d41&#xff09;&#xff1b;\u6700\u540e\u5c06\u97f3\u9891\u6570\u636e\u5b9e\u65f6\u5bfc\u51fa\u4e3a\u7684MP3\u683c\u5f0f&#xff0c;\u786e\u4fdd\u9ad8\u97f3\u8d28\u3002<\/li>\n<li>\u751f\u6210\u5668\u8f93\u51fa\u200c&#xff1a;\u901a\u8fc7yield\u9010\u5757\u8fd4\u56deMP3\u5b57\u8282\u6570\u636e&#xff0c;\u4ee5\u652f\u6301\u5b9e\u65f6\u97f3\u9891\u6d41\u5f0f\u4f20\u8f93\u3002<\/li>\n<\/ul>\n<p>\u62fc\u63a5\u53cc\u65b9\u5bf9\u8bdd\u97f3\u9891\u3002speaking\u751f\u6210\u8bed\u97f3\u540e&#xff0c;\u7531response\u51fd\u6570\u5b9e\u73b0\u97f3\u9891\u683c\u5f0f\u8f6c\u6362\u3001\u8bed\u97f3\u5408\u6210\u548c\u62fc\u63a5\u5bf9\u8bdd\u529f\u80fd&#xff0c;\u5982\u4ee3\u780110-9\u6240\u793a&#xff1a; \u4ee3\u780110-9<\/p>\n<p><span class=\"token keyword\">import<\/span> io<br \/>\n<span class=\"token keyword\">import<\/span> tempfile<br \/>\n<span class=\"token keyword\">from<\/span> pydub <span class=\"token keyword\">import<\/span> AudioSegment<\/p>\n<p><span class=\"token keyword\">def<\/span> <span class=\"token function\">response<\/span><span class=\"token punctuation\">(<\/span>state<span class=\"token punctuation\">:<\/span> AppState<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    <span class=\"token keyword\">if<\/span> <span class=\"token keyword\">not<\/span> state<span class=\"token punctuation\">.<\/span>pause_detected <span class=\"token keyword\">and<\/span> <span class=\"token keyword\">not<\/span> state<span class=\"token punctuation\">.<\/span>started_talking<span class=\"token punctuation\">:<\/span><br \/>\n        <span class=\"token keyword\">return<\/span> <span class=\"token boolean\">None<\/span><span class=\"token punctuation\">,<\/span> AppState<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    audio_buffer <span class=\"token operator\">&#061;<\/span> io<span class=\"token punctuation\">.<\/span>BytesIO<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    segment <span class=\"token operator\">&#061;<\/span> AudioSegment<span class=\"token punctuation\">(<\/span>state<span class=\"token punctuation\">.<\/span>stream<span class=\"token punctuation\">.<\/span>tobytes<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        frame_rate<span class=\"token operator\">&#061;<\/span>state<span class=\"token punctuation\">.<\/span>sampling_rate<span class=\"token punctuation\">,<\/span><br \/>\n        sample_width<span class=\"token operator\">&#061;<\/span>state<span class=\"token punctuation\">.<\/span>stream<span class=\"token punctuation\">.<\/span>dtype<span class=\"token punctuation\">.<\/span>itemsize<span class=\"token punctuation\">,<\/span><br \/>\n        channels<span class=\"token operator\">&#061;<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">1<\/span> <span class=\"token keyword\">if<\/span> <span class=\"token builtin\">len<\/span><span class=\"token punctuation\">(<\/span>state<span class=\"token punctuation\">.<\/span>stream<span class=\"token punctuation\">.<\/span>shape<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#061;&#061;<\/span> <span class=\"token number\">1<\/span> <span class=\"token keyword\">else<\/span> state<span class=\"token punctuation\">.<\/span>stream<span class=\"token punctuation\">.<\/span>shape<span class=\"token punctuation\">[<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    segment<span class=\"token punctuation\">.<\/span>export<span class=\"token punctuation\">(<\/span>audio_buffer<span class=\"token punctuation\">,<\/span> <span class=\"token builtin\">format<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;wav&#034;<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token keyword\">with<\/span> tempfile<span class=\"token punctuation\">.<\/span>NamedTemporaryFile<span class=\"token punctuation\">(<\/span>suffix<span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;.wav&#034;<\/span><span class=\"token punctuation\">,<\/span> delete<span class=\"token operator\">&#061;<\/span><span class=\"token boolean\">False<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">as<\/span> f<span class=\"token punctuation\">:<\/span><br \/>\n        f<span class=\"token punctuation\">.<\/span>write<span class=\"token punctuation\">(<\/span>audio_buffer<span class=\"token punctuation\">.<\/span>getvalue<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    state<span class=\"token punctuation\">.<\/span>conversation<span class=\"token punctuation\">.<\/span>append<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">{<\/span><span class=\"token string\">&#034;role&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">&#034;user&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token string\">&#034;content&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token punctuation\">{<\/span><span class=\"token string\">&#034;path&#034;<\/span><span class=\"token punctuation\">:<\/span> f<span class=\"token punctuation\">.<\/span>name<span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;mime_type&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">&#034;audio\/wav&#034;<\/span><span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">)<\/span><\/p>\n<p>    output_buffer <span class=\"token operator\">&#061;<\/span> <span class=\"token string\">b&#034;&#034;<\/span><br \/>\n    <span class=\"token keyword\">for<\/span> mp3_bytes <span class=\"token keyword\">in<\/span> speaking<span class=\"token punctuation\">(<\/span>audio_buffer<span class=\"token punctuation\">.<\/span>getvalue<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span><br \/>\n        output_buffer <span class=\"token operator\">&#043;&#061;<\/span> mp3_bytes<br \/>\n        <span class=\"token keyword\">yield<\/span> mp3_bytes<span class=\"token punctuation\">,<\/span> state<br \/>\n    <span class=\"token keyword\">with<\/span> tempfile<span class=\"token punctuation\">.<\/span>NamedTemporaryFile<span class=\"token punctuation\">(<\/span>suffix<span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;.mp3&#034;<\/span><span class=\"token punctuation\">,<\/span> delete<span class=\"token operator\">&#061;<\/span><span class=\"token boolean\">False<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">as<\/span> f<span class=\"token punctuation\">:<\/span><br \/>\n        f<span class=\"token punctuation\">.<\/span>write<span class=\"token punctuation\">(<\/span>output_buffer<span class=\"token punctuation\">)<\/span><br \/>\n    state<span class=\"token punctuation\">.<\/span>conversation<span class=\"token punctuation\">.<\/span>append<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">{<\/span><span class=\"token string\">&#034;role&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">&#034;assistant&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token string\">&#034;content&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token punctuation\">{<\/span><span class=\"token string\">&#034;path&#034;<\/span><span class=\"token punctuation\">:<\/span> f<span class=\"token punctuation\">.<\/span>name<span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;mime_type&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">&#034;audio\/mp3&#034;<\/span><span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token keyword\">yield<\/span> <span class=\"token boolean\">None<\/span><span class=\"token punctuation\">,<\/span> AppState<span class=\"token punctuation\">(<\/span>conversation<span class=\"token operator\">&#061;<\/span>state<span class=\"token punctuation\">.<\/span>conversation<span class=\"token punctuation\">)<\/span><\/p>\n<p>response\u51fd\u6570\u662f\u6574\u4e2a\u9879\u76ee\u7684\u6838\u5fc3&#xff0c;\u5176\u6d41\u7a0b\u5305\u62ec&#xff1a;<\/p>\n<ul>\n<li>\u72b6\u6001\u68c0\u67e5\u200c&#xff1a;\u9a8c\u8bc1\u662f\u5426\u68c0\u6d4b\u5230\u6682\u505c\u6216\u5f00\u59cb\u8bf4\u8bdd\u72b6\u6001&#xff0c;\u68c0\u6d4b\u5230\u65f6\u76f4\u63a5\u8fd4\u56de\u4ee5\u7ee7\u7eed\u5f55\u97f3&#xff0c;\u5426\u5219\u5904\u7406\u7528\u6237\u8f93\u5165\u4fe1\u606f\u3002<\/li>\n<li>\u97f3\u9891\u683c\u5f0f\u8f6c\u6362\u200c&#xff1a;\u5c06\u7528\u6237\u8f93\u5165AppState.stream\u8f6c\u5316\u4e3a\u5b57\u8282\u5e76\u63d2\u5165\u5230\u683c\u5f0fpydub.AudioSegment\u3002pydub.AudioSegment\u652f\u6301\u591a\u79cd\u97f3\u9891\u683c\u5f0f&#xff08;WAV\u3001MP3\u3001FLAC\u7b49&#xff09;&#xff0c;\u81ea\u52a8\u5904\u7406\u91c7\u6837\u7387\u3001\u91c7\u6837\u4f4d\u5bbd\u548c\u58f0\u9053\u6570\u7b49\u4fe1\u606f\u3002\u7136\u540e\u5c06AudioSegment\u4e2d\u7684numpy\u97f3\u9891\u6570\u7ec4\u8f6c\u6362\u4e3aWAV\u683c\u5f0f\u3002<\/li>\n<li>\u4e34\u65f6\u6587\u4ef6\u7ba1\u7406\u200c&#xff1a;\u5229\u7528tempfile\u521b\u5efa\u4e34\u65f6WAV\u97f3\u9891\u6587\u4ef6\u4fdd\u5b58\u7528\u6237\u8f93\u5165&#xff0c;\u521b\u5efa\u4e34\u65f6MP3\u97f3\u9891\u6587\u4ef6\u4fdd\u5b58\u52a9\u7406\u8f93\u51fa&#xff0c;\u8bbe\u7f6edelete&#061;False\u907f\u514d\u81ea\u52a8\u6e05\u7406\u3002<\/li>\n<li>\u6d41\u5f0f\u8bed\u97f3\u5408\u6210\u200c&#xff1a;\u521b\u5efa\u8f93\u51fa\u7f13\u5b58&#xff0c;\u8c03\u7528speaking\u51fd\u6570\u9010\u5757\u751f\u6210MP3\u97f3\u9891\u6570\u636e\u5e76\u6dfb\u52a0\u81f3\u8f93\u51fa\u7f13\u5b58&#xff0c;\u7136\u540e\u901a\u8fc7\u751f\u6210\u5668(yield)\u5b9e\u65f6\u6d41\u5f0f\u8fd4\u56de\u3002<\/li>\n<li>\u5bf9\u8bdd\u5386\u53f2\u8bb0\u5f55\u200c&#xff1a;\u5c06\u8f93\u5165\u53ca\u8f93\u51fa\u7684\u97f3\u9891\u6587\u4ef6\u8def\u5f84\u548cMIME\u7c7b\u578b\u5206\u522b\u6dfb\u52a0\u5230AppState\u5bf9\u8bdd\u72b6\u6001&#xff0c;\u5e76\u901a\u8fc7yield\u8fd4\u56de\u5df2\u4fdd\u5b58\u5bf9\u8bdd\u5386\u53f2\u3002<\/li>\n<\/ul>\n<h5>4. \u7531gr.Blocks\u6784\u5efaGradio\u5e94\u7528<\/h5>\n<p>\u4f7f\u7528Gradio\u7684Blocks API\u6784\u5efa\u7528\u6237\u754c\u9762&#xff0c;\u5b9e\u73b0\u5b8c\u6574\u804a\u5929\u673a\u5668\u4eba\u5e94\u7528&#xff0c;\u5e76\u5b9e\u73b0\u6d41\u7a0b\u8df3\u8f6c&#xff0c;\u5982\u4ee3\u780110-10\u6240\u793a&#xff1a;<\/p>\n<p> \u4ee3\u780110-10<\/p>\n<p><span class=\"token comment\"># app.py<\/span><br \/>\n<span class=\"token keyword\">import<\/span> gradio <span class=\"token keyword\">as<\/span> gr<br \/>\n<span class=\"token keyword\">def<\/span> <span class=\"token function\">restart_recording<\/span><span class=\"token punctuation\">(<\/span>state<span class=\"token punctuation\">:<\/span> AppState<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    <span class=\"token keyword\">if<\/span> <span class=\"token keyword\">not<\/span> state<span class=\"token punctuation\">.<\/span>stopped<span class=\"token punctuation\">:<\/span><br \/>\n        <span class=\"token keyword\">return<\/span> gr<span class=\"token punctuation\">.<\/span>Audio<span class=\"token punctuation\">(<\/span>recording<span class=\"token operator\">&#061;<\/span><span class=\"token boolean\">True<\/span><span class=\"token punctuation\">)<\/span><\/p>\n<p><span class=\"token keyword\">with<\/span> gr<span class=\"token punctuation\">.<\/span>Blocks<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">as<\/span> demo<span class=\"token punctuation\">:<\/span><br \/>\n    <span class=\"token keyword\">with<\/span> gr<span class=\"token punctuation\">.<\/span>Row<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span><br \/>\n        <span class=\"token keyword\">with<\/span> gr<span class=\"token punctuation\">.<\/span>Column<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span><br \/>\n            input_audio <span class=\"token operator\">&#061;<\/span> gr<span class=\"token punctuation\">.<\/span>Audio<span class=\"token punctuation\">(<\/span>label<span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;Input Audio&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n                sources<span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;microphone&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token builtin\">type<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;numpy&#034;<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token keyword\">with<\/span> gr<span class=\"token punctuation\">.<\/span>Column<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span><br \/>\n            chatbot <span class=\"token operator\">&#061;<\/span> gr<span class=\"token punctuation\">.<\/span>Chatbot<span class=\"token punctuation\">(<\/span>label<span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;Conversation&#034;<\/span><span class=\"token punctuation\">)<\/span><br \/>\n            output_audio <span class=\"token operator\">&#061;<\/span> gr<span class=\"token punctuation\">.<\/span>Audio<span class=\"token punctuation\">(<\/span>label<span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;Output Audio&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n                streaming<span class=\"token operator\">&#061;<\/span><span class=\"token boolean\">True<\/span><span class=\"token punctuation\">,<\/span> autoplay<span class=\"token operator\">&#061;<\/span><span class=\"token boolean\">True<\/span><span class=\"token punctuation\">)<\/span><\/p>\n<p>    state <span class=\"token operator\">&#061;<\/span> gr<span class=\"token punctuation\">.<\/span>State<span class=\"token punctuation\">(<\/span>value<span class=\"token operator\">&#061;<\/span>AppState<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    stream <span class=\"token operator\">&#061;<\/span> input_audio<span class=\"token punctuation\">.<\/span>stream<span class=\"token punctuation\">(<\/span>process_audio<span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token punctuation\">[<\/span>input_audio<span class=\"token punctuation\">,<\/span> state<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token punctuation\">[<\/span>input_audio<span class=\"token punctuation\">,<\/span> state<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        stream_every<span class=\"token operator\">&#061;<\/span><span class=\"token number\">0.5<\/span><span class=\"token punctuation\">,<\/span> time_limit<span class=\"token operator\">&#061;<\/span><span class=\"token number\">30<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    respond <span class=\"token operator\">&#061;<\/span> input_audio<span class=\"token punctuation\">.<\/span>stop_recording<span class=\"token punctuation\">(<\/span>response<span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token punctuation\">[<\/span>state<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token punctuation\">[<\/span>output_audio<span class=\"token punctuation\">,<\/span> state<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    respond<span class=\"token punctuation\">.<\/span>then<span class=\"token punctuation\">(<\/span><span class=\"token keyword\">lambda<\/span> s<span class=\"token punctuation\">:<\/span> s<span class=\"token punctuation\">.<\/span>conversation<span class=\"token punctuation\">,<\/span> <span class=\"token punctuation\">[<\/span>state<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token punctuation\">[<\/span>chatbot<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    restart <span class=\"token operator\">&#061;<\/span> output_audio<span class=\"token punctuation\">.<\/span>stop<span class=\"token punctuation\">(<\/span>restart_recording<span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token punctuation\">[<\/span>state<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token punctuation\">[<\/span>input_audio<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">)<\/span><\/p>\n<p>    cancel <span class=\"token operator\">&#061;<\/span> gr<span class=\"token punctuation\">.<\/span>Button<span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;Stop Conversation&#034;<\/span><span class=\"token punctuation\">,<\/span> variant<span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;stop&#034;<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    cancel<span class=\"token punctuation\">.<\/span>click<span class=\"token punctuation\">(<\/span><span class=\"token keyword\">lambda<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token punctuation\">(<\/span>AppState<span class=\"token punctuation\">(<\/span>stopped<span class=\"token operator\">&#061;<\/span><span class=\"token boolean\">True<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        gr<span class=\"token punctuation\">.<\/span>Audio<span class=\"token punctuation\">(<\/span>recording<span class=\"token operator\">&#061;<\/span><span class=\"token boolean\">False<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token boolean\">None<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token punctuation\">[<\/span>state<span class=\"token punctuation\">,<\/span> input_audio<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">,<\/span> cancels<span class=\"token operator\">&#061;<\/span><span class=\"token punctuation\">[<\/span>respond<span class=\"token punctuation\">,<\/span> restart<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token keyword\">if<\/span> __name__ <span class=\"token operator\">&#061;&#061;<\/span> <span class=\"token string\">&#034;__main__&#034;<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    demo<span class=\"token punctuation\">.<\/span>launch<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><\/p>\n<p>\u4ee3\u7801\u5b9e\u73b0\u4e86\u4e00\u4e2a\u57fa\u4e8egr.Blocks\u7684\u8bed\u97f3\u5bf9\u8bdd\u754c\u9762&#xff0c;\u8be6\u7ec6\u8bf4\u660e\u5982\u4e0b&#xff1a;<\/p>\n<ul>\n<li>\u754c\u9762\u5e03\u5c40\u200c&#xff1a;\u4f7f\u7528gr.Blocks\u521b\u5efa\u5de6\u53f3\u4e24\u5217\u5e03\u5c40&#xff0c;\u5de6\u4fa7\u4e3a\u97f3\u9891\u8f93\u5165&#xff08;\u9ea6\u514b\u98ce&#xff09;&#xff0c;\u53f3\u4fa7\u4e3a\u5bf9\u8bdd\u5386\u53f2\u548c\u97f3\u9891\u8f93\u51fa&#xff0c;\u6700\u4e0b\u9762\u662f\u91cd\u7f6e\u6309\u94ae\u3002<\/li>\n<li>\u97f3\u9891\u6d41\u5904\u7406\u200c&#xff1a;\u901a\u8fc7\u4e8b\u4ef6input_audio.stream\u5b9e\u65f6\u5904\u7406\u97f3\u9891\u8f93\u5165&#xff08;\u6bcf0.5\u79d2\u5904\u7406\u4e00\u6b21&#xff0c;\u6700\u957f30\u79d2&#xff09;&#xff0c;\u8c03\u7528process_audio\u51fd\u6570\u8fdb\u884c\u9759\u9ed8\u68c0\u6d4b\u548c\u97f3\u9891\u7d2f\u79ef\u3002<\/li>\n<li>\u5bf9\u8bdd\u54cd\u5e94\u200c&#xff1a;\u7528\u6237\u505c\u6b62\u5f55\u97f3\u65f6\u89e6\u53d1response\u751f\u6210\u8bed\u97f3\u56de\u590d&#xff0c;\u7531output_audio\u64ad\u653e\u3002<\/li>\n<li>\u72b6\u6001\u7ba1\u7406\u200c&#xff1a;\u4f7f\u7528gr.State\u7ef4\u62a4AppState\u5bf9\u8c61&#xff0c;\u8ddf\u8e2a\u5f55\u97f3\u72b6\u6001\u3001\u5bf9\u8bdd\u5386\u53f2\u7b49\u3002\u5728\u6536\u5230\u56de\u590d\u540e\u8c03\u7528\u4e8b\u4ef6then()\u5c06AppState\u4e2d\u7684\u5bf9\u8bdd\u5386\u53f2\u5c55\u73b0\u5728gr.Chatbot\u3002<\/li>\n<li>\u5faa\u73af\u63a7\u5236\u200c&#xff1a;\u5728\u97f3\u9891\u8f93\u51fa\u7ec4\u4ef6\u4e2d\u64ad\u653e\u5b8c\u6210\u540e&#xff0c;\u81ea\u52a8\u8c03\u7528start_recording_user\u91cd\u65b0\u5f00\u59cb\u5f55\u97f3&#xff0c;\u6216\u901a\u8fc7&#034;Stop Conversation&#034;\u6309\u94ae\u624b\u52a8\u505c\u6b62&#xff0c;\u6b64\u65f6\u6e05\u7a7astate\u5e76\u505c\u6b62\u5f55\u97f3&#xff0c;\u540c\u65f6\u53d6\u6d88\u4e8b\u4ef6respond\u548crestart\u3002<\/li>\n<\/ul>\n<h5>5. \u542f\u52a8\u5e94\u7528\u53ca\u6f14\u793a\u6548\u679c<\/h5>\n<p>\u6700\u540e&#xff0c;\u542f\u52a8\u6574\u4e2a\u5e94\u7528\u5e76\u67e5\u770b\u7a0b\u5e8f\u8fd0\u884c\u6548\u679c&#xff0c;\u6b65\u9aa4\u5982\u4e0b&#xff1a;<\/p>\n<ul>\n<li>\u9996\u5148&#xff0c;\u4f7f\u7528\u547d\u4ee4git clone https:\/\/huggingface.co\/spaces\/gradio\/omni-mini\u6216hf download gradio\/omni-mini &#8211;repo-type&#061;space\u4e0b\u8f7d\u6574\u4e2a\u9879\u76ee\u3002<\/li>\n<li>\u7136\u540e&#xff0c;\u66f4\u65b0\u6700\u65b0\u7248\u7684gradio\u5e93&#xff0c;\u5b89\u88c5requests\u3001librosa\u3001flask\u3001lightning\u3001snac\u3001openai-whisper\u3001onnxruntime\u3001tokenizers\u3001ffmpeg\u7b49\u5e93\u3002<\/li>\n<li>\u6700\u540e&#xff0c;\u5728omni-mini\u76ee\u5f55\u4e0b&#xff0c;\u4f7f\u7528\u547d\u4ee4python app.py\u542f\u52a8\u5e94\u7528\u3002\u7531\u4e8e\u7248\u672c\u95ee\u9898&#xff0c;Hugging Face\u7248\u4ee3\u7801\u53ef\u80fd\u4f1a\u62a5\u591a\u4e2a\u9519\u8bef&#xff0c;\u8bf7\u8bfb\u8005\u53c2\u9605\u672c\u4e66\u7ebf\u4e0a\u7684\u4fee\u590d\u4ee3\u7801\u3002<\/li>\n<\/ul>\n<p>\u7ecf\u8fc7\u4e0b\u8f7d\u591a\u4e2a\u6587\u4ef6\u7684\u7b49\u5f85\u540e&#xff0c;\u5982\u51fa\u73b0\u5982\u4e0b\u63d0\u793a&#xff0c;\u8bf4\u660e\u8fd0\u884c\u6210\u529f&#xff1a;<\/p>\n<p><span class=\"token punctuation\">(<\/span>stream-env<span class=\"token punctuation\">)<\/span> PS D:<span class=\"token punctuation\">\\\\<\/span>mcp<span class=\"token punctuation\">\\\\<\/span>omni-mini<span class=\"token operator\">&gt;<\/span> python .<span class=\"token punctuation\">\\\\<\/span>app.py<br \/>\n<span class=\"token punctuation\">..<\/span>.warm up done, time_cost: <span class=\"token number\">0.044<\/span> s<br \/>\n* Running on <span class=\"token builtin class-name\">local<\/span> URL:  http:\/\/127.0.0.1:7860<br \/>\n* To create a public link, <span class=\"token builtin class-name\">set<\/span> <span class=\"token variable\"><span class=\"token variable\">&#096;<\/span><span class=\"token assign-left variable\">share<\/span><span class=\"token operator\">&#061;<\/span>True<span class=\"token variable\">&#096;<\/span><\/span> <span class=\"token keyword\">in<\/span> <span class=\"token variable\"><span class=\"token variable\">&#096;<\/span>launch<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token variable\">&#096;<\/span><\/span><span class=\"token builtin class-name\">.<\/span><\/p>\n<p>using LLAMA MLP adapter <span class=\"token keyword\">for<\/span> ASR feature<span class=\"token punctuation\">..<\/span>.<br \/>\ntext output: Hello<span class=\"token operator\">!<\/span> My name is Omni, and I<span class=\"token string\">&#039;m your friendly voice assistant here to help with your questions and provide advice.<br \/>\n * Serving Flask app &#039;<\/span>server&#039;<br \/>\n * Debug mode: off<br \/>\nWARNING: This is a development server. Do not use it <span class=\"token keyword\">in<\/span> a production deployment. Use a production WSGI server instead.<br \/>\nRunning on http:\/\/127.0.0.1:60808<\/p>\n<p>\u6ce8\u610f&#xff1a;\u5982\u679c\u4f7f\u7528\u6700\u65b0\u7248Python 3.14&#xff0c;\u53ef\u80fd\u4f1a\u62a5\u9519\u201cBecause all versions of onnxruntime have no wheels with a matching Python ABI tag\u2026\u201d&#xff0c;\u6b64\u65f6\u521b\u5efaPython 3.13\u7684\u865a\u62df\u73af\u5883&#xff1a;uv venv &#8211;python 3.13 py313-env\u5e76\u91cd\u65b0\u5b89\u88c5\u5e93\u5373\u53ef\u3002<\/p>\n<p>\u5176Hugging Face Spaces\u5730\u5740\u4e3a&#xff1a;gradio\/omni-mini&#x1f587;\ufe0f\u94fe\u63a510-4&#xff0c;\u4f7f\u7528Mini-Omni\u7684\u6700\u7ec8\u5e94\u7528\u7684\u6f14\u793a\u6548\u679c\u5982\u56fe10-4\u6240\u793a&#xff1a; <img decoding=\"async\" src=\"https:\/\/www.wsisp.com\/helps\/wp-content\/uploads\/2026\/07\/20260726171733-6a66412d5ad9f.png\" alt=\"\u5728\u8fd9\u91cc\u63d2\u5165\u56fe\u7247\u63cf\u8ff0\" \/><\/p>\n<p> \u56fe10-4<\/p>\n<p>\u672c\u8282\u6f14\u793a\u4e86\u5982\u4f55\u7ed3\u5408Gradio\u6846\u67b6\u4e0eMini-Omni\u6a21\u578b\u6784\u5efa\u5bf9\u8bdd\u5f0f\u804a\u5929\u673a\u5668\u4eba\u5e94\u7528&#xff0c;\u8be5\u57fa\u7840\u67b6\u6784\u53ef\u7075\u6d3b\u6269\u5c55&#xff0c;\u7528\u4e8e\u5f00\u53d1\u5404\u7c7b\u8bed\u97f3\u4ea4\u4e92\u5f0f\u804a\u5929\u6f14\u793a\u3002\u53e6\u5916&#xff0c;\u5f00\u53d1\u8005\u53ef\u5c1d\u8bd5\u96c6\u6210\u4e0d\u540c\u6a21\u578b\u3001\u4f18\u5316\u97f3\u9891\u5904\u7406\u6d41\u7a0b\u6216\u521b\u65b0\u754c\u9762\u8bbe\u8ba1&#xff0c;\u6253\u9020\u4e2a\u6027\u5316\u7684\u5bf9\u8bdd\u5f0fAI\u4f53\u9a8c&#xff01;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u7b2c10\u7ae0 Streaming&#xff08;\u4e0a&#xff09;&#xff1a;\u521d\u7ea7\u97f3\u9891\u5e94\u7528&#xff08;1&#xff09;\u2014\u2014\u9879\u76ee\u4e09&#xff1a;\u81ea\u5efa\u670d\u52a1\u5668\u7684Mini-Omni\u5b9e\u65f6\u8bed\u97f3\u804a\u5929\u673a\u5668\u4eba\u7b2c10\u7ae0 Streaming&#xff08;\u4e0a&#xff09;&#xff1a;\u521d\u7ea7\u97f3\u9891\u5e94\u752810.1 \u81ea\u52a8\u8bed\u97f3\u8bc6\u522b\u6280\u672f&#xff08;ASR&#xff09;10.1.1 Whisper\u6a21\u578b\u4e0eFFmpeg\u6846\u67b610.1.2 \u6784\u5efa\u5168\u4e0a\u4e0b\u6587\u548c\u5b9e\u65f6\u6d41\u5f0fASR\u6f14\u793a10.2 Mini-Omni\u6784\u5efa<\/p>\n","protected":false},"author":2,"featured_media":85126,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[9524,9525,1103,213,3065],"topic":[],"class_list":["post-85130","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-server","tag-mini-omni","tag-9525","tag-asr","tag-ffmpeg","tag-whisper"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v20.3 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>\u7b2c10\u7ae0 Streaming\uff08\u4e0a\uff09\uff1a\u521d\u7ea7\u97f3\u9891\u5e94\u7528\uff081\uff09\u2014\u2014\u9879\u76ee\u4e09\uff1a\u81ea\u5efa\u670d\u52a1\u5668\u7684Mini-Omni\u5b9e\u65f6\u8bed\u97f3\u804a\u5929\u673a\u5668\u4eba - \u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.wsisp.com\/helps\/85130.html\" \/>\n<meta property=\"og:locale\" content=\"zh_CN\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"\u7b2c10\u7ae0 Streaming\uff08\u4e0a\uff09\uff1a\u521d\u7ea7\u97f3\u9891\u5e94\u7528\uff081\uff09\u2014\u2014\u9879\u76ee\u4e09\uff1a\u81ea\u5efa\u670d\u52a1\u5668\u7684Mini-Omni\u5b9e\u65f6\u8bed\u97f3\u804a\u5929\u673a\u5668\u4eba - \u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3\" \/>\n<meta property=\"og:description\" content=\"\u7b2c10\u7ae0 Streaming&#xff08;\u4e0a&#xff09;&#xff1a;\u521d\u7ea7\u97f3\u9891\u5e94\u7528&#xff08;1&#xff09;\u2014\u2014\u9879\u76ee\u4e09&#xff1a;\u81ea\u5efa\u670d\u52a1\u5668\u7684Mini-Omni\u5b9e\u65f6\u8bed\u97f3\u804a\u5929\u673a\u5668\u4eba\u7b2c10\u7ae0 Streaming&#xff08;\u4e0a&#xff09;&#xff1a;\u521d\u7ea7\u97f3\u9891\u5e94\u752810.1 \u81ea\u52a8\u8bed\u97f3\u8bc6\u522b\u6280\u672f&#xff08;ASR&#xff09;10.1.1 Whisper\u6a21\u578b\u4e0eFFmpeg\u6846\u67b610.1.2 \u6784\u5efa\u5168\u4e0a\u4e0b\u6587\u548c\u5b9e\u65f6\u6d41\u5f0fASR\u6f14\u793a10.2 Mini-Omni\u6784\u5efa\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.wsisp.com\/helps\/85130.html\" \/>\n<meta property=\"og:site_name\" content=\"\u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3\" \/>\n<meta property=\"article:published_time\" content=\"2026-07-26T17:17:34+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.wsisp.com\/helps\/wp-content\/uploads\/2026\/07\/20260726171732-6a66412c87a44.png\" \/>\n<meta name=\"author\" content=\"admin\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"\u4f5c\u8005\" \/>\n\t<meta name=\"twitter:data1\" content=\"admin\" \/>\n\t<meta name=\"twitter:label2\" content=\"\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4\" \/>\n\t<meta name=\"twitter:data2\" content=\"11 \u5206\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.wsisp.com\/helps\/85130.html\",\"url\":\"https:\/\/www.wsisp.com\/helps\/85130.html\",\"name\":\"\u7b2c10\u7ae0 Streaming\uff08\u4e0a\uff09\uff1a\u521d\u7ea7\u97f3\u9891\u5e94\u7528\uff081\uff09\u2014\u2014\u9879\u76ee\u4e09\uff1a\u81ea\u5efa\u670d\u52a1\u5668\u7684Mini-Omni\u5b9e\u65f6\u8bed\u97f3\u804a\u5929\u673a\u5668\u4eba - \u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3\",\"isPartOf\":{\"@id\":\"https:\/\/www.wsisp.com\/helps\/#website\"},\"datePublished\":\"2026-07-26T17:17:34+00:00\",\"dateModified\":\"2026-07-26T17:17:34+00:00\",\"author\":{\"@id\":\"https:\/\/www.wsisp.com\/helps\/#\/schema\/person\/358e386c577a3ab51c4493330a20ad41\"},\"breadcrumb\":{\"@id\":\"https:\/\/www.wsisp.com\/helps\/85130.html#breadcrumb\"},\"inLanguage\":\"zh-Hans\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.wsisp.com\/helps\/85130.html\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.wsisp.com\/helps\/85130.html#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"\u9996\u9875\",\"item\":\"https:\/\/www.wsisp.com\/helps\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"\u7b2c10\u7ae0 Streaming\uff08\u4e0a\uff09\uff1a\u521d\u7ea7\u97f3\u9891\u5e94\u7528\uff081\uff09\u2014\u2014\u9879\u76ee\u4e09\uff1a\u81ea\u5efa\u670d\u52a1\u5668\u7684Mini-Omni\u5b9e\u65f6\u8bed\u97f3\u804a\u5929\u673a\u5668\u4eba\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.wsisp.com\/helps\/#website\",\"url\":\"https:\/\/www.wsisp.com\/helps\/\",\"name\":\"\u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3\",\"description\":\"\u9999\u6e2f\u670d\u52a1\u5668_\u9999\u6e2f\u4e91\u670d\u52a1\u5668\u8d44\u8baf_\u670d\u52a1\u5668\u5e2e\u52a9\u6587\u6863_\u670d\u52a1\u5668\u6559\u7a0b\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.wsisp.com\/helps\/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"zh-Hans\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.wsisp.com\/helps\/#\/schema\/person\/358e386c577a3ab51c4493330a20ad41\",\"name\":\"admin\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"zh-Hans\",\"@id\":\"https:\/\/www.wsisp.com\/helps\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/gravatar.wp-china-yes.net\/avatar\/?s=96&d=mystery\",\"contentUrl\":\"https:\/\/gravatar.wp-china-yes.net\/avatar\/?s=96&d=mystery\",\"caption\":\"admin\"},\"sameAs\":[\"http:\/\/wp.wsisp.com\"],\"url\":\"https:\/\/www.wsisp.com\/helps\/author\/admin\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"\u7b2c10\u7ae0 Streaming\uff08\u4e0a\uff09\uff1a\u521d\u7ea7\u97f3\u9891\u5e94\u7528\uff081\uff09\u2014\u2014\u9879\u76ee\u4e09\uff1a\u81ea\u5efa\u670d\u52a1\u5668\u7684Mini-Omni\u5b9e\u65f6\u8bed\u97f3\u804a\u5929\u673a\u5668\u4eba - \u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.wsisp.com\/helps\/85130.html","og_locale":"zh_CN","og_type":"article","og_title":"\u7b2c10\u7ae0 Streaming\uff08\u4e0a\uff09\uff1a\u521d\u7ea7\u97f3\u9891\u5e94\u7528\uff081\uff09\u2014\u2014\u9879\u76ee\u4e09\uff1a\u81ea\u5efa\u670d\u52a1\u5668\u7684Mini-Omni\u5b9e\u65f6\u8bed\u97f3\u804a\u5929\u673a\u5668\u4eba - \u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3","og_description":"\u7b2c10\u7ae0 Streaming&#xff08;\u4e0a&#xff09;&#xff1a;\u521d\u7ea7\u97f3\u9891\u5e94\u7528&#xff08;1&#xff09;\u2014\u2014\u9879\u76ee\u4e09&#xff1a;\u81ea\u5efa\u670d\u52a1\u5668\u7684Mini-Omni\u5b9e\u65f6\u8bed\u97f3\u804a\u5929\u673a\u5668\u4eba\u7b2c10\u7ae0 Streaming&#xff08;\u4e0a&#xff09;&#xff1a;\u521d\u7ea7\u97f3\u9891\u5e94\u752810.1 \u81ea\u52a8\u8bed\u97f3\u8bc6\u522b\u6280\u672f&#xff08;ASR&#xff09;10.1.1 Whisper\u6a21\u578b\u4e0eFFmpeg\u6846\u67b610.1.2 \u6784\u5efa\u5168\u4e0a\u4e0b\u6587\u548c\u5b9e\u65f6\u6d41\u5f0fASR\u6f14\u793a10.2 Mini-Omni\u6784\u5efa","og_url":"https:\/\/www.wsisp.com\/helps\/85130.html","og_site_name":"\u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3","article_published_time":"2026-07-26T17:17:34+00:00","og_image":[{"url":"https:\/\/www.wsisp.com\/helps\/wp-content\/uploads\/2026\/07\/20260726171732-6a66412c87a44.png"}],"author":"admin","twitter_card":"summary_large_image","twitter_misc":{"\u4f5c\u8005":"admin","\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4":"11 \u5206"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.wsisp.com\/helps\/85130.html","url":"https:\/\/www.wsisp.com\/helps\/85130.html","name":"\u7b2c10\u7ae0 Streaming\uff08\u4e0a\uff09\uff1a\u521d\u7ea7\u97f3\u9891\u5e94\u7528\uff081\uff09\u2014\u2014\u9879\u76ee\u4e09\uff1a\u81ea\u5efa\u670d\u52a1\u5668\u7684Mini-Omni\u5b9e\u65f6\u8bed\u97f3\u804a\u5929\u673a\u5668\u4eba - \u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3","isPartOf":{"@id":"https:\/\/www.wsisp.com\/helps\/#website"},"datePublished":"2026-07-26T17:17:34+00:00","dateModified":"2026-07-26T17:17:34+00:00","author":{"@id":"https:\/\/www.wsisp.com\/helps\/#\/schema\/person\/358e386c577a3ab51c4493330a20ad41"},"breadcrumb":{"@id":"https:\/\/www.wsisp.com\/helps\/85130.html#breadcrumb"},"inLanguage":"zh-Hans","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.wsisp.com\/helps\/85130.html"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.wsisp.com\/helps\/85130.html#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"\u9996\u9875","item":"https:\/\/www.wsisp.com\/helps"},{"@type":"ListItem","position":2,"name":"\u7b2c10\u7ae0 Streaming\uff08\u4e0a\uff09\uff1a\u521d\u7ea7\u97f3\u9891\u5e94\u7528\uff081\uff09\u2014\u2014\u9879\u76ee\u4e09\uff1a\u81ea\u5efa\u670d\u52a1\u5668\u7684Mini-Omni\u5b9e\u65f6\u8bed\u97f3\u804a\u5929\u673a\u5668\u4eba"}]},{"@type":"WebSite","@id":"https:\/\/www.wsisp.com\/helps\/#website","url":"https:\/\/www.wsisp.com\/helps\/","name":"\u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3","description":"\u9999\u6e2f\u670d\u52a1\u5668_\u9999\u6e2f\u4e91\u670d\u52a1\u5668\u8d44\u8baf_\u670d\u52a1\u5668\u5e2e\u52a9\u6587\u6863_\u670d\u52a1\u5668\u6559\u7a0b","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.wsisp.com\/helps\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"zh-Hans"},{"@type":"Person","@id":"https:\/\/www.wsisp.com\/helps\/#\/schema\/person\/358e386c577a3ab51c4493330a20ad41","name":"admin","image":{"@type":"ImageObject","inLanguage":"zh-Hans","@id":"https:\/\/www.wsisp.com\/helps\/#\/schema\/person\/image\/","url":"https:\/\/gravatar.wp-china-yes.net\/avatar\/?s=96&d=mystery","contentUrl":"https:\/\/gravatar.wp-china-yes.net\/avatar\/?s=96&d=mystery","caption":"admin"},"sameAs":["http:\/\/wp.wsisp.com"],"url":"https:\/\/www.wsisp.com\/helps\/author\/admin"}]}},"_links":{"self":[{"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/posts\/85130","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/comments?post=85130"}],"version-history":[{"count":0,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/posts\/85130\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/media\/85126"}],"wp:attachment":[{"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/media?parent=85130"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/categories?post=85130"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/tags?post=85130"},{"taxonomy":"topic","embeddable":true,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/topic?post=85130"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}