tnblog
首页
视频
资源
登录

Qwen2-Audio 部署

467人阅读 2025/5/5 23:12 总访问:3661879 评论:0 收藏:0 手机
分类: HuggingFace

Qwen2-Audio Windows部署


Qwen2-Audio 是阿里巴巴通义千问团队推出的一款开源 AI 语音模型,支持语音聊天和音频分析,能够接受音频和文本输入,生成文本输出,支持多种语言和方言。
本文将介绍如何在 Windows 系统上部署 Qwen2-Audio 模型,包括环境配置、模型下载、推理操作等步骤,帮助您快速上手并体验这一强大的 AI 工具。

环境准备


系统:win11
安装:Anaconda Navigator
Python 3.12.7
显卡:我这里是5090D

由于5090D需要安装最新的pytorch才可以使用cuda,否则会弹出警告不可用cuda,这里建议的版本是12.8以上。
下面可以安装最新的pytorch版本。

  1. pip install --pre torch torchvision torchaudio --index-url https://download.pytorch.org/whl/nightly/cu128


如果存在旧版本可以先卸载再安装。

  1. pip uninstall torch torchvision torchaudio

下载与安装


首先从git上下载Qwen2-Audio

  1. git clone https://github.com/QwenLM/Qwen2-Audio


下载完成后,我们将在该目录下通过命令行创建虚拟环境。

  1. # 这里自己填写自己的版本
  2. conda create --name myenv python=3.12.7
  3. # 激活虚拟环境
  4. conda activate myenv


安装requirements_web_demo.txt中相关依赖。

  1. pip install -r requirements_web_demo.txt
  2. pip install accelerate


然后下载模型,首先我们可以在modelscopehuggingface中进行下载模型,链接在这儿:modelscopehuggingface,重点是下面5个文件:


这里我将它放在了D:\Learning\AI\audio\qwen2-audio\Qwen2-Audio-7B-Instruct目录下,接下来我们来更改一下demo目录下面的web_demo_audio.py代码:

  1. # 首先修改模型的目录
  2. DEFAULT_CKPT_PATH = 'D:\\Learning\\AI\\audio\\qwen2-audio\\Qwen2-Audio-7B-Instruct'


然后我们这里我们修改全部使用gpu进行计算(不这样改会报这样的错误:RuntimeError: Expected all tensors to be on the same device, but found at least two devices, cuda:0 and cpu!)。

  1. if not _get_args().cpu_only:
  2. # inputs["input_ids"] = inputs.input_ids.to("cuda")
  3. inputs = {k: v.to("cuda") for k, v in inputs.items()} # Move all inputs to GPU


