Spaces:
Sleeping
Sleeping
# import gradio as gr | |
# from huggingface_hub import InferenceClient | |
# """ | |
# For more information on `huggingface_hub` Inference API support, please check the docs: https://huggingface.co/docs/huggingface_hub/v0.22.2/en/guides/inference | |
# """ | |
# client = InferenceClient("Qwen/Qwen2.5-Coder-32B-Instruct") | |
# def respond(message, history: list[tuple[str, str]]): | |
# system_message = "You are a friendly Chatbot. If the user query is product-related, provide structured product recommendations based on intent and relevance." | |
# max_tokens = 2048 | |
# temperature = 0.7 | |
# top_p = 0.95 | |
# messages = [{"role": "system", "content": system_message}] | |
# for val in history: | |
# if val[0]: | |
# messages.append({"role": "user", "content": val[0]}) | |
# if val[1]: | |
# messages.append({"role": "assistant", "content": val[1]}) | |
# # Append product recommendation prompt if the user query is relevant | |
# product_prompt = ("Given a user's search query, recommend the most relevant products from the catalog. " | |
# "Consider synonyms, user intent, and semantic meaning rather than just keyword matching. " | |
# "If the query is vague, infer potential needs based on common shopping behavior. " | |
# "Provide a ranked list of product recommendations with a short explanation for each suggestion. " | |
# "Ensure the recommendations are diverse and cover multiple relevant categories if applicable. " | |
# f"Now, based on the user query: '{message}', generate a well-structured product recommendation list.") | |
# messages.append({"role": "user", "content": product_prompt}) | |
# response = "" | |
# for message in client.chat_completion( | |
# messages, | |
# max_tokens=max_tokens, | |
# stream=True, | |
# temperature=temperature, | |
# top_p=top_p, | |
# ): | |
# token = message.choices[0].delta.content | |
# response += token | |
# yield response | |
# """ | |
# For information on how to customize the ChatInterface, peruse the gradio docs: https://www.gradio.app/docs/chatinterface | |
# """ | |
# demo = gr.ChatInterface(respond) | |
# if __name__ == "__main__": | |
# demo.launch() | |
# import gradio as gr | |
# from huggingface_hub import InferenceClient | |
# import tempfile | |
# # Initialize clients | |
# chat_client = InferenceClient("Qwen/Qwen2.5-Coder-32B-Instruct") | |
# stt_client = InferenceClient("openai/whisper-large-v3") | |
# def transcribe_audio(audio_file): | |
# """Convert audio to text using Whisper model""" | |
# with open(audio_file, "rb") as f: | |
# return stt_client.automatic_speech_recognition(f.read()) | |
# def respond(history, query): | |
# system_message = "You are a friendly Chatbot. Provide structured product recommendations based on user queries." | |
# messages = [{"role": "system", "content": system_message}] | |
# # Build conversation history | |
# for entry in history: | |
# messages.append({"role": "user", "content": entry[0]}) | |
# if entry[1]: # Only add assistant response if present | |
# messages.append({"role": "assistant", "content": entry[1]}) | |
# # Add product recommendation prompt | |
# product_prompt = ("Analyze this query and provide recommendations: ") | |
# messages.append({"role": "user", "content": f"{product_prompt}\n{query}"}) | |
# # Generate streamed response | |
# response = "" | |
# for chunk in chat_client.chat_completion( | |
# messages, | |
# max_tokens=2048, | |
# stream=True, | |
# temperature=0.7, | |
# top_p=0.95, | |
# ): | |
# token = chunk.choices[0].delta.content | |
# response += token | |
# history[-1] = (query, response) # Update last history entry | |
# yield history | |
# # Custom CSS for better styling | |
# css = """ | |
# .gradio-container { background: #f0f4f8 !important; } | |
# .audio-input { background: white !important; border-radius: 10px; } | |
# """ | |
# with gr.Blocks(css=css) as demo: | |
# gr.Markdown("# Smart Product Assistant π€ποΈ") | |
# with gr.Row(): | |
# chatbot = gr.Chatbot(height=600) | |
# with gr.Column(): | |
# with gr.Tab("Text Input"): | |
# text_input = gr.Textbox(label="Type your query") | |
# with gr.Tab("Voice Input"): | |
# audio_input = gr.Audio( | |
# sources="microphone", | |
# type="filepath", | |
# label="Record your query", | |
# elem_classes="audio-input" | |
# ) | |
# submit_btn = gr.Button("Submit", variant="primary") | |
# def process_inputs(text, audio, history): | |
# """Handle both text and audio inputs""" | |
# query = text.strip() | |
# if audio and not query: | |
# query = transcribe_audio(audio) | |
# if query: | |
# # Add new entry to history with empty response | |
# return history + [[query, None]] | |
# return history | |
# submit_btn.click( | |
# process_inputs, | |
# [text_input, audio_input, chatbot], | |
# chatbot, | |
# queue=False | |
# ).then( | |
# respond, | |
# [chatbot, text_input], | |
# chatbot | |
# ) | |
# if __name__ == "__main__": | |
# demo.launch() | |
import gradio as gr | |
from huggingface_hub import InferenceClient | |
import tempfile | |
# Initialize clients | |
chat_client = InferenceClient("Qwen/Qwen2.5-Coder-32B-Instruct") | |
stt_client = InferenceClient("openai/whisper-large-v3") | |
def transcribe_audio(audio_file): | |
"""Convert audio to text using Whisper model""" | |
with open(audio_file, "rb") as f: | |
result = stt_client.automatic_speech_recognition(f.read()) | |
return result.text # Extract only the text from the response | |
def respond(history, query): | |
system_message = """You are a friendly Product Assistant. Follow these rules: | |
1. If the query is product-related, provide structured recommendations | |
2. Consider both voice and text inputs equally | |
3. Format responses with bullet points and emojis | |
4. Always acknowledge voice queries specifically""" | |
product_prompt = f"""Analyze this {'voice' if history[-1][0] == query else 'text'} query: | |
"{query}" | |
Recommend products considering: | |
- User intent | |
- Semantic meaning | |
- Potential use cases | |
- Price ranges | |
Provide ranked list with brief explanations""" | |
messages = [ | |
{"role": "system", "content": system_message}, | |
{"role": "user", "content": product_prompt} | |
] | |
# Build conversation history | |
for entry in history[:-1]: # Exclude current query | |
messages.extend([ | |
{"role": "user", "content": entry[0]}, | |
{"role": "assistant", "content": entry[1]} | |
]) | |
# Generate streamed response | |
response = "" | |
for chunk in chat_client.chat_completion( | |
messages, | |
max_tokens=2048, | |
stream=True, | |
temperature=0.7, | |
top_p=0.95, | |
): | |
token = chunk.choices[0].delta.content | |
response += token | |
history[-1] = (history[-1][0], response) # Update last entry | |
yield history | |
# Custom styling | |
css = """ | |
.gradio-container { background: #f5f7fa !important; } | |
.audio-input { background: white !important; border-radius: 10px; } | |
""" | |
with gr.Blocks(css=css) as demo: | |
gr.Markdown("# π€ Voice-Activated Product Advisor ποΈ") | |
with gr.Row(): | |
chatbot = gr.Chatbot(height=600, bubble_full_width=False) | |
with gr.Column(): | |
with gr.Tab("ποΈ Voice Input"): | |
audio_input = gr.Audio( | |
sources="microphone", | |
type="filepath", | |
label="Speak your product request", | |
elem_classes="audio-input" | |
) | |
with gr.Tab("π Text Input"): | |
text_input = gr.Textbox(label="Type your request") | |
submit_btn = gr.Button("π Get Recommendations", variant="primary") | |
def process_inputs(text, audio, history): | |
"""Handle both input types""" | |
query = text.strip() | |
if audio: | |
query = transcribe_audio(audio) | |
# Add voice-specific marker | |
query = f"π€ Voice Query: {query}" | |
if query: | |
return history + [(query, None)] # Proper tuple format | |
return history | |
submit_btn.click( | |
process_inputs, | |
[text_input, audio_input, chatbot], | |
chatbot, | |
queue=False | |
).then( | |
respond, | |
[chatbot, text_input], | |
chatbot | |
) | |
# Clear inputs after submission | |
submit_btn.click( | |
lambda: [None, None], # Clear audio and text inputs | |
outputs=[text_input, audio_input] | |
) | |
if __name__ == "__main__": | |
demo.launch() | |
# import gradio as gr | |
# from huggingface_hub import InferenceClient | |
# import tempfile | |
# # Initialize clients | |
# chat_client = InferenceClient("Qwen/Qwen2.5-Coder-32B-Instruct") | |
# stt_client = InferenceClient("openai/whisper-large-v3") | |
# def transcribe_audio(audio_file): | |
# """Convert audio to text using Whisper model""" | |
# try: | |
# with open(audio_file, "rb") as f: | |
# result = stt_client.automatic_speech_recognition(f.read()) | |
# return result.text | |
# except Exception as e: | |
# print(f"Transcription error: {e}") | |
# return "Could not process audio. Please try again." | |
# def respond(history, query): | |
# system_message = """You are a Voice-Aware Product Assistant. Rules: | |
# 1. Always acknowledge voice queries with π§ icon | |
# 2. Provide structured recommendations with emojis | |
# 3. Consider both voice and text inputs equally""" | |
# product_prompt = f"""Analyze this {'π§ VOICE' if 'π§' in query else 'π TEXT'} query: | |
# "{query.replace('π§ VOICE: ', '')}" | |
# Recommend products considering: | |
# - Voice tone analysis (if audio) | |
# - Semantic meaning | |
# - User intent | |
# - Price context""" | |
# messages = [ | |
# {"role": "system", "content": system_message}, | |
# {"role": "user", "content": product_prompt} | |
# ] | |
# # Generate streamed response | |
# response = "" | |
# for chunk in chat_client.chat_completion( | |
# messages, | |
# max_tokens=2048, | |
# stream=True, | |
# temperature=0.7, | |
# top_p=0.95, | |
# ): | |
# token = chunk.choices[0].delta.content | |
# response += token | |
# history[-1] = (history[-1][0], response) | |
# yield history | |
# css = """ | |
# .gradio-container { background: #f8f9fa !important; } | |
# .audio-input { background: white !important; border-radius: 10px; } | |
# .mic-status { color: #4a90e2; font-weight: bold; } | |
# """ | |
# with gr.Blocks(css=css, title="Voice Product Assistant") as demo: | |
# gr.Markdown("# π§ Voice-Activated Product Advisor π") | |
# with gr.Row(): | |
# chatbot = gr.Chatbot(height=600, bubble_full_width=False) | |
# with gr.Column(): | |
# # Audio input with status indicator | |
# with gr.Group(): | |
# audio_input = gr.Audio( | |
# sources="microphone", | |
# type="filepath", | |
# label="Click mic & speak", | |
# elem_classes="audio-input", | |
# interactive=True | |
# ) | |
# mic_status = gr.Markdown("π΄ Mic offline", elem_classes="mic-status") | |
# # Text input | |
# text_input = gr.Textbox(label="Or type your request") | |
# # Unified submit button | |
# submit_btn = gr.Button("π Get Recommendations", variant="primary") | |
# # Handle audio permissions | |
# def request_mic_access(): | |
# return gr.update(text="π’ Mic ready") if audio_input.is_enabled else gr.update(text="π΄ Mic blocked") | |
# # Process inputs | |
# def process_inputs(text, audio, history): | |
# query = text.strip() | |
# if audio: | |
# transcript = transcribe_audio(audio) | |
# query = f"π§ VOICE: {transcript}" | |
# if query: | |
# return history + [(query, None)], "" | |
# return history, "" | |
# # Connect all components | |
# audio_input.change( | |
# request_mic_access, | |
# outputs=mic_status, | |
# queue=False | |
# ) | |
# submit_btn.click( | |
# process_inputs, | |
# [text_input, audio_input, chatbot], | |
# [chatbot, text_input], | |
# queue=False | |
# ).then( | |
# respond, | |
# [chatbot, text_input], | |
# chatbot | |
# ) | |
# if __name__ == "__main__": | |
# demo.launch(server_port=7860, share=False) | |