Spaces:
Runtime error
Runtime error
alex buz commited on
Commit ·
e6868fd
1
Parent(s): a7368c8
final
Browse files- .gitignore +2 -1
- 2t.py +28 -0
- 3t_dropdown copy 2.py +100 -0
- 3t_dropdown copy 3.py +179 -0
- 3t_dropdown copy.py +34 -0
- 3t_dropdown.py +159 -0
- 3t_dropdown_CHAT.py +152 -0
- app copy 2.py +67 -0
- app copy 3.py +26 -0
- app copy 4.py +43 -0
- app copy 5.py +100 -0
- app copy 6_blocked_scroll.py +102 -0
- app copy 6_record_chatbot.py +53 -0
- app copy 6_working.py +102 -0
- app copy _6_working.py +101 -0
- app.py +72 -36
- app_Chat_working.py +53 -0
.gitignore
CHANGED
|
@@ -1 +1,2 @@
|
|
| 1 |
-
cache
|
|
|
|
|
|
| 1 |
+
cache
|
| 2 |
+
.env
|
2t.py
ADDED
|
@@ -0,0 +1,28 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
from openai import OpenAI
|
| 2 |
+
def predict(message, history, api_key):
|
| 3 |
+
print('in predict')
|
| 4 |
+
client = OpenAI(api_key=api_key)
|
| 5 |
+
history_openai_format = []
|
| 6 |
+
for human, assistant in history:
|
| 7 |
+
history_openai_format.append({"role": "user", "content": human})
|
| 8 |
+
history_openai_format.append({"role": "assistant", "content": assistant})
|
| 9 |
+
history_openai_format.append({"role": "user", "content": message})
|
| 10 |
+
print(history_openai_format)
|
| 11 |
+
response = client.chat.completions.create(
|
| 12 |
+
model='gpt-4o',
|
| 13 |
+
messages=history_openai_format,
|
| 14 |
+
temperature=1.0,
|
| 15 |
+
stream=True
|
| 16 |
+
)
|
| 17 |
+
|
| 18 |
+
partial_message = ""
|
| 19 |
+
for chunk in response:
|
| 20 |
+
#print(chunk)
|
| 21 |
+
if chunk.choices[0].delta.content:
|
| 22 |
+
#print(111, chunk.choices[0].delta.content)
|
| 23 |
+
partial_message += chunk.choices[0].delta.content
|
| 24 |
+
yield partial_message
|
| 25 |
+
|
| 26 |
+
|
| 27 |
+
for msg in predict('Hi',[],'sk-proj-FuXWodUyfcvTYcc6K9ekT3BlbkFJ2eV3qu7UZOAWlW2eWRLQ'):
|
| 28 |
+
print(msg)
|
3t_dropdown copy 2.py
ADDED
|
@@ -0,0 +1,100 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import gradio as gr
|
| 2 |
+
from openai import OpenAI
|
| 3 |
+
import time
|
| 4 |
+
import html
|
| 5 |
+
|
| 6 |
+
def predict(message, history, character, api_key, progress=gr.Progress()):
|
| 7 |
+
client = OpenAI(api_key=api_key)
|
| 8 |
+
history_openai_format = []
|
| 9 |
+
for human, assistant in history:
|
| 10 |
+
history_openai_format.append({"role": "user", "content": human})
|
| 11 |
+
history_openai_format.append({"role": "assistant", "content": assistant})
|
| 12 |
+
history_openai_format.append({"role": "user", "content": message})
|
| 13 |
+
|
| 14 |
+
response = client.chat.completions.create(
|
| 15 |
+
model='gpt-4',
|
| 16 |
+
messages=history_openai_format,
|
| 17 |
+
temperature=1.0,
|
| 18 |
+
stream=True
|
| 19 |
+
)
|
| 20 |
+
|
| 21 |
+
partial_message = ""
|
| 22 |
+
for chunk in progress.tqdm(response, desc="Generating"):
|
| 23 |
+
if chunk.choices[0].delta.content:
|
| 24 |
+
partial_message += chunk.choices[0].delta.content
|
| 25 |
+
yield partial_message
|
| 26 |
+
time.sleep(0.01)
|
| 27 |
+
|
| 28 |
+
def format_history(history):
|
| 29 |
+
html_content = ""
|
| 30 |
+
for human, ai in history:
|
| 31 |
+
human_formatted = html.escape(human).replace('\n', '<br>')
|
| 32 |
+
html_content += f'<div class="message user-message"><strong>You:</strong> {human_formatted}</div>'
|
| 33 |
+
if ai:
|
| 34 |
+
ai_formatted = html.escape(ai).replace('\n', '<br>')
|
| 35 |
+
html_content += f'<div class="message ai-message"><strong>AI:</strong> {ai_formatted}</div>'
|
| 36 |
+
return html_content
|
| 37 |
+
|
| 38 |
+
css = """
|
| 39 |
+
#chat-display {
|
| 40 |
+
height: 600px;
|
| 41 |
+
overflow-y: auto;
|
| 42 |
+
border: 1px solid #ccc;
|
| 43 |
+
padding: 10px;
|
| 44 |
+
margin-bottom: 10px;
|
| 45 |
+
}
|
| 46 |
+
.message {
|
| 47 |
+
margin-bottom: 10px;
|
| 48 |
+
word-wrap: break-word;
|
| 49 |
+
}
|
| 50 |
+
.user-message {
|
| 51 |
+
background-color: #e6f3ff;
|
| 52 |
+
padding: 5px;
|
| 53 |
+
border-radius: 5px;
|
| 54 |
+
}
|
| 55 |
+
.ai-message {
|
| 56 |
+
background-color: #f0f0f0;
|
| 57 |
+
padding: 5px;
|
| 58 |
+
border-radius: 5px;
|
| 59 |
+
}
|
| 60 |
+
"""
|
| 61 |
+
|
| 62 |
+
def user(user_message, history, character, api_key):
|
| 63 |
+
if user_message.strip() == "":
|
| 64 |
+
return "", history, format_history(history)
|
| 65 |
+
history.append([user_message, None])
|
| 66 |
+
formatted_history = format_history(history)
|
| 67 |
+
|
| 68 |
+
# Start bot response generation
|
| 69 |
+
bot_message_generator = predict(user_message, history[:-1], character, api_key)
|
| 70 |
+
for chunk in bot_message_generator:
|
| 71 |
+
history[-1][1] = chunk
|
| 72 |
+
formatted_history = format_history(history)
|
| 73 |
+
yield "", history, formatted_history
|
| 74 |
+
|
| 75 |
+
with gr.Blocks(css=css) as demo:
|
| 76 |
+
gr.Markdown("<h1 style='text-align: center; margin-bottom: 1rem'>My Chatbot</h1>")
|
| 77 |
+
|
| 78 |
+
chat_history = gr.State([])
|
| 79 |
+
chat_display = gr.HTML(elem_id="chat-display")
|
| 80 |
+
msg = gr.Textbox(
|
| 81 |
+
label="Your message",
|
| 82 |
+
lines=1,
|
| 83 |
+
placeholder="Type your message here... (Press Enter to send)"
|
| 84 |
+
)
|
| 85 |
+
clear = gr.Button("Clear")
|
| 86 |
+
|
| 87 |
+
dropdown = gr.Dropdown(
|
| 88 |
+
["Character 1", "Character 2", "Character 3", "Character 4", "Character 5", "Character 6", "Character 7", "Character 8", "Character 9", "Character 10", "Character 11", "Character 12", "Character 13"],
|
| 89 |
+
label="Characters",
|
| 90 |
+
info="Select the character that you'd like to speak to",
|
| 91 |
+
value="Character 1"
|
| 92 |
+
)
|
| 93 |
+
api_key = gr.Textbox(type="password", label="OpenAI API Key")
|
| 94 |
+
|
| 95 |
+
msg.submit(user, [msg, chat_history, dropdown, api_key], [msg, chat_history, chat_display])
|
| 96 |
+
clear.click(lambda: ([], []), None, [chat_history, chat_display], queue=False)
|
| 97 |
+
dropdown.change(lambda x: ([], []), dropdown, [chat_history, chat_display])
|
| 98 |
+
|
| 99 |
+
demo.queue()
|
| 100 |
+
demo.launch(max_threads=20)
|
3t_dropdown copy 3.py
ADDED
|
@@ -0,0 +1,179 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import gradio as gr
|
| 2 |
+
from openai import OpenAI
|
| 3 |
+
import time
|
| 4 |
+
import html
|
| 5 |
+
|
| 6 |
+
def predict(message, history, character, api_key, progress=gr.Progress()):
|
| 7 |
+
client = OpenAI(api_key=api_key)
|
| 8 |
+
history_openai_format = []
|
| 9 |
+
for human, assistant in history:
|
| 10 |
+
history_openai_format.append({"role": "user", "content": human})
|
| 11 |
+
history_openai_format.append({"role": "assistant", "content": assistant})
|
| 12 |
+
history_openai_format.append({"role": "user", "content": message})
|
| 13 |
+
|
| 14 |
+
response = client.chat.completions.create(
|
| 15 |
+
model='gpt-4',
|
| 16 |
+
messages=history_openai_format,
|
| 17 |
+
temperature=1.0,
|
| 18 |
+
stream=True
|
| 19 |
+
)
|
| 20 |
+
|
| 21 |
+
partial_message = ""
|
| 22 |
+
for chunk in progress.tqdm(response, desc="Generating"):
|
| 23 |
+
if chunk.choices[0].delta.content:
|
| 24 |
+
partial_message += chunk.choices[0].delta.content
|
| 25 |
+
yield partial_message
|
| 26 |
+
time.sleep(0.01)
|
| 27 |
+
|
| 28 |
+
def format_history(history):
|
| 29 |
+
html_content = ""
|
| 30 |
+
for human, ai in history:
|
| 31 |
+
human_formatted = html.escape(human).replace('\n', '<br>')
|
| 32 |
+
html_content += f'<div class="message user-message"><strong>You:</strong> {human_formatted}</div>'
|
| 33 |
+
if ai:
|
| 34 |
+
ai_formatted = html.escape(ai).replace('\n', '<br>')
|
| 35 |
+
html_content += f'<div class="message ai-message"><strong>AI:</strong> {ai_formatted}</div>'
|
| 36 |
+
return html_content
|
| 37 |
+
|
| 38 |
+
css = """
|
| 39 |
+
#chat-display {
|
| 40 |
+
height: 600px;
|
| 41 |
+
overflow-y: auto;
|
| 42 |
+
border: 1px solid #ccc;
|
| 43 |
+
padding: 10px;
|
| 44 |
+
margin-bottom: 10px;
|
| 45 |
+
}
|
| 46 |
+
#chat-display::-webkit-scrollbar {
|
| 47 |
+
width: 10px;
|
| 48 |
+
}
|
| 49 |
+
#chat-display::-webkit-scrollbar-track {
|
| 50 |
+
background: #f1f1f1;
|
| 51 |
+
}
|
| 52 |
+
#chat-display::-webkit-scrollbar-thumb {
|
| 53 |
+
background: #888;
|
| 54 |
+
}
|
| 55 |
+
#chat-display::-webkit-scrollbar-thumb:hover {
|
| 56 |
+
background: #555;
|
| 57 |
+
}
|
| 58 |
+
.message {
|
| 59 |
+
margin-bottom: 10px;
|
| 60 |
+
word-wrap: break-word;
|
| 61 |
+
overflow-wrap: break-word;
|
| 62 |
+
}
|
| 63 |
+
.user-message, .ai-message {
|
| 64 |
+
padding: 5px;
|
| 65 |
+
border-radius: 5px;
|
| 66 |
+
max-height: 300px;
|
| 67 |
+
overflow-y: auto;
|
| 68 |
+
}
|
| 69 |
+
.user-message {
|
| 70 |
+
background-color: #e6f3ff;
|
| 71 |
+
}
|
| 72 |
+
.ai-message {
|
| 73 |
+
background-color: #f0f0f0;
|
| 74 |
+
}
|
| 75 |
+
.user-message::-webkit-scrollbar, .ai-message::-webkit-scrollbar {
|
| 76 |
+
width: 5px;
|
| 77 |
+
}
|
| 78 |
+
.user-message::-webkit-scrollbar-thumb, .ai-message::-webkit-scrollbar-thumb {
|
| 79 |
+
background: #888;
|
| 80 |
+
}
|
| 81 |
+
"""
|
| 82 |
+
|
| 83 |
+
js = """
|
| 84 |
+
let lastScrollTop = 0;
|
| 85 |
+
let isNearBottom = true;
|
| 86 |
+
|
| 87 |
+
function updateScroll() {
|
| 88 |
+
const chatDisplay = document.getElementById('chat-display');
|
| 89 |
+
if (!chatDisplay) return;
|
| 90 |
+
|
| 91 |
+
const currentScrollTop = chatDisplay.scrollTop;
|
| 92 |
+
const scrollHeight = chatDisplay.scrollHeight;
|
| 93 |
+
const clientHeight = chatDisplay.clientHeight;
|
| 94 |
+
|
| 95 |
+
// Check if user was near bottom before update
|
| 96 |
+
isNearBottom = (currentScrollTop + clientHeight >= scrollHeight - 50);
|
| 97 |
+
|
| 98 |
+
if (isNearBottom) {
|
| 99 |
+
chatDisplay.scrollTop = scrollHeight;
|
| 100 |
+
} else {
|
| 101 |
+
chatDisplay.scrollTop = lastScrollTop;
|
| 102 |
+
}
|
| 103 |
+
|
| 104 |
+
lastScrollTop = chatDisplay.scrollTop;
|
| 105 |
+
}
|
| 106 |
+
|
| 107 |
+
// Set up a MutationObserver to watch for changes in the chat display
|
| 108 |
+
const observer = new MutationObserver(updateScroll);
|
| 109 |
+
const config = { childList: true, subtree: true };
|
| 110 |
+
|
| 111 |
+
// Start observing the chat display for configured mutations
|
| 112 |
+
document.addEventListener('DOMContentLoaded', (event) => {
|
| 113 |
+
const chatDisplay = document.getElementById('chat-display');
|
| 114 |
+
if (chatDisplay) {
|
| 115 |
+
observer.observe(chatDisplay, config);
|
| 116 |
+
|
| 117 |
+
// Also update scroll on manual scroll
|
| 118 |
+
chatDisplay.addEventListener('scroll', function() {
|
| 119 |
+
lastScrollTop = chatDisplay.scrollTop;
|
| 120 |
+
isNearBottom = (chatDisplay.scrollTop + chatDisplay.clientHeight >= chatDisplay.scrollHeight - 50);
|
| 121 |
+
});
|
| 122 |
+
}
|
| 123 |
+
|
| 124 |
+
// Add event listener for Enter key
|
| 125 |
+
const textbox = document.querySelector('#component-13 input'); // Update this selector if needed
|
| 126 |
+
if (textbox) {
|
| 127 |
+
textbox.addEventListener('keydown', function(e) {
|
| 128 |
+
if (e.key === 'Enter' && !e.shiftKey) {
|
| 129 |
+
e.preventDefault();
|
| 130 |
+
document.querySelector('#component-13 button').click();
|
| 131 |
+
}
|
| 132 |
+
});
|
| 133 |
+
}
|
| 134 |
+
});
|
| 135 |
+
"""
|
| 136 |
+
|
| 137 |
+
def user(user_message, history, character, api_key):
|
| 138 |
+
if user_message.strip() == "":
|
| 139 |
+
return "", history, format_history(history)
|
| 140 |
+
history.append([user_message, None])
|
| 141 |
+
formatted_history = format_history(history)
|
| 142 |
+
|
| 143 |
+
# Start bot response generation
|
| 144 |
+
bot_message_generator = predict(user_message, history[:-1], character, api_key)
|
| 145 |
+
for chunk in bot_message_generator:
|
| 146 |
+
history[-1][1] = chunk
|
| 147 |
+
formatted_history = format_history(history)
|
| 148 |
+
yield "", history, formatted_history
|
| 149 |
+
|
| 150 |
+
with gr.Blocks(css=css, js=js) as demo:
|
| 151 |
+
gr.Markdown("<h1 style='text-align: center; margin-bottom: 1rem'>My Chatbot</h1>")
|
| 152 |
+
|
| 153 |
+
chat_history = gr.State([])
|
| 154 |
+
chat_display = gr.HTML(elem_id="chat-display")
|
| 155 |
+
with gr.Row():
|
| 156 |
+
msg = gr.Textbox(
|
| 157 |
+
label="Your message",
|
| 158 |
+
lines=1,
|
| 159 |
+
placeholder="Type your message here... (Press Enter to send)",
|
| 160 |
+
elem_id="user-input"
|
| 161 |
+
)
|
| 162 |
+
send_btn = gr.Button("Send")
|
| 163 |
+
clear = gr.Button("Clear")
|
| 164 |
+
|
| 165 |
+
dropdown = gr.Dropdown(
|
| 166 |
+
["Character 1", "Character 2", "Character 3", "Character 4", "Character 5", "Character 6", "Character 7", "Character 8", "Character 9", "Character 10", "Character 11", "Character 12", "Character 13"],
|
| 167 |
+
label="Characters",
|
| 168 |
+
info="Select the character that you'd like to speak to",
|
| 169 |
+
value="Character 1"
|
| 170 |
+
)
|
| 171 |
+
api_key = gr.Textbox(type="password", label="OpenAI API Key")
|
| 172 |
+
|
| 173 |
+
send_btn.click(user, [msg, chat_history, dropdown, api_key], [msg, chat_history, chat_display])
|
| 174 |
+
msg.submit(user, [msg, chat_history, dropdown, api_key], [msg, chat_history, chat_display])
|
| 175 |
+
clear.click(lambda: ([], []), None, [chat_history, chat_display], queue=False)
|
| 176 |
+
dropdown.change(lambda x: ([], []), dropdown, [chat_history, chat_display])
|
| 177 |
+
|
| 178 |
+
demo.queue()
|
| 179 |
+
demo.launch(max_threads=20)
|
3t_dropdown copy.py
ADDED
|
@@ -0,0 +1,34 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import gradio as gr
|
| 2 |
+
|
| 3 |
+
def converse(message, history, character):
|
| 4 |
+
print("User message:", message)
|
| 5 |
+
print("Chat history:", history)
|
| 6 |
+
print("Selected character:", character)
|
| 7 |
+
|
| 8 |
+
# Your chatbot logic here
|
| 9 |
+
response = f"You said: {message}. You're talking to {character}."
|
| 10 |
+
|
| 11 |
+
return response
|
| 12 |
+
|
| 13 |
+
def reset(character):
|
| 14 |
+
return [], []
|
| 15 |
+
|
| 16 |
+
# Gradio app
|
| 17 |
+
with gr.Blocks() as demo:
|
| 18 |
+
gr.Markdown(f"<h1 style='text-align: center; margin-bottom: 1rem'>{'My Chatbot'}</h1>")
|
| 19 |
+
bot = gr.Chatbot(render=False)
|
| 20 |
+
dropdown = gr.Dropdown(
|
| 21 |
+
["Character 1", "Character 2", "Character 3", "Character 4", "Character 5", "Character 6", "Character 7", "Character 8", "Character 9", "Character 10", "Character 11", "Character 12", "Character 13"],
|
| 22 |
+
label="Characters",
|
| 23 |
+
info="Select the character that you'd like to speak to",
|
| 24 |
+
value="Character 1"
|
| 25 |
+
)
|
| 26 |
+
chat = gr.ChatInterface(
|
| 27 |
+
fn=converse,
|
| 28 |
+
chatbot=bot,
|
| 29 |
+
additional_inputs=dropdown
|
| 30 |
+
)
|
| 31 |
+
dropdown.change(fn=reset, inputs=dropdown, outputs=[bot, chat.chatbot_state])
|
| 32 |
+
|
| 33 |
+
demo.queue()
|
| 34 |
+
demo.launch()
|
3t_dropdown.py
ADDED
|
@@ -0,0 +1,159 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import gradio as gr
|
| 2 |
+
from openai import OpenAI
|
| 3 |
+
import time
|
| 4 |
+
import html
|
| 5 |
+
|
| 6 |
+
def predict(message, history, character, api_key, progress=gr.Progress()):
|
| 7 |
+
client = OpenAI(api_key=api_key)
|
| 8 |
+
history_openai_format = []
|
| 9 |
+
for human, assistant in history:
|
| 10 |
+
history_openai_format.append({"role": "user", "content": human})
|
| 11 |
+
history_openai_format.append({"role": "assistant", "content": assistant})
|
| 12 |
+
history_openai_format.append({"role": "user", "content": message})
|
| 13 |
+
|
| 14 |
+
response = client.chat.completions.create(
|
| 15 |
+
model='gpt-4',
|
| 16 |
+
messages=history_openai_format,
|
| 17 |
+
temperature=1.0,
|
| 18 |
+
stream=True
|
| 19 |
+
)
|
| 20 |
+
|
| 21 |
+
partial_message = ""
|
| 22 |
+
for chunk in progress.tqdm(response, desc="Generating"):
|
| 23 |
+
if chunk.choices[0].delta.content:
|
| 24 |
+
partial_message += chunk.choices[0].delta.content
|
| 25 |
+
yield partial_message
|
| 26 |
+
time.sleep(0.01)
|
| 27 |
+
|
| 28 |
+
def format_history(history):
|
| 29 |
+
html_content = ""
|
| 30 |
+
for human, ai in history:
|
| 31 |
+
human_formatted = html.escape(human).replace('\n', '<br>')
|
| 32 |
+
html_content += f'<div class="message user-message"><strong>You:</strong> {human_formatted}</div>'
|
| 33 |
+
if ai:
|
| 34 |
+
ai_formatted = html.escape(ai).replace('\n', '<br>')
|
| 35 |
+
html_content += f'<div class="message ai-message"><strong>AI:</strong> {ai_formatted}</div>'
|
| 36 |
+
return html_content
|
| 37 |
+
|
| 38 |
+
css = """
|
| 39 |
+
#chat-display {
|
| 40 |
+
height: 600px;
|
| 41 |
+
overflow-y: auto;
|
| 42 |
+
border: 1px solid #ccc;
|
| 43 |
+
padding: 10px;
|
| 44 |
+
margin-bottom: 10px;
|
| 45 |
+
}
|
| 46 |
+
.message {
|
| 47 |
+
margin-bottom: 10px;
|
| 48 |
+
word-wrap: break-word;
|
| 49 |
+
overflow-wrap: break-word;
|
| 50 |
+
}
|
| 51 |
+
.user-message, .ai-message {
|
| 52 |
+
padding: 5px;
|
| 53 |
+
border-radius: 5px;
|
| 54 |
+
max-height: 300px;
|
| 55 |
+
overflow-y: auto;
|
| 56 |
+
}
|
| 57 |
+
.user-message {
|
| 58 |
+
background-color: #e6f3ff;
|
| 59 |
+
}
|
| 60 |
+
.ai-message {
|
| 61 |
+
background-color: #f0f0f0;
|
| 62 |
+
}
|
| 63 |
+
"""
|
| 64 |
+
|
| 65 |
+
js = """
|
| 66 |
+
let lastScrollHeight = 0;
|
| 67 |
+
let lastScrollTop = 0;
|
| 68 |
+
let isNearBottom = true;
|
| 69 |
+
|
| 70 |
+
function updateScroll() {
|
| 71 |
+
const chatDisplay = document.getElementById('chat-display');
|
| 72 |
+
if (!chatDisplay) return;
|
| 73 |
+
|
| 74 |
+
const newScrollHeight = chatDisplay.scrollHeight;
|
| 75 |
+
const scrollDifference = newScrollHeight - lastScrollHeight;
|
| 76 |
+
|
| 77 |
+
if (isNearBottom) {
|
| 78 |
+
chatDisplay.scrollTop = newScrollHeight;
|
| 79 |
+
} else {
|
| 80 |
+
chatDisplay.scrollTop = lastScrollTop + scrollDifference;
|
| 81 |
+
}
|
| 82 |
+
|
| 83 |
+
lastScrollHeight = newScrollHeight;
|
| 84 |
+
lastScrollTop = chatDisplay.scrollTop;
|
| 85 |
+
|
| 86 |
+
isNearBottom = (chatDisplay.scrollTop + chatDisplay.clientHeight >= chatDisplay.scrollHeight - 50);
|
| 87 |
+
}
|
| 88 |
+
|
| 89 |
+
// Set up a MutationObserver to watch for changes in the chat display
|
| 90 |
+
const observer = new MutationObserver(updateScroll);
|
| 91 |
+
const config = { childList: true, subtree: true };
|
| 92 |
+
|
| 93 |
+
// Start observing the chat display for configured mutations
|
| 94 |
+
document.addEventListener('DOMContentLoaded', (event) => {
|
| 95 |
+
const chatDisplay = document.getElementById('chat-display');
|
| 96 |
+
if (chatDisplay) {
|
| 97 |
+
observer.observe(chatDisplay, config);
|
| 98 |
+
|
| 99 |
+
// Update scroll state on manual scroll
|
| 100 |
+
chatDisplay.addEventListener('scroll', function() {
|
| 101 |
+
lastScrollTop = chatDisplay.scrollTop;
|
| 102 |
+
isNearBottom = (chatDisplay.scrollTop + chatDisplay.clientHeight >= chatDisplay.scrollHeight - 50);
|
| 103 |
+
});
|
| 104 |
+
}
|
| 105 |
+
});
|
| 106 |
+
"""
|
| 107 |
+
|
| 108 |
+
def user(user_message, history, character, api_key):
|
| 109 |
+
if user_message.strip() == "":
|
| 110 |
+
return "", history, format_history(history)
|
| 111 |
+
history.append([user_message, None])
|
| 112 |
+
formatted_history = format_history(history)
|
| 113 |
+
return "", history, formatted_history
|
| 114 |
+
|
| 115 |
+
def bot(history, character, api_key):
|
| 116 |
+
if not history:
|
| 117 |
+
return history, format_history(history)
|
| 118 |
+
user_message = history[-1][0]
|
| 119 |
+
bot_message_generator = predict(user_message, history[:-1], character, api_key)
|
| 120 |
+
for chunk in bot_message_generator:
|
| 121 |
+
history[-1][1] = chunk
|
| 122 |
+
yield history, format_history(history)
|
| 123 |
+
|
| 124 |
+
with gr.Blocks(css=css, js=js) as demo:
|
| 125 |
+
gr.Markdown("<h1 style='text-align: center; margin-bottom: 1rem'>My Chatbot</h1>")
|
| 126 |
+
|
| 127 |
+
chat_history = gr.State([])
|
| 128 |
+
chat_display = gr.HTML(elem_id="chat-display")
|
| 129 |
+
with gr.Row():
|
| 130 |
+
msg = gr.Textbox(
|
| 131 |
+
label="Your message",
|
| 132 |
+
lines=1,
|
| 133 |
+
placeholder="Type your message here... (Press Enter to send)"
|
| 134 |
+
)
|
| 135 |
+
send_btn = gr.Button("Send")
|
| 136 |
+
clear = gr.Button("Clear")
|
| 137 |
+
|
| 138 |
+
dropdown = gr.Dropdown(
|
| 139 |
+
["Character 1", "Character 2", "Character 3", "Character 4", "Character 5", "Character 6", "Character 7", "Character 8", "Character 9", "Character 10", "Character 11", "Character 12", "Character 13"],
|
| 140 |
+
label="Characters",
|
| 141 |
+
info="Select the character that you'd like to speak to",
|
| 142 |
+
value="Character 1"
|
| 143 |
+
)
|
| 144 |
+
api_key = gr.Textbox(type="password", label="OpenAI API Key")
|
| 145 |
+
|
| 146 |
+
def send_message(user_message, history, character, api_key):
|
| 147 |
+
return user(user_message, history, character, api_key)
|
| 148 |
+
|
| 149 |
+
send_btn.click(send_message, [msg, chat_history, dropdown, api_key], [msg, chat_history, chat_display]).then(
|
| 150 |
+
bot, [chat_history, dropdown, api_key], [chat_history, chat_display]
|
| 151 |
+
)
|
| 152 |
+
msg.submit(send_message, [msg, chat_history, dropdown, api_key], [msg, chat_history, chat_display]).then(
|
| 153 |
+
bot, [chat_history, dropdown, api_key], [chat_history, chat_display]
|
| 154 |
+
)
|
| 155 |
+
clear.click(lambda: ([], []), None, [chat_history, chat_display], queue=False)
|
| 156 |
+
dropdown.change(lambda x: ([], []), dropdown, [chat_history, chat_display])
|
| 157 |
+
|
| 158 |
+
demo.queue()
|
| 159 |
+
demo.launch(max_threads=20)
|
3t_dropdown_CHAT.py
ADDED
|
@@ -0,0 +1,152 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import gradio as gr
|
| 2 |
+
from openai import OpenAI
|
| 3 |
+
import time
|
| 4 |
+
import html
|
| 5 |
+
|
| 6 |
+
def predict(message, history, character, api_key, progress=gr.Progress()):
|
| 7 |
+
client = OpenAI(api_key=api_key)
|
| 8 |
+
history_openai_format = []
|
| 9 |
+
for human, assistant in history:
|
| 10 |
+
history_openai_format.append({"role": "user", "content": human})
|
| 11 |
+
history_openai_format.append({"role": "assistant", "content": assistant})
|
| 12 |
+
history_openai_format.append({"role": "user", "content": message})
|
| 13 |
+
|
| 14 |
+
response = client.chat.completions.create(
|
| 15 |
+
model='gpt-4',
|
| 16 |
+
messages=history_openai_format,
|
| 17 |
+
temperature=1.0,
|
| 18 |
+
stream=True
|
| 19 |
+
)
|
| 20 |
+
|
| 21 |
+
partial_message = ""
|
| 22 |
+
for chunk in progress.tqdm(response, desc="Generating"):
|
| 23 |
+
if chunk.choices[0].delta.content:
|
| 24 |
+
partial_message += chunk.choices[0].delta.content
|
| 25 |
+
yield partial_message
|
| 26 |
+
time.sleep(0.01)
|
| 27 |
+
|
| 28 |
+
def format_history(history):
|
| 29 |
+
html_content = ""
|
| 30 |
+
for human, ai in history:
|
| 31 |
+
human_formatted = html.escape(human).replace('\n', '<br>')
|
| 32 |
+
html_content += f'<div class="message user-message"><strong>You:</strong> {human_formatted}</div>'
|
| 33 |
+
if ai:
|
| 34 |
+
ai_formatted = html.escape(ai).replace('\n', '<br>')
|
| 35 |
+
html_content += f'<div class="message ai-message"><strong>AI:</strong> {ai_formatted}</div>'
|
| 36 |
+
return html_content
|
| 37 |
+
|
| 38 |
+
css = """
|
| 39 |
+
#chat-display {
|
| 40 |
+
height: 600px;
|
| 41 |
+
overflow-y: auto;
|
| 42 |
+
border: 1px solid #ccc;
|
| 43 |
+
padding: 10px;
|
| 44 |
+
margin-bottom: 10px;
|
| 45 |
+
}
|
| 46 |
+
#chat-display::-webkit-scrollbar {
|
| 47 |
+
width: 10px;
|
| 48 |
+
}
|
| 49 |
+
#chat-display::-webkit-scrollbar-track {
|
| 50 |
+
background: #f1f1f1;
|
| 51 |
+
}
|
| 52 |
+
#chat-display::-webkit-scrollbar-thumb {
|
| 53 |
+
background: #888;
|
| 54 |
+
}
|
| 55 |
+
#chat-display::-webkit-scrollbar-thumb:hover {
|
| 56 |
+
background: #555;
|
| 57 |
+
}
|
| 58 |
+
.message {
|
| 59 |
+
margin-bottom: 10px;
|
| 60 |
+
max-height: 300px;
|
| 61 |
+
overflow-y: auto;
|
| 62 |
+
word-wrap: break-word;
|
| 63 |
+
}
|
| 64 |
+
.user-message {
|
| 65 |
+
background-color: #e6f3ff;
|
| 66 |
+
padding: 5px;
|
| 67 |
+
border-radius: 5px;
|
| 68 |
+
}
|
| 69 |
+
.ai-message {
|
| 70 |
+
background-color: #f0f0f0;
|
| 71 |
+
padding: 5px;
|
| 72 |
+
border-radius: 5px;
|
| 73 |
+
}
|
| 74 |
+
"""
|
| 75 |
+
|
| 76 |
+
js = """
|
| 77 |
+
function maintainScroll(element_id) {
|
| 78 |
+
let element = document.getElementById(element_id);
|
| 79 |
+
let shouldScroll = element.scrollTop + element.clientHeight === element.scrollHeight;
|
| 80 |
+
let previousScrollTop = element.scrollTop;
|
| 81 |
+
|
| 82 |
+
return function() {
|
| 83 |
+
if (!shouldScroll) {
|
| 84 |
+
element.scrollTop = previousScrollTop;
|
| 85 |
+
} else {
|
| 86 |
+
element.scrollTop = element.scrollHeight;
|
| 87 |
+
}
|
| 88 |
+
}
|
| 89 |
+
}
|
| 90 |
+
|
| 91 |
+
let scrollMaintainer = maintainScroll('chat-display');
|
| 92 |
+
setInterval(scrollMaintainer, 100);
|
| 93 |
+
|
| 94 |
+
// Add event listener for Ctrl+Enter and prevent default Enter behavior
|
| 95 |
+
document.addEventListener('DOMContentLoaded', (event) => {
|
| 96 |
+
const textbox = document.querySelector('#your_message textarea');
|
| 97 |
+
textbox.addEventListener('keydown', function(e) {
|
| 98 |
+
if (e.ctrlKey && e.key === 'Enter') {
|
| 99 |
+
e.preventDefault();
|
| 100 |
+
document.querySelector('#your_message button').click();
|
| 101 |
+
} else if (e.key === 'Enter' && !e.shiftKey) {
|
| 102 |
+
e.preventDefault();
|
| 103 |
+
const start = this.selectionStart;
|
| 104 |
+
const end = this.selectionEnd;
|
| 105 |
+
this.value = this.value.substring(0, start) + "\\n" + this.value.substring(end);
|
| 106 |
+
this.selectionStart = this.selectionEnd = start + 1;
|
| 107 |
+
}
|
| 108 |
+
});
|
| 109 |
+
});
|
| 110 |
+
"""
|
| 111 |
+
|
| 112 |
+
with gr.Blocks(css=css, js=js) as demo:
|
| 113 |
+
gr.Markdown("<h1 style='text-align: center; margin-bottom: 1rem'>My Chatbot</h1>")
|
| 114 |
+
|
| 115 |
+
chat_history = gr.State([])
|
| 116 |
+
chat_display = gr.HTML(elem_id="chat-display")
|
| 117 |
+
msg = gr.Textbox(
|
| 118 |
+
label="Your message",
|
| 119 |
+
lines=2,
|
| 120 |
+
max_lines=10,
|
| 121 |
+
placeholder="Type your message here... (Press Ctrl+Enter to send, Enter for new line)",
|
| 122 |
+
elem_id="your_message"
|
| 123 |
+
)
|
| 124 |
+
clear = gr.Button("Clear")
|
| 125 |
+
|
| 126 |
+
dropdown = gr.Dropdown(
|
| 127 |
+
["Character 1", "Character 2", "Character 3", "Character 4", "Character 5", "Character 6", "Character 7", "Character 8", "Character 9", "Character 10", "Character 11", "Character 12", "Character 13"],
|
| 128 |
+
label="Characters",
|
| 129 |
+
info="Select the character that you'd like to speak to",
|
| 130 |
+
value="Character 1"
|
| 131 |
+
)
|
| 132 |
+
api_key = gr.Textbox(type="password", label="OpenAI API Key")
|
| 133 |
+
|
| 134 |
+
def user(user_message, history):
|
| 135 |
+
history.append([user_message, None])
|
| 136 |
+
return "", history, format_history(history)
|
| 137 |
+
|
| 138 |
+
def bot(history, character, api_key):
|
| 139 |
+
user_message = history[-1][0]
|
| 140 |
+
bot_message_generator = predict(user_message, history[:-1], character, api_key)
|
| 141 |
+
for chunk in bot_message_generator:
|
| 142 |
+
history[-1][1] = chunk
|
| 143 |
+
yield history, format_history(history)
|
| 144 |
+
|
| 145 |
+
msg.submit(user, [msg, chat_history], [msg, chat_history, chat_display]).then(
|
| 146 |
+
bot, [chat_history, dropdown, api_key], [chat_history, chat_display]
|
| 147 |
+
)
|
| 148 |
+
clear.click(lambda: ([], []), None, [chat_history, chat_display], queue=False)
|
| 149 |
+
dropdown.change(lambda x: ([], []), dropdown, [chat_history, chat_display])
|
| 150 |
+
|
| 151 |
+
demo.queue()
|
| 152 |
+
demo.launch(max_threads=20)
|
app copy 2.py
ADDED
|
@@ -0,0 +1,67 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import gradio as gr
|
| 2 |
+
from transformers import pipeline, AutoTokenizer, AutoModelForCausalLM
|
| 3 |
+
import numpy as np
|
| 4 |
+
import torch
|
| 5 |
+
|
| 6 |
+
transcriber = pipeline("automatic-speech-recognition", model="openai/whisper-base.en")
|
| 7 |
+
|
| 8 |
+
# Load a GPT-2 model for general question answering
|
| 9 |
+
tokenizer = AutoTokenizer.from_pretrained("gpt2-medium", cache_dir="./cache")
|
| 10 |
+
model = AutoModelForCausalLM.from_pretrained("gpt2-medium", cache_dir="./cache")
|
| 11 |
+
|
| 12 |
+
def transcribe(audio):
|
| 13 |
+
if audio is None:
|
| 14 |
+
return "No audio recorded."
|
| 15 |
+
sr, y = audio
|
| 16 |
+
y = y.astype(np.float32)
|
| 17 |
+
y /= np.max(np.abs(y))
|
| 18 |
+
|
| 19 |
+
return transcriber({"sampling_rate": sr, "raw": y})["text"]
|
| 20 |
+
|
| 21 |
+
def answer(question):
|
| 22 |
+
input_ids = tokenizer.encode(f"Q: {question}\nA:", return_tensors="pt")
|
| 23 |
+
|
| 24 |
+
# Generate a response
|
| 25 |
+
with torch.no_grad():
|
| 26 |
+
output = model.generate(input_ids, max_length=150, num_return_sequences=1,
|
| 27 |
+
temperature=0.7, top_k=50, top_p=0.95)
|
| 28 |
+
|
| 29 |
+
response = tokenizer.decode(output[0], skip_special_tokens=True)
|
| 30 |
+
|
| 31 |
+
# Extract only the answer part
|
| 32 |
+
answer = response.split("A:")[-1].strip()
|
| 33 |
+
print(answer)
|
| 34 |
+
return response
|
| 35 |
+
|
| 36 |
+
def process_audio(audio):
|
| 37 |
+
if audio is None:
|
| 38 |
+
return "No audio recorded.", ""
|
| 39 |
+
transcription = transcribe(audio)
|
| 40 |
+
answer_result = answer(transcription)
|
| 41 |
+
return transcription, answer_result
|
| 42 |
+
|
| 43 |
+
def clear_all():
|
| 44 |
+
return None, "", ""
|
| 45 |
+
|
| 46 |
+
with gr.Blocks() as demo:
|
| 47 |
+
gr.Markdown("# Audio Transcription and Question Answering")
|
| 48 |
+
|
| 49 |
+
audio_input = gr.Audio(label="Audio Input", sources=["microphone"], type="numpy")
|
| 50 |
+
transcription_output = gr.Textbox(label="Transcription")
|
| 51 |
+
answer_output = gr.Textbox(label="Answer Result", lines=10)
|
| 52 |
+
|
| 53 |
+
clear_button = gr.Button("Clear")
|
| 54 |
+
|
| 55 |
+
audio_input.stop_recording(
|
| 56 |
+
fn=process_audio,
|
| 57 |
+
inputs=[audio_input],
|
| 58 |
+
outputs=[transcription_output, answer_output]
|
| 59 |
+
)
|
| 60 |
+
|
| 61 |
+
clear_button.click(
|
| 62 |
+
fn=clear_all,
|
| 63 |
+
inputs=[],
|
| 64 |
+
outputs=[audio_input, transcription_output, answer_output]
|
| 65 |
+
)
|
| 66 |
+
|
| 67 |
+
demo.launch()
|
app copy 3.py
ADDED
|
@@ -0,0 +1,26 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
|
| 2 |
+
from openai import OpenAI
|
| 3 |
+
import gradio as gr
|
| 4 |
+
|
| 5 |
+
api_key = "sk-proj-FuXWodUyfcvTYcc6K9ekT3BlbkFJ2eV3qu7UZOAWlW2eWRLQ" # Replace with your key
|
| 6 |
+
client = OpenAI(api_key=api_key)
|
| 7 |
+
|
| 8 |
+
def predict(message, history):
|
| 9 |
+
history_openai_format = []
|
| 10 |
+
for human, assistant in history:
|
| 11 |
+
history_openai_format.append({"role": "user", "content": human })
|
| 12 |
+
history_openai_format.append({"role": "assistant", "content":assistant})
|
| 13 |
+
history_openai_format.append({"role": "user", "content": message})
|
| 14 |
+
|
| 15 |
+
response = client.chat.completions.create(model='gpt-3.5-turbo',
|
| 16 |
+
messages= history_openai_format,
|
| 17 |
+
temperature=1.0,
|
| 18 |
+
stream=True)
|
| 19 |
+
|
| 20 |
+
partial_message = ""
|
| 21 |
+
for chunk in response:
|
| 22 |
+
if chunk.choices[0].delta.content is not None:
|
| 23 |
+
partial_message = partial_message + chunk.choices[0].delta.content
|
| 24 |
+
yield partial_message
|
| 25 |
+
|
| 26 |
+
gr.ChatInterface(predict).launch()
|
app copy 4.py
ADDED
|
@@ -0,0 +1,43 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
from openai import OpenAI
|
| 2 |
+
import gradio as gr
|
| 3 |
+
|
| 4 |
+
def predict(message, history, api_key):
|
| 5 |
+
client = OpenAI(api_key=api_key)
|
| 6 |
+
|
| 7 |
+
history_openai_format = []
|
| 8 |
+
for human, assistant in history:
|
| 9 |
+
history_openai_format.append({"role": "user", "content": human})
|
| 10 |
+
history_openai_format.append({"role": "assistant", "content": assistant})
|
| 11 |
+
history_openai_format.append({"role": "user", "content": message})
|
| 12 |
+
|
| 13 |
+
response = client.chat.completions.create(
|
| 14 |
+
model='gpt-3.5-turbo',
|
| 15 |
+
messages=history_openai_format,
|
| 16 |
+
temperature=1.0,
|
| 17 |
+
stream=True
|
| 18 |
+
)
|
| 19 |
+
|
| 20 |
+
partial_message = ""
|
| 21 |
+
for chunk in response:
|
| 22 |
+
if chunk.choices[0].delta.content is not None:
|
| 23 |
+
partial_message += chunk.choices[0].delta.content
|
| 24 |
+
yield partial_message
|
| 25 |
+
|
| 26 |
+
def chat_with_api_key(api_key, message, history):
|
| 27 |
+
return predict(message, history, api_key)
|
| 28 |
+
|
| 29 |
+
with gr.Blocks() as demo:
|
| 30 |
+
api_key = gr.Textbox(label="API Key", placeholder="Enter your API key", type="password")
|
| 31 |
+
message = gr.Textbox(label="Message")
|
| 32 |
+
state = gr.State([])
|
| 33 |
+
output = gr.Textbox(label="Output")
|
| 34 |
+
|
| 35 |
+
def update_output(api_key, message, state):
|
| 36 |
+
response = chat_with_api_key(api_key, message, state)
|
| 37 |
+
state.append((message, response))
|
| 38 |
+
return response, state
|
| 39 |
+
|
| 40 |
+
btn = gr.Button("Submit")
|
| 41 |
+
btn.click(update_output, inputs=[api_key, message, state], outputs=[output, state])
|
| 42 |
+
|
| 43 |
+
demo.launch()
|
app copy 5.py
ADDED
|
@@ -0,0 +1,100 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
from openai import OpenAI
|
| 2 |
+
import gradio as gr
|
| 3 |
+
from transformers import pipeline
|
| 4 |
+
import numpy as np
|
| 5 |
+
|
| 6 |
+
transcriber = pipeline("automatic-speech-recognition", model="openai/whisper-base.en")
|
| 7 |
+
qa_model = pipeline("question-answering", model="distilbert-base-cased-distilled-squad")
|
| 8 |
+
|
| 9 |
+
def predict(message, history, api_key):
|
| 10 |
+
print('in predict')
|
| 11 |
+
client = OpenAI(api_key=api_key)
|
| 12 |
+
history_openai_format = []
|
| 13 |
+
if 0:
|
| 14 |
+
for human, assistant in history:
|
| 15 |
+
history_openai_format.append({"role": "user", "content": human})
|
| 16 |
+
history_openai_format.append({"role": "assistant", "content": assistant})
|
| 17 |
+
history_openai_format.append({"role": "user", "content": message})
|
| 18 |
+
|
| 19 |
+
response = client.chat.completions.create(
|
| 20 |
+
model='gpt-4o',
|
| 21 |
+
messages=history_openai_format,
|
| 22 |
+
temperature=1.0,
|
| 23 |
+
stream=True
|
| 24 |
+
)
|
| 25 |
+
|
| 26 |
+
partial_message = ""
|
| 27 |
+
for chunk in response:
|
| 28 |
+
if chunk.choices[0].delta.content:
|
| 29 |
+
print(111, chunk.choices[0].delta.content)
|
| 30 |
+
partial_message += chunk.choices[0].delta.content
|
| 31 |
+
yield partial_message
|
| 32 |
+
|
| 33 |
+
def chat_with_api_key(api_key, message, history):
|
| 34 |
+
print('in chat_with_api_key')
|
| 35 |
+
accumulated_message = ""
|
| 36 |
+
for partial_message in predict(message, history, api_key):
|
| 37 |
+
accumulated_message = partial_message
|
| 38 |
+
history.append((message, accumulated_message))
|
| 39 |
+
yield accumulated_message, history
|
| 40 |
+
|
| 41 |
+
def transcribe(audio):
|
| 42 |
+
if audio is None:
|
| 43 |
+
return "No audio recorded."
|
| 44 |
+
sr, y = audio
|
| 45 |
+
y = y.astype(np.float32)
|
| 46 |
+
y /= np.max(np.abs(y))
|
| 47 |
+
|
| 48 |
+
return transcriber({"sampling_rate": sr, "raw": y})["text"]
|
| 49 |
+
|
| 50 |
+
def answer(transcription):
|
| 51 |
+
context = "You are chatbot answering general questions"
|
| 52 |
+
print(transcription)
|
| 53 |
+
result = qa_model(question=transcription, context=context)
|
| 54 |
+
print(result)
|
| 55 |
+
return result['answer']
|
| 56 |
+
|
| 57 |
+
|
| 58 |
+
|
| 59 |
+
def clear_all():
|
| 60 |
+
return None, "", ""
|
| 61 |
+
|
| 62 |
+
with gr.Blocks() as demo:
|
| 63 |
+
with gr.Row():
|
| 64 |
+
api_key = gr.Textbox(label="API Key", placeholder="Enter your API key", type="password")
|
| 65 |
+
message = gr.Textbox(label="Message")
|
| 66 |
+
|
| 67 |
+
gr.Markdown("# Audio Transcription and Question Answering")
|
| 68 |
+
with gr.Row():
|
| 69 |
+
audio_input = gr.Audio(label="Audio Input", sources=["microphone"], type="numpy")
|
| 70 |
+
with gr.Column():
|
| 71 |
+
transcription_output = gr.Textbox(label="Transcription")
|
| 72 |
+
clear_button = gr.Button("Clear")
|
| 73 |
+
state = gr.State([])
|
| 74 |
+
output = gr.Textbox(label="Output", lines=10)
|
| 75 |
+
|
| 76 |
+
def update_output(api_key, audio_input, state):
|
| 77 |
+
print('in update_output')
|
| 78 |
+
message = transcribe(audio_input)
|
| 79 |
+
responses = chat_with_api_key(api_key, message, state)
|
| 80 |
+
accumulated_response = ""
|
| 81 |
+
for response, updated_state in responses:
|
| 82 |
+
accumulated_response = response
|
| 83 |
+
yield accumulated_response, updated_state
|
| 84 |
+
|
| 85 |
+
btn = gr.Button("Submit")
|
| 86 |
+
btn.click(update_output, inputs=[api_key, message, state], outputs=[output, state])
|
| 87 |
+
|
| 88 |
+
audio_input.stop_recording(
|
| 89 |
+
fn=update_output,
|
| 90 |
+
inputs=[api_key, audio_input, state],
|
| 91 |
+
outputs=[output, state]
|
| 92 |
+
)
|
| 93 |
+
|
| 94 |
+
clear_button.click(
|
| 95 |
+
fn=clear_all,
|
| 96 |
+
inputs=[],
|
| 97 |
+
outputs=[audio_input, transcription_output, output]
|
| 98 |
+
)
|
| 99 |
+
|
| 100 |
+
demo.launch()
|
app copy 6_blocked_scroll.py
ADDED
|
@@ -0,0 +1,102 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import gradio as gr
|
| 2 |
+
from transformers import pipeline
|
| 3 |
+
import numpy as np
|
| 4 |
+
from openai import OpenAI
|
| 5 |
+
|
| 6 |
+
transcriber = pipeline("automatic-speech-recognition", model="openai/whisper-base.en")
|
| 7 |
+
qa_model = pipeline("question-answering", model="distilbert-base-cased-distilled-squad")
|
| 8 |
+
|
| 9 |
+
def predict(message, history, api_key):
|
| 10 |
+
print('in predict')
|
| 11 |
+
client = OpenAI(api_key=api_key)
|
| 12 |
+
history_openai_format = []
|
| 13 |
+
for human, assistant in history:
|
| 14 |
+
history_openai_format.append({"role": "user", "content": human})
|
| 15 |
+
history_openai_format.append({"role": "assistant", "content": assistant})
|
| 16 |
+
history_openai_format.append({"role": "user", "content": message})
|
| 17 |
+
|
| 18 |
+
response = client.chat.completions.create(
|
| 19 |
+
model='gpt-4o',
|
| 20 |
+
messages=history_openai_format,
|
| 21 |
+
temperature=1.0,
|
| 22 |
+
stream=True
|
| 23 |
+
)
|
| 24 |
+
|
| 25 |
+
partial_message = ""
|
| 26 |
+
for chunk in response:
|
| 27 |
+
if chunk.choices[0].delta.content:
|
| 28 |
+
print(111, chunk.choices[0].delta.content)
|
| 29 |
+
partial_message += chunk.choices[0].delta.content
|
| 30 |
+
yield partial_message
|
| 31 |
+
|
| 32 |
+
def chat_with_api_key(api_key, message, history):
|
| 33 |
+
print('in chat_with_api_key')
|
| 34 |
+
accumulated_message = ""
|
| 35 |
+
for partial_message in predict(message, history, api_key):
|
| 36 |
+
accumulated_message = partial_message
|
| 37 |
+
history.append((message, accumulated_message))
|
| 38 |
+
# yield accumulated_message, history
|
| 39 |
+
yield message,[[message, accumulated_message]]
|
| 40 |
+
|
| 41 |
+
def transcribe(audio):
|
| 42 |
+
if audio is None:
|
| 43 |
+
return "No audio recorded."
|
| 44 |
+
sr, y = audio
|
| 45 |
+
y = y.astype(np.float32)
|
| 46 |
+
y /= np.max(np.abs(y))
|
| 47 |
+
|
| 48 |
+
return transcriber({"sampling_rate": sr, "raw": y})["text"]
|
| 49 |
+
|
| 50 |
+
def answer(transcription):
|
| 51 |
+
context = "You are a chatbot answering general questions"
|
| 52 |
+
result = qa_model(question=transcription, context=context)
|
| 53 |
+
return result['answer']
|
| 54 |
+
|
| 55 |
+
def process_audio(audio):
|
| 56 |
+
if audio is None:
|
| 57 |
+
return "No audio recorded.", []
|
| 58 |
+
transcription = transcribe(audio)
|
| 59 |
+
answer_result = answer(transcription)
|
| 60 |
+
return transcription, [[transcription, answer_result]]
|
| 61 |
+
|
| 62 |
+
def update_output(api_key, audio_input, state):
|
| 63 |
+
print('in update_output')
|
| 64 |
+
message = transcribe(audio_input)
|
| 65 |
+
responses = chat_with_api_key(api_key, message, state)
|
| 66 |
+
accumulated_response = ""
|
| 67 |
+
for response, updated_state in responses:
|
| 68 |
+
accumulated_response = response
|
| 69 |
+
yield accumulated_response, updated_state
|
| 70 |
+
|
| 71 |
+
def clear_all():
|
| 72 |
+
return None, "", []
|
| 73 |
+
|
| 74 |
+
with gr.Blocks() as demo:
|
| 75 |
+
answer_output = gr.Chatbot(label="Answer Result")
|
| 76 |
+
with gr.Row():
|
| 77 |
+
audio_input = gr.Audio(label="Audio Input", sources=["microphone"], type="numpy")
|
| 78 |
+
with gr.Column():
|
| 79 |
+
api_key = gr.Textbox(label="API Key", placeholder="Enter your API key", type="password")
|
| 80 |
+
transcription_output = gr.Textbox(label="Transcription")
|
| 81 |
+
clear_button = gr.Button("Clear")
|
| 82 |
+
state = gr.State([])
|
| 83 |
+
if 1:
|
| 84 |
+
audio_input.stop_recording(
|
| 85 |
+
fn=update_output,
|
| 86 |
+
inputs=[api_key, audio_input, state],
|
| 87 |
+
outputs=[transcription_output, answer_output]
|
| 88 |
+
)
|
| 89 |
+
if 0:
|
| 90 |
+
audio_input.stop_recording(
|
| 91 |
+
fn=process_audio,
|
| 92 |
+
inputs=[audio_input],
|
| 93 |
+
outputs=[transcription_output, answer_output]
|
| 94 |
+
)
|
| 95 |
+
|
| 96 |
+
clear_button.click(
|
| 97 |
+
fn=clear_all,
|
| 98 |
+
inputs=[],
|
| 99 |
+
outputs=[audio_input, transcription_output, answer_output]
|
| 100 |
+
)
|
| 101 |
+
|
| 102 |
+
demo.launch()
|
app copy 6_record_chatbot.py
ADDED
|
@@ -0,0 +1,53 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import gradio as gr
|
| 2 |
+
from transformers import pipeline
|
| 3 |
+
import numpy as np
|
| 4 |
+
|
| 5 |
+
transcriber = pipeline("automatic-speech-recognition", model="openai/whisper-base.en")
|
| 6 |
+
qa_model = pipeline("question-answering", model="distilbert-base-cased-distilled-squad")
|
| 7 |
+
|
| 8 |
+
def transcribe(audio):
|
| 9 |
+
if audio is None:
|
| 10 |
+
return "No audio recorded."
|
| 11 |
+
sr, y = audio
|
| 12 |
+
y = y.astype(np.float32)
|
| 13 |
+
y /= np.max(np.abs(y))
|
| 14 |
+
|
| 15 |
+
return transcriber({"sampling_rate": sr, "raw": y})["text"]
|
| 16 |
+
|
| 17 |
+
def answer(transcription):
|
| 18 |
+
context = "You are a chatbot answering general questions"
|
| 19 |
+
result = qa_model(question=transcription, context=context)
|
| 20 |
+
return result['answer']
|
| 21 |
+
|
| 22 |
+
def process_audio(audio):
|
| 23 |
+
if audio is None:
|
| 24 |
+
return "No audio recorded.", []
|
| 25 |
+
transcription = transcribe(audio)
|
| 26 |
+
answer_result = answer(transcription)
|
| 27 |
+
return transcription, [[transcription, answer_result]]
|
| 28 |
+
|
| 29 |
+
def clear_all():
|
| 30 |
+
return None, "", []
|
| 31 |
+
|
| 32 |
+
with gr.Blocks() as demo:
|
| 33 |
+
gr.Markdown("# Audio Transcription and Question Answering")
|
| 34 |
+
|
| 35 |
+
audio_input = gr.Audio(label="Audio Input", sources=["microphone"], type="numpy")
|
| 36 |
+
transcription_output = gr.Textbox(label="Transcription")
|
| 37 |
+
answer_output = gr.Chatbot(label="Answer Result")
|
| 38 |
+
|
| 39 |
+
clear_button = gr.Button("Clear")
|
| 40 |
+
|
| 41 |
+
audio_input.stop_recording(
|
| 42 |
+
fn=process_audio,
|
| 43 |
+
inputs=[audio_input],
|
| 44 |
+
outputs=[transcription_output, answer_output]
|
| 45 |
+
)
|
| 46 |
+
|
| 47 |
+
clear_button.click(
|
| 48 |
+
fn=clear_all,
|
| 49 |
+
inputs=[],
|
| 50 |
+
outputs=[audio_input, transcription_output, answer_output]
|
| 51 |
+
)
|
| 52 |
+
|
| 53 |
+
demo.launch()
|
app copy 6_working.py
ADDED
|
@@ -0,0 +1,102 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import gradio as gr
|
| 2 |
+
from transformers import pipeline
|
| 3 |
+
import numpy as np
|
| 4 |
+
from openai import OpenAI
|
| 5 |
+
|
| 6 |
+
transcriber = pipeline("automatic-speech-recognition", model="openai/whisper-base.en")
|
| 7 |
+
qa_model = pipeline("question-answering", model="distilbert-base-cased-distilled-squad")
|
| 8 |
+
|
| 9 |
+
def predict(message, history, api_key):
|
| 10 |
+
print('in predict')
|
| 11 |
+
client = OpenAI(api_key=api_key)
|
| 12 |
+
history_openai_format = []
|
| 13 |
+
for human, assistant in history:
|
| 14 |
+
history_openai_format.append({"role": "user", "content": human})
|
| 15 |
+
history_openai_format.append({"role": "assistant", "content": assistant})
|
| 16 |
+
history_openai_format.append({"role": "user", "content": message})
|
| 17 |
+
|
| 18 |
+
response = client.chat.completions.create(
|
| 19 |
+
model='gpt-4o',
|
| 20 |
+
messages=history_openai_format,
|
| 21 |
+
temperature=1.0,
|
| 22 |
+
stream=True
|
| 23 |
+
)
|
| 24 |
+
|
| 25 |
+
partial_message = ""
|
| 26 |
+
for chunk in response:
|
| 27 |
+
if chunk.choices[0].delta.content:
|
| 28 |
+
print(111, chunk.choices[0].delta.content)
|
| 29 |
+
partial_message += chunk.choices[0].delta.content
|
| 30 |
+
yield partial_message
|
| 31 |
+
|
| 32 |
+
def chat_with_api_key(api_key, message, history):
|
| 33 |
+
print('in chat_with_api_key')
|
| 34 |
+
accumulated_message = ""
|
| 35 |
+
for partial_message in predict(message, history, api_key):
|
| 36 |
+
accumulated_message = partial_message
|
| 37 |
+
history.append((message, accumulated_message))
|
| 38 |
+
# yield accumulated_message, history
|
| 39 |
+
yield message,[[message, accumulated_message]]
|
| 40 |
+
|
| 41 |
+
def transcribe(audio):
|
| 42 |
+
if audio is None:
|
| 43 |
+
return "No audio recorded."
|
| 44 |
+
sr, y = audio
|
| 45 |
+
y = y.astype(np.float32)
|
| 46 |
+
y /= np.max(np.abs(y))
|
| 47 |
+
|
| 48 |
+
return transcriber({"sampling_rate": sr, "raw": y})["text"]
|
| 49 |
+
|
| 50 |
+
def answer(transcription):
|
| 51 |
+
context = "You are a chatbot answering general questions"
|
| 52 |
+
result = qa_model(question=transcription, context=context)
|
| 53 |
+
return result['answer']
|
| 54 |
+
|
| 55 |
+
def process_audio(audio):
|
| 56 |
+
if audio is None:
|
| 57 |
+
return "No audio recorded.", []
|
| 58 |
+
transcription = transcribe(audio)
|
| 59 |
+
answer_result = answer(transcription)
|
| 60 |
+
return transcription, [[transcription, answer_result]]
|
| 61 |
+
|
| 62 |
+
def update_output(api_key, audio_input, state):
|
| 63 |
+
print('in update_output')
|
| 64 |
+
message = transcribe(audio_input)
|
| 65 |
+
responses = chat_with_api_key(api_key, message, state)
|
| 66 |
+
accumulated_response = ""
|
| 67 |
+
for response, updated_state in responses:
|
| 68 |
+
accumulated_response = response
|
| 69 |
+
yield accumulated_response, updated_state
|
| 70 |
+
|
| 71 |
+
def clear_all():
|
| 72 |
+
return None, "", []
|
| 73 |
+
|
| 74 |
+
with gr.Blocks() as demo:
|
| 75 |
+
answer_output = gr.Chatbot(label="Answer Result")
|
| 76 |
+
with gr.Row():
|
| 77 |
+
audio_input = gr.Audio(label="Audio Input", sources=["microphone"], type="numpy")
|
| 78 |
+
with gr.Column():
|
| 79 |
+
api_key = gr.Textbox(label="API Key", placeholder="Enter your API key", type="password")
|
| 80 |
+
transcription_output = gr.Textbox(label="Transcription")
|
| 81 |
+
clear_button = gr.Button("Clear")
|
| 82 |
+
state = gr.State([])
|
| 83 |
+
if 1:
|
| 84 |
+
audio_input.stop_recording(
|
| 85 |
+
fn=update_output,
|
| 86 |
+
inputs=[api_key, audio_input, state],
|
| 87 |
+
outputs=[transcription_output, answer_output]
|
| 88 |
+
)
|
| 89 |
+
if 0:
|
| 90 |
+
audio_input.stop_recording(
|
| 91 |
+
fn=process_audio,
|
| 92 |
+
inputs=[audio_input],
|
| 93 |
+
outputs=[transcription_output, answer_output]
|
| 94 |
+
)
|
| 95 |
+
|
| 96 |
+
clear_button.click(
|
| 97 |
+
fn=clear_all,
|
| 98 |
+
inputs=[],
|
| 99 |
+
outputs=[audio_input, transcription_output, answer_output]
|
| 100 |
+
)
|
| 101 |
+
|
| 102 |
+
demo.launch()
|
app copy _6_working.py
ADDED
|
@@ -0,0 +1,101 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
from openai import OpenAI
|
| 2 |
+
import gradio as gr
|
| 3 |
+
from transformers import pipeline
|
| 4 |
+
import numpy as np
|
| 5 |
+
|
| 6 |
+
transcriber = pipeline("automatic-speech-recognition", model="openai/whisper-base.en")
|
| 7 |
+
qa_model = pipeline("question-answering", model="distilbert-base-cased-distilled-squad")
|
| 8 |
+
|
| 9 |
+
def predict(message, history, api_key):
|
| 10 |
+
print('in predict')
|
| 11 |
+
client = OpenAI(api_key=api_key)
|
| 12 |
+
history_openai_format = []
|
| 13 |
+
if 0:
|
| 14 |
+
for human, assistant in history:
|
| 15 |
+
history_openai_format.append({"role": "user", "content": human})
|
| 16 |
+
history_openai_format.append({"role": "assistant", "content": assistant})
|
| 17 |
+
history_openai_format.append({"role": "user", "content": message})
|
| 18 |
+
|
| 19 |
+
response = client.chat.completions.create(
|
| 20 |
+
model='gpt-4o',
|
| 21 |
+
messages=history_openai_format,
|
| 22 |
+
temperature=1.0,
|
| 23 |
+
stream=True
|
| 24 |
+
)
|
| 25 |
+
|
| 26 |
+
partial_message = ""
|
| 27 |
+
for chunk in response:
|
| 28 |
+
if chunk.choices[0].delta.content:
|
| 29 |
+
print(111, chunk.choices[0].delta.content)
|
| 30 |
+
partial_message += chunk.choices[0].delta.content
|
| 31 |
+
yield partial_message
|
| 32 |
+
|
| 33 |
+
def chat_with_api_key(api_key, message, history):
|
| 34 |
+
print('in chat_with_api_key')
|
| 35 |
+
accumulated_message = ""
|
| 36 |
+
for partial_message in predict(message, history, api_key):
|
| 37 |
+
accumulated_message = partial_message
|
| 38 |
+
history.append((message, accumulated_message))
|
| 39 |
+
yield accumulated_message, history
|
| 40 |
+
|
| 41 |
+
def transcribe(audio):
|
| 42 |
+
if audio is None:
|
| 43 |
+
return "No audio recorded."
|
| 44 |
+
sr, y = audio
|
| 45 |
+
y = y.astype(np.float32)
|
| 46 |
+
y /= np.max(np.abs(y))
|
| 47 |
+
|
| 48 |
+
return transcriber({"sampling_rate": sr, "raw": y})["text"]
|
| 49 |
+
|
| 50 |
+
|
| 51 |
+
|
| 52 |
+
|
| 53 |
+
def clear_all():
|
| 54 |
+
return None, "", ""
|
| 55 |
+
|
| 56 |
+
with gr.Blocks() as demo:
|
| 57 |
+
#output = gr.Textbox(label="Output", elem_id="output")
|
| 58 |
+
chatbot = gr.Chatbot(label="Chat Output")
|
| 59 |
+
with gr.Row():
|
| 60 |
+
api_key = gr.Textbox(label="API Key", placeholder="Enter your API key", type="password")
|
| 61 |
+
message = gr.Textbox(label="Message")
|
| 62 |
+
|
| 63 |
+
gr.Markdown("# Audio Transcription and Question Answering")
|
| 64 |
+
with gr.Row():
|
| 65 |
+
audio_input = gr.Audio(label="Audio Input", sources=["microphone"], type="numpy")
|
| 66 |
+
with gr.Column():
|
| 67 |
+
transcription_output = gr.Textbox(label="Transcription")
|
| 68 |
+
clear_button = gr.Button("Clear")
|
| 69 |
+
state = gr.State([])
|
| 70 |
+
|
| 71 |
+
|
| 72 |
+
def update_output(api_key, audio_input, state):
|
| 73 |
+
print('in update_output')
|
| 74 |
+
message = transcribe(audio_input)
|
| 75 |
+
responses = chat_with_api_key(api_key, message, state)
|
| 76 |
+
accumulated_response = ""
|
| 77 |
+
for response, updated_state in responses:
|
| 78 |
+
accumulated_response = response
|
| 79 |
+
yield accumulated_response, updated_state
|
| 80 |
+
|
| 81 |
+
btn = gr.Button("Submit")
|
| 82 |
+
btn.click(update_output, inputs=[api_key, message, state], outputs=[chatbot, state])
|
| 83 |
+
|
| 84 |
+
audio_input.stop_recording(
|
| 85 |
+
fn=update_output,
|
| 86 |
+
inputs=[api_key, audio_input, state],
|
| 87 |
+
outputs=[chatbot, state]
|
| 88 |
+
)
|
| 89 |
+
|
| 90 |
+
clear_button.click(
|
| 91 |
+
fn=clear_all,
|
| 92 |
+
inputs=[],
|
| 93 |
+
outputs=[audio_input, transcription_output, chatbot]
|
| 94 |
+
)
|
| 95 |
+
gr.HTML("""
|
| 96 |
+
<style>
|
| 97 |
+
#output {
|
| 98 |
+
overflow-y: auto;
|
| 99 |
+
max-height: 800px;
|
| 100 |
+
}""")
|
| 101 |
+
demo.launch()
|
app.py
CHANGED
|
@@ -1,13 +1,42 @@
|
|
| 1 |
import gradio as gr
|
| 2 |
-
from transformers import pipeline
|
| 3 |
import numpy as np
|
| 4 |
-
import
|
| 5 |
|
| 6 |
transcriber = pipeline("automatic-speech-recognition", model="openai/whisper-base.en")
|
|
|
|
| 7 |
|
| 8 |
-
|
| 9 |
-
|
| 10 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 11 |
|
| 12 |
def transcribe(audio):
|
| 13 |
if audio is None:
|
|
@@ -18,45 +47,51 @@ def transcribe(audio):
|
|
| 18 |
|
| 19 |
return transcriber({"sampling_rate": sr, "raw": y})["text"]
|
| 20 |
|
| 21 |
-
def answer(
|
| 22 |
-
|
| 23 |
-
|
| 24 |
-
|
| 25 |
-
with torch.no_grad():
|
| 26 |
-
output = model.generate(input_ids, max_length=150, num_return_sequences=1,
|
| 27 |
-
temperature=0.7, top_k=50, top_p=0.95)
|
| 28 |
-
|
| 29 |
-
response = tokenizer.decode(output[0], skip_special_tokens=True)
|
| 30 |
-
|
| 31 |
-
# Extract only the answer part
|
| 32 |
-
answer = response.split("A:")[-1].strip()
|
| 33 |
-
print(answer)
|
| 34 |
-
return response
|
| 35 |
|
| 36 |
def process_audio(audio):
|
| 37 |
if audio is None:
|
| 38 |
-
return "No audio recorded.",
|
| 39 |
transcription = transcribe(audio)
|
| 40 |
answer_result = answer(transcription)
|
| 41 |
-
return transcription, answer_result
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 42 |
|
| 43 |
def clear_all():
|
| 44 |
-
return None, "",
|
| 45 |
|
| 46 |
with gr.Blocks() as demo:
|
| 47 |
-
gr.
|
| 48 |
-
|
| 49 |
-
|
| 50 |
-
|
| 51 |
-
|
| 52 |
-
|
| 53 |
-
|
| 54 |
-
|
| 55 |
-
|
| 56 |
-
|
| 57 |
-
|
| 58 |
-
|
| 59 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 60 |
|
| 61 |
clear_button.click(
|
| 62 |
fn=clear_all,
|
|
@@ -64,4 +99,5 @@ with gr.Blocks() as demo:
|
|
| 64 |
outputs=[audio_input, transcription_output, answer_output]
|
| 65 |
)
|
| 66 |
|
| 67 |
-
|
|
|
|
|
|
| 1 |
import gradio as gr
|
| 2 |
+
from transformers import pipeline
|
| 3 |
import numpy as np
|
| 4 |
+
from openai import OpenAI
|
| 5 |
|
| 6 |
transcriber = pipeline("automatic-speech-recognition", model="openai/whisper-base.en")
|
| 7 |
+
qa_model = pipeline("question-answering", model="distilbert-base-cased-distilled-squad")
|
| 8 |
|
| 9 |
+
def predict(message, history, api_key):
|
| 10 |
+
print('in predict')
|
| 11 |
+
client = OpenAI(api_key=api_key)
|
| 12 |
+
history_openai_format = []
|
| 13 |
+
for human, assistant in history:
|
| 14 |
+
history_openai_format.append({"role": "user", "content": human})
|
| 15 |
+
history_openai_format.append({"role": "assistant", "content": assistant})
|
| 16 |
+
history_openai_format.append({"role": "user", "content": message})
|
| 17 |
+
|
| 18 |
+
response = client.chat.completions.create(
|
| 19 |
+
model='gpt-4o',
|
| 20 |
+
messages=history_openai_format,
|
| 21 |
+
temperature=1.0,
|
| 22 |
+
stream=True
|
| 23 |
+
)
|
| 24 |
+
|
| 25 |
+
partial_message = ""
|
| 26 |
+
for chunk in response:
|
| 27 |
+
if chunk.choices[0].delta.content:
|
| 28 |
+
print(111, chunk.choices[0].delta.content)
|
| 29 |
+
partial_message += chunk.choices[0].delta.content
|
| 30 |
+
yield partial_message
|
| 31 |
+
|
| 32 |
+
def chat_with_api_key(api_key, message, history):
|
| 33 |
+
print('in chat_with_api_key')
|
| 34 |
+
accumulated_message = ""
|
| 35 |
+
for partial_message in predict(message, history, api_key):
|
| 36 |
+
accumulated_message = partial_message
|
| 37 |
+
history.append((message, accumulated_message))
|
| 38 |
+
# yield accumulated_message, history
|
| 39 |
+
yield message,[[message, accumulated_message]]
|
| 40 |
|
| 41 |
def transcribe(audio):
|
| 42 |
if audio is None:
|
|
|
|
| 47 |
|
| 48 |
return transcriber({"sampling_rate": sr, "raw": y})["text"]
|
| 49 |
|
| 50 |
+
def answer(transcription):
|
| 51 |
+
context = "You are a chatbot answering general questions"
|
| 52 |
+
result = qa_model(question=transcription, context=context)
|
| 53 |
+
return result['answer']
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 54 |
|
| 55 |
def process_audio(audio):
|
| 56 |
if audio is None:
|
| 57 |
+
return "No audio recorded.", []
|
| 58 |
transcription = transcribe(audio)
|
| 59 |
answer_result = answer(transcription)
|
| 60 |
+
return transcription, [[transcription, answer_result]]
|
| 61 |
+
|
| 62 |
+
def update_output(api_key, audio_input, state):
|
| 63 |
+
print('in update_output')
|
| 64 |
+
message = transcribe(audio_input)
|
| 65 |
+
responses = chat_with_api_key(api_key, message, state)
|
| 66 |
+
accumulated_response = ""
|
| 67 |
+
for response, updated_state in responses:
|
| 68 |
+
accumulated_response = response
|
| 69 |
+
yield accumulated_response, updated_state
|
| 70 |
|
| 71 |
def clear_all():
|
| 72 |
+
return None, "", []
|
| 73 |
|
| 74 |
with gr.Blocks() as demo:
|
| 75 |
+
answer_output = gr.Chatbot(label="Answer Result")
|
| 76 |
+
with gr.Row():
|
| 77 |
+
audio_input = gr.Audio(label="Audio Input", sources=["microphone"], type="numpy")
|
| 78 |
+
with gr.Column():
|
| 79 |
+
api_key = gr.Textbox(label="API Key", placeholder="Enter your API key", type="password")
|
| 80 |
+
transcription_output = gr.Textbox(label="Transcription")
|
| 81 |
+
clear_button = gr.Button("Clear")
|
| 82 |
+
state = gr.State([])
|
| 83 |
+
if 1:
|
| 84 |
+
audio_input.stop_recording(
|
| 85 |
+
fn=update_output,
|
| 86 |
+
inputs=[api_key, audio_input, state],
|
| 87 |
+
outputs=[transcription_output, answer_output]
|
| 88 |
+
)
|
| 89 |
+
if 0:
|
| 90 |
+
audio_input.stop_recording(
|
| 91 |
+
fn=process_audio,
|
| 92 |
+
inputs=[audio_input],
|
| 93 |
+
outputs=[transcription_output, answer_output]
|
| 94 |
+
)
|
| 95 |
|
| 96 |
clear_button.click(
|
| 97 |
fn=clear_all,
|
|
|
|
| 99 |
outputs=[audio_input, transcription_output, answer_output]
|
| 100 |
)
|
| 101 |
|
| 102 |
+
|
| 103 |
+
demo.launch()
|
app_Chat_working.py
ADDED
|
@@ -0,0 +1,53 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
from openai import OpenAI
|
| 2 |
+
import gradio as gr
|
| 3 |
+
|
| 4 |
+
def predict(message, history, api_key):
|
| 5 |
+
print('in predict')
|
| 6 |
+
client = OpenAI(api_key=api_key)
|
| 7 |
+
history_openai_format = []
|
| 8 |
+
for human, assistant in history:
|
| 9 |
+
history_openai_format.append({"role": "user", "content": human})
|
| 10 |
+
history_openai_format.append({"role": "assistant", "content": assistant})
|
| 11 |
+
history_openai_format.append({"role": "user", "content": message})
|
| 12 |
+
|
| 13 |
+
response = client.chat.completions.create(
|
| 14 |
+
model='gpt-4o',
|
| 15 |
+
messages=history_openai_format,
|
| 16 |
+
temperature=1.0,
|
| 17 |
+
stream=True
|
| 18 |
+
)
|
| 19 |
+
|
| 20 |
+
partial_message = ""
|
| 21 |
+
for chunk in response:
|
| 22 |
+
if chunk.choices[0].delta.content:
|
| 23 |
+
print(111, chunk.choices[0].delta.content)
|
| 24 |
+
partial_message += chunk.choices[0].delta.content
|
| 25 |
+
yield partial_message
|
| 26 |
+
|
| 27 |
+
def chat_with_api_key(api_key, message, history):
|
| 28 |
+
print('in chat_with_api_key')
|
| 29 |
+
accumulated_message = ""
|
| 30 |
+
for partial_message in predict(message, history, api_key):
|
| 31 |
+
accumulated_message = partial_message
|
| 32 |
+
history.append((message, accumulated_message))
|
| 33 |
+
yield accumulated_message, history
|
| 34 |
+
|
| 35 |
+
with gr.Blocks() as demo:
|
| 36 |
+
with gr.Row():
|
| 37 |
+
api_key = gr.Textbox(label="API Key", placeholder="Enter your API key", type="password")
|
| 38 |
+
message = gr.Textbox(label="Message")
|
| 39 |
+
state = gr.State([])
|
| 40 |
+
output = gr.Textbox(label="Output", lines=10)
|
| 41 |
+
|
| 42 |
+
def update_output(api_key, message, state):
|
| 43 |
+
print('in update_output')
|
| 44 |
+
responses = chat_with_api_key(api_key, message, state)
|
| 45 |
+
accumulated_response = ""
|
| 46 |
+
for response, updated_state in responses:
|
| 47 |
+
accumulated_response = response
|
| 48 |
+
yield accumulated_response, updated_state
|
| 49 |
+
|
| 50 |
+
btn = gr.Button("Submit")
|
| 51 |
+
btn.click(update_output, inputs=[api_key, message, state], outputs=[output, state])
|
| 52 |
+
|
| 53 |
+
demo.launch()
|