完整代码如下:

  1. import gradio as gr
  2. import modelscope_studio as mgr
  3. import librosa
  4. from transformers import AutoProcessor, Qwen2AudioForConditionalGeneration
  5. from argparse import ArgumentParser
  6. #D:\Learning\AI\audio\qwen2-audio\Qwen2-Audio-7B-Instruct
  7. #DEFAULT_CKPT_PATH = 'Qwen/Qwen2-Audio-7B-Instruct'
  8. # DEFAULT_CKPT_PATH = r'D:\Learning\AI\audio\qwen2-audio\Qwen2-Audio-7B-Instruct'
  9. DEFAULT_CKPT_PATH = 'D:\\Learning\\AI\\audio\\qwen2-audio\\Qwen2-Audio-7B-Instruct'
  10. def _get_args():
  11. parser = ArgumentParser()
  12. parser.add_argument("-c", "--checkpoint-path", type=str, default=DEFAULT_CKPT_PATH,
  13. help="Checkpoint name or path, default to %(default)r")
  14. parser.add_argument("--cpu-only", action="store_true", help="Run demo with CPU only")
  15. parser.add_argument("--inbrowser", action="store_true", default=False,
  16. help="Automatically launch the interface in a new tab on the default browser.")
  17. parser.add_argument("--server-port", type=int, default=8000,
  18. help="Demo server port.")
  19. parser.add_argument("--server-name", type=str, default="127.0.0.1",
  20. help="Demo server name.")
  21. args = parser.parse_args()
  22. return args
  23. def add_text(chatbot, task_history, input):
  24. text_content = input.text
  25. content = []
  26. if len(input.files) > 0:
  27. for i in input.files:
  28. content.append({'type': 'audio', 'audio_url': i.path})
  29. if text_content:
  30. content.append({'type': 'text', 'text': text_content})
  31. task_history.append({"role": "user", "content": content})
  32. chatbot.append([{
  33. "text": input.text,
  34. "files": input.files,
  35. }, None])
  36. return chatbot, task_history, None
  37. def add_file(chatbot, task_history, audio_file):
  38. """Add audio file to the chat history."""
  39. task_history.append({"role": "user", "content": [{"audio": audio_file.name}]})
  40. chatbot.append((f"[Audio file: {audio_file.name}]", None))
  41. return chatbot, task_history
  42. def reset_user_input():
  43. """Reset the user input field."""
  44. return gr.Textbox.update(value='')
  45. def reset_state(task_history):
  46. """Reset the chat history."""
  47. return [], []
  48. def regenerate(chatbot, task_history):
  49. """Regenerate the last bot response."""
  50. if task_history and task_history[-1]['role'] == 'assistant':
  51. task_history.pop()
  52. chatbot.pop()
  53. if task_history:
  54. chatbot, task_history = predict(chatbot, task_history)
  55. return chatbot, task_history
  56. def predict(chatbot, task_history):
  57. """Generate a response from the model."""
  58. print(f"{task_history=}")
  59. print(f"{chatbot=}")
  60. text = processor.apply_chat_template(task_history, add_generation_prompt=True, tokenize=False)
  61. audios = []
  62. for message in task_history:
  63. if isinstance(message["content"], list):
  64. for ele in message["content"]:
  65. if ele["type"] == "audio":
  66. audios.append(
  67. librosa.load(ele['audio_url'], sr=processor.feature_extractor.sampling_rate)[0]
  68. )
  69. if len(audios)==0:
  70. audios=None
  71. print(f"{text=}")
  72. print(f"{audios=}")
  73. inputs = processor(text=text, audios=audios, return_tensors="pt", padding=True)
  74. if not _get_args().cpu_only:
  75. # inputs["input_ids"] = inputs.input_ids.to("cuda")
  76. inputs = {k: v.to("cuda") for k, v in inputs.items()} # Move all inputs to GPU
  77. generate_ids = model.generate(**inputs, max_length=256)
  78. #generate_ids = generate_ids[:, inputs.input_ids.size(1):]
  79. generate_ids = generate_ids[:, inputs["input_ids"].size(1):]
  80. response = processor.batch_decode(generate_ids, skip_special_tokens=True, clean_up_tokenization_spaces=False)[0]
  81. print(f"{response=}")
  82. task_history.append({'role': 'assistant',
  83. 'content': response})
  84. chatbot.append((None, response)) # Add the response to chatbot
  85. return chatbot, task_history
  86. def _launch_demo(args):
  87. with gr.Blocks() as demo:
  88. gr.Markdown(
  89. """<p align="center"><img src="https://qianwen-res.oss-cn-beijing.aliyuncs.com/assets/blog/qwenaudio/qwen2audio_logo.png" style="height: 80px"/><p>""")
  90. gr.Markdown("""<center><font size=8>Qwen2-Audio-Instruct Bot</center>""")
  91. gr.Markdown(
  92. """\
  93. <center><font size=3>This WebUI is based on Qwen2-Audio-Instruct, developed by Alibaba Cloud. \
  94. (本WebUI基于Qwen2-Audio-Instruct打造,实现聊天机器人功能。)</center>""")
  95. gr.Markdown("""\
  96. <center><font size=4>Qwen2-Audio <a href="https://modelscope.cn/models/qwen/Qwen2-Audio-7B">?? </a>
  97. | <a href="https://huggingface.co/Qwen/Qwen2-Audio-7B">??</a>&nbsp |
  98. Qwen2-Audio-Instruct <a href="https://modelscope.cn/models/qwen/Qwen2-Audio-7B-Instruct">?? </a> |
  99. <a href="https://huggingface.co/Qwen/Qwen2-Audio-7B-Instruct">??</a>&nbsp |
  100. &nbsp<a href="https://github.com/QwenLM/Qwen2-Audio">Github</a></center>""")
  101. chatbot = mgr.Chatbot(label='Qwen2-Audio-7B-Instruct', elem_classes="control-height", height=750)
  102. user_input = mgr.MultimodalInput(
  103. interactive=True,
  104. sources=['microphone', 'upload'],
  105. submit_button_props=dict(value="?? Submit (发送)"),
  106. upload_button_props=dict(value="?? Upload (上传文件)", show_progress=True),
  107. )
  108. task_history = gr.State([])
  109. with gr.Row():
  110. empty_bin = gr.Button("?? Clear History (清除历史)")
  111. regen_btn = gr.Button("??? Regenerate (重试)")
  112. user_input.submit(fn=add_text,
  113. inputs=[chatbot, task_history, user_input],
  114. outputs=[chatbot, task_history, user_input]).then(
  115. predict, [chatbot, task_history], [chatbot, task_history], show_progress=True
  116. )
  117. empty_bin.click(reset_state, outputs=[chatbot, task_history], show_progress=True)
  118. regen_btn.click(regenerate, [chatbot, task_history], [chatbot, task_history], show_progress=True)
  119. demo.queue().launch(
  120. share=False,
  121. inbrowser=args.inbrowser,
  122. server_port=args.server_port,
  123. server_name=args.server_name,
  124. )
  125. if __name__ == "__main__":
  126. args = _get_args()
  127. if args.cpu_only:
  128. device_map = "cpu"
  129. else:
  130. device_map = "auto"
  131. model = Qwen2AudioForConditionalGeneration.from_pretrained(
  132. args.checkpoint_path,
  133. torch_dtype="auto",
  134. device_map=device_map,
  135. resume_download=True,
  136. ).eval()
  137. model.generation_config.max_new_tokens = 2048 # For chat.
  138. print("generation_config", model.generation_config)
  139. processor = AutoProcessor.from_pretrained(args.checkpoint_path, resume_download=True)
  140. _launch_demo(args)


