Spaces:
Running
Running
import gradio as gr | |
import modelscope_studio as mgr | |
from http import HTTPStatus | |
import os | |
from dashscope import MultiModalConversation | |
import dashscope | |
YOUR_API_TOKEN = os.getenv('HF_TOKEN') | |
dashscope.api_key = YOUR_API_TOKEN | |
def add_text(chatbot, task_history, input): | |
text_content = input.text | |
content = [] | |
if len (input.files) > 0: | |
for i in input.files: | |
content.append({'audio': i.path}) | |
if text_content: | |
content.append({'text': text_content}) | |
task_history.append({"role": "user", "content": content}) | |
chatbot.append([{ | |
"text": input.text, | |
"files": input.files, | |
}, None]) | |
return chatbot, task_history, None | |
# def add_mic(chatbot, task_history, mic): | |
# """Add audio to the chat history.""" | |
# task_history.append({"role": "user", "content": [{"audio": mic}]}) | |
# chatbot.append((f"[Audio input: {mic}]", None)) | |
# return chatbot, task_history | |
def add_file(chatbot, task_history, audio_file): | |
"""Add audio file to the chat history.""" | |
task_history.append({"role": "user", "content": [{"audio": audio_file.name}]}) | |
chatbot.append((f"[Audio file: {audio_file.name}]", None)) | |
return chatbot, task_history | |
def reset_user_input(): | |
"""Reset the user input field.""" | |
return gr.Textbox.update(value='') | |
def reset_state(task_history): | |
"""Reset the chat history.""" | |
return [], [] | |
def regenerate(chatbot, task_history): | |
"""Regenerate the last bot response.""" | |
if task_history and task_history[-1]['role'] == 'assistant': | |
task_history.pop() | |
chatbot.pop() | |
if task_history: | |
chatbot, task_history = predict(chatbot, task_history) | |
return chatbot, task_history | |
def predict(chatbot, task_history): | |
"""Generate a response from the model.""" | |
response = MultiModalConversation.call(model='qwen2-audio-instruct', | |
messages=task_history) | |
if response.status_code == HTTPStatus.OK: | |
output_text = response.output.choices[0].message.content | |
if isinstance(output_text, list): | |
output_text = next((item.get('text') for item in output_text if 'text' in item), '') | |
elif isinstance(output_text, dict): | |
output_text = output_text.get('text', '') | |
task_history.append({'role': response.output.choices[0].message.role, | |
'content': [{'text': output_text}]}) | |
chatbot.append((None, output_text)) # Add the response to chatbot | |
return chatbot, task_history | |
else: | |
error_message = f"Failed to get a response: {response.code} - {response.message}" | |
chatbot.append((None, error_message)) # Add the error message to chatbot | |
return chatbot, task_history | |
with gr.Blocks() as demo: | |
gr.Markdown("""<p align="center"><img src="https://modelscope.oss-cn-beijing.aliyuncs.com/resource/qwen.png" style="height: 80px"/><p>""") ## todo | |
gr.Markdown("""<center><font size=8>Qwen2-Audio-Instruct Bot</center>""") | |
gr.Markdown( | |
"""\ | |
<center><font size=3>This WebUI is based on Qwen2-Audio-Instruct, developed by Alibaba Cloud. \ | |
(本WebUI基于Qwen2-Audio-Instruct打造,实现聊天机器人功能。)</center>""") | |
gr.Markdown("""\ | |
<center><font size=4>Qwen2-Audio <a href="https://modelscope.cn/models/qwen/Qwen2-Audio-7B">🤖 </a> | |
| <a href="https://huggingface.co/Qwen/Qwen2-Audio-7B">🤗</a>  | | |
Qwen2-Audio-Instruct <a href="https://modelscope.cn/models/qwen/Qwen2-Audio-7B-Instruct">🤖 </a> | | |
<a href="https://huggingface.co/Qwen/Qwen2-Audio-7B-Instruct">🤗</a>  | | |
 <a href="https://github.com/QwenLM/Qwen2-Audio">Github</a></center>""") | |
chatbot = mgr.Chatbot(label='Qwen2-Audio-7B-Instruct', elem_classes="control-height", height=750) | |
# query = gr.Textbox(lines=2, label='Input') | |
# mic = gr.Audio(source="microphone", type="filepath") | |
user_input = mgr.MultimodalInput( | |
interactive=True, | |
sources=['microphone', 'upload'], | |
submit_button_props=dict(value="🚀 Submit (发送)"), | |
upload_button_props=dict(value="📁 Upload (上传文件)", show_progress=True), | |
) | |
task_history = gr.State([]) | |
with gr.Row(): | |
empty_bin = gr.Button("🧹 Clear History (清除历史)") | |
# submit_btn = gr.Button("🚀 Submit (发送)") | |
regen_btn = gr.Button("🤔️ Regenerate (重试)") | |
# addfile_btn = gr.UploadButton("📁 Upload (上传文件)", file_types=["audio"]) | |
# mic.change(add_mic, [chatbot, task_history, mic], [chatbot, task_history]) | |
# submit_btn.click(add_text, [chatbot, task_history, query], [chatbot, task_history]).then( | |
# predict, [chatbot, task_history], [chatbot, task_history], show_progress=True | |
# ) | |
# submit_btn.click(reset_user_input, [], [query]) | |
user_input.submit(fn=add_text, | |
inputs=[chatbot, task_history, user_input], | |
outputs=[chatbot, task_history, user_input],concurrency_limit = 40).then( | |
predict, [chatbot, task_history], [chatbot, task_history], show_progress=True | |
) | |
empty_bin.click(reset_state, outputs=[chatbot, task_history], show_progress=True,concurrency_limit = 40) | |
regen_btn.click(regenerate, [chatbot, task_history], [chatbot, task_history], show_progress=True,concurrency_limit = 40) | |
# addfile_btn.upload(add_file, [chatbot, task_history, addfile_btn], [chatbot, task_history], show_progress=True) | |
demo.queue().launch( | |
share=False, | |
inbrowser=True, | |
server_port=7860, | |
server_name="0.0.0.0", | |
max_threads=40 | |
) | |