开始运行。

  1. python web_demo_audio.py


这样在本地就部署成功了。
中途遇到了一些问题:

问题一


web界面有时候没有输入框,这最先开始也是我不解的地方,然后我执行下面的命令后就有了。

  1. pip install modelscope-studio==0.5.2

问题二


然后我们通过录制音频,编辑文本后发送发现报错。
发现是什么Exception in ASGI application什么什么的错误,通过各种各样的尝试最后换了一下gradio版本解决了。

  1. pip install gradio --upgrade -i https://mirrors.cloud.tencent.com/pypi/simple

pip包我提供一下

  1. (myenv) D:\Learning\AI\audio\qwen2-audio>pip list
  2. WARNING: Ignoring invalid distribution ~radio-client (D:\ProgramData\anaconda3\envs\myenv\Lib\site-packages)
  3. WARNING: Ignoring invalid distribution ~umpy (D:\ProgramData\anaconda3\envs\myenv\Lib\site-packages)
  4. Package Version
  5. ------------------------- ------------------------
  6. accelerate 1.6.0
  7. aiofiles 23.2.1
  8. altair 5.5.0
  9. annotated-types 0.7.0
  10. anyio 4.9.0
  11. asttokens 3.0.0
  12. attrs 25.3.0
  13. audioread 3.0.1
  14. certifi 2025.4.26
  15. cffi 1.17.1
  16. charset-normalizer 3.4.2
  17. click 8.1.8
  18. colorama 0.4.6
  19. comm 0.2.2
  20. contourpy 1.3.2
  21. cycler 0.12.1
  22. debugpy 1.8.14
  23. decorator 5.2.1
  24. executing 2.2.0
  25. fastapi 0.115.12
  26. ffmpy 0.5.0
  27. filelock 3.18.0
  28. fonttools 4.57.0
  29. fsspec 2025.3.2
  30. gradio 5.29.0
  31. gradio_client 1.10.0
  32. groovy 0.1.2
  33. h11 0.16.0
  34. httpcore 1.0.9
  35. httpx 0.28.1
  36. huggingface-hub 0.30.2
  37. idna 3.10
  38. importlib_resources 6.5.2
  39. ipykernel 6.29.5
  40. ipython 9.2.0
  41. ipython_pygments_lexers 1.1.1
  42. jedi 0.19.2
  43. Jinja2 3.1.4
  44. joblib 1.5.0
  45. jsonschema 4.23.0
  46. jsonschema-specifications 2025.4.1
  47. jupyter_client 8.6.3
  48. jupyter_core 5.7.2
  49. kiwisolver 1.4.8
  50. lazy_loader 0.4
  51. librosa 0.11.0
  52. llvmlite 0.44.0
  53. markdown-it-py 3.0.0
  54. MarkupSafe 2.1.5
  55. matplotlib 3.10.1
  56. matplotlib-inline 0.1.7
  57. mdurl 0.1.2
  58. modelscope_studio 0.5.2
  59. mpmath 1.3.0
  60. msgpack 1.1.0
  61. narwhals 1.37.1
  62. nest-asyncio 1.6.0
  63. networkx 3.3
  64. numba 0.61.2
  65. numpy 1.26.4
  66. orjson 3.10.18
  67. packaging 25.0
  68. pandas 2.2.3
  69. parso 0.8.4
  70. pillow 10.4.0
  71. pip 25.1
  72. platformdirs 4.3.7
  73. pooch 1.8.2
  74. prompt_toolkit 3.0.51
  75. psutil 7.0.0
  76. pure_eval 0.2.3
  77. pycparser 2.22
  78. pydantic 2.11.4
  79. pydantic_core 2.33.2
  80. pydub 0.25.1
  81. Pygments 2.19.1
  82. pyparsing 3.2.3
  83. python-dateutil 2.9.0.post0
  84. python-multipart 0.0.20
  85. pytz 2025.2
  86. pywin32 310
  87. PyYAML 6.0.2
  88. pyzmq 26.4.0
  89. referencing 0.36.2
  90. regex 2024.11.6
  91. requests 2.32.3
  92. rich 14.0.0
  93. rpds-py 0.24.0
  94. ruff 0.11.8
  95. safehttpx 0.1.6
  96. safetensors 0.5.3
  97. scikit-learn 1.6.1
  98. scipy 1.15.2
  99. semantic-version 2.10.0
  100. setuptools 78.1.1
  101. shellingham 1.5.4
  102. six 1.17.0
  103. sniffio 1.3.1
  104. soundfile 0.13.1
  105. soxr 0.5.0.post1
  106. stack-data 0.6.3
  107. starlette 0.46.2
  108. sympy 1.13.3
  109. threadpoolctl 3.6.0
  110. tokenizers 0.21.1
  111. tomlkit 0.12.0
  112. torch 2.8.0.dev20250503+cu128
  113. torchaudio 2.6.0.dev20250504+cu128
  114. torchvision 0.22.0.dev20250504+cu128
  115. tornado 6.4.2
  116. tqdm 4.67.1
  117. traitlets 5.14.3
  118. transformers 4.52.0.dev0
  119. typer 0.15.3
  120. typing_extensions 4.13.2
  121. typing-inspection 0.4.0
  122. tzdata 2025.2
  123. urllib3 2.4.0
  124. uvicorn 0.34.2
  125. wcwidth 0.2.13
  126. websockets 11.0.3
  127. wheel 0.45.1

如果有其他的问题可以留言。

参考链接


https://juejin.cn/post/7490445394468438028
https://blog.csdn.net/qq_55736201/article/details/142835651
https://github.com/QwenLM/Qwen2-Audio/issues/112


欢迎加群讨论技术,1群:677373950(满了,可以加,但通过不了),2群:656732739

评价

.net Core3.0在Ubuntu 16.04上面的部署(Supervisor+nginx)(扩展docker)

前 言Linux 随着Linux越来越流行,本人一个.net程序员也多次研究linux与.net的相关产品,以及中间件的使用方式。So今天给...

k8s 结合 Service 与 Deployment 部署容器

前言最近看到了学习k8s的网站,在文章末尾分享给大家,所以我最近的教程也会根据上面的课程来进行一些总结Service:暴露容...

Mysql K8s部署Volume(hostPath)

Mysql K8s部署Volume[TOC] Mysql 与 Yaml 稍作修改这里提供的是官网的链接:https://kubernetes.io/docs/tasks/run-a...

Asp.net core webapi部署IIS过程详解,以及坑点介绍和解决坑点方法

这几天做了一个Asp.net core 3.0的webapi小练习,只有简单的增删改查,做好了以后又去对应的部署IIS,因为之前也发布过一些...

Elasticsearch 安装与部署

Elasticsearch 安装与部署[TOC] 环境准备 Java 8.0以上的环境本机环境为Mac,Java 14.0.2 获取 Elasticsearch 安装包 ...

Docker部署简单的mysql

Docker部署简单的mysql[TOC] 首先这玩意我是真不想写,网上写的太多了,但是又没有找到快速的创建方式。so…有疑问都可...

Docker 部署RabbitMq集群

Docker 部署RabbitMq集群[TOC] 镜像环境docker pull rabbitmq:3-management 镜像后面带management是带web管理界面...

OKD一键部署

OKD一键部署[TOC] OKD简介OKD 是Kubernetes 的一个发行版,针对持续应用程序开发和多租户部署进行了优化。OKD在 Kubernete...

OKD 部署.netcore项目

OKD 部署.netcore项目[TOC] 创建.netcore测试项目(Webapp)dotnet --version dotnet new webApp -o myWebApp --no-https ...

dotnet项目执行shell脚本实现简单的自动化部署

不要k8s、不要docker、不要Jenkins,只要一个部署脚本,只是一个小项目单台服务器,实现提交代码自动执行脚本,拉代码构建...

servlet 快速部署入门(继承GenericServlet类)1

一、介绍二、入门搭建1:。。。。。2、3:第2 步还可以通过实现servlet接口完成,但是通过接口完成的话,需要重新的方法就...

JavaWeb项目部署到tomcat

1、2、3、还可参考https://blog.csdn.net/qq_46079450/article/details/124036966

部署应用到k8s集群

部署一个简单的应用使用Deployment部署: 创建一个app.yaml apiVersion: apps/v1 kind: Deployment metadata: # 部...

k8s部署应用常见错误

network: open /run/flannel/subnet.env: no such file or directory1:在每个节点创建文件/run/flannel/subnet.env写入以...

kubadm部署k8s时service-cidr网络和pod-network-cidr的地址如何定义

在用kubadm安装k8s时出现一个疑问,service-cidr和pod-network-cidr这个地址如何配置参数说明--apiserver-advertise-addres...
这一世以无限游戏为使命!
排名
2
文章
657
粉丝
44
评论
93
docker中Sware集群与service
尘叶心繁 : 想学呀!我教你呀
一个bug让程序员走上法庭 索赔金额达400亿日元
叼着奶瓶逛酒吧 : 所以说做程序员也要懂点法律知识
.net core 塑形资源
剑轩 : 收藏收藏
映射AutoMapper
剑轩 : 好是好,这个对效率影响大不大哇,效率高不高
ASP.NET Core 服务注册生命周期
剑轩 : http://www.tnblog.net/aojiancc2/article/details/167
ICP备案 :渝ICP备18016597号-1
网站信息:2018-2025TNBLOG.NET
技术交流:群号656732739
联系我们:contact@tnblog.net
公网安备:50010702506256
欢迎加群交流技术