Spaces:
Sleeping
Sleeping
import streamlit as st | |
import numpy as np | |
import matplotlib.pyplot as plt | |
from PIL import Image, ImageDraw | |
import time | |
from transformers import AutoModelForCausalLM, AutoTokenizer | |
# Constants | |
AVATAR_WIDTH, AVATAR_HEIGHT = 400, 600 | |
# Set up DialoGPT model | |
def load_model(): | |
tokenizer = AutoTokenizer.from_pretrained("microsoft/DialoGPT-medium") | |
model = AutoModelForCausalLM.from_pretrained("microsoft/DialoGPT-medium") | |
return tokenizer, model | |
tokenizer, model = load_model() | |
# Simulated Sensor Classes | |
class Sensors: | |
def measure_pressure(base_sensitivity, duration): | |
return base_sensitivity * (1 - np.exp(-duration / 2)) | |
def measure_temperature(base_temp, duration): | |
return base_temp + 5 * (1 - np.exp(-duration / 3)) | |
def measure_texture(x, y): | |
textures = ["smooth", "rough", "bumpy", "silky", "grainy"] | |
return textures[hash((x, y)) % len(textures)] | |
def measure_em_field(x, y): | |
return np.sin(x/50) * np.cos(y/50) * 10 | |
# Create more detailed sensation map for the avatar | |
def create_sensation_map(width, height): | |
sensation_map = np.zeros((height, width, 7)) # pain, pleasure, pressure, temp, texture, em, tickle | |
for y in range(height): | |
for x in range(width): | |
# Head | |
if 150 < x < 250 and 50 < y < 150: | |
sensation_map[y, x] = [0.7, 0.5, 0.8, 0.6, 0.9, 0.9, 0.3] | |
# Torso | |
elif 175 < x < 225 and 150 < y < 400: | |
sensation_map[y, x] = [0.5, 0.6, 0.7, 0.8, 0.6, 0.7, 0.5] | |
# Arms | |
elif (125 < x < 175 or 225 < x < 275) and 150 < y < 350: | |
sensation_map[y, x] = [0.6, 0.5, 0.9, 0.7, 0.8, 0.6, 0.7] | |
# Hands | |
elif (100 < x < 150 or 250 < x < 300) and 300 < y < 350: | |
sensation_map[y, x] = [0.8, 0.7, 1.0, 0.9, 1.0, 0.8, 0.9] | |
# Legs | |
elif 175 < x < 225 and 400 < y < 550: | |
sensation_map[y, x] = [0.7, 0.4, 0.8, 0.6, 0.7, 0.5, 0.6] | |
# Feet | |
elif 175 < x < 225 and 550 < y < 600: | |
sensation_map[y, x] = [0.9, 0.6, 1.0, 0.8, 0.9, 0.7, 1.0] | |
else: | |
sensation_map[y, x] = [0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1] | |
return sensation_map | |
avatar_sensation_map = create_sensation_map(AVATAR_WIDTH, AVATAR_HEIGHT) | |
# Create more detailed human-like avatar | |
def create_avatar(): | |
img = Image.new('RGB', (AVATAR_WIDTH, AVATAR_HEIGHT), color='white') | |
draw = ImageDraw.Draw(img) | |
# Head | |
draw.ellipse([150, 50, 250, 150], fill='beige', outline='black') | |
# Eyes | |
draw.ellipse([175, 80, 190, 95], fill='white', outline='black') | |
draw.ellipse([210, 80, 225, 95], fill='white', outline='black') | |
draw.ellipse([180, 85, 185, 90], fill='black') | |
draw.ellipse([215, 85, 220, 90], fill='black') | |
# Mouth | |
draw.arc([185, 110, 215, 130], start=0, end=180, fill='black') | |
# Body | |
draw.rectangle([175, 150, 225, 400], fill='beige', outline='black') | |
# Arms | |
draw.rectangle([125, 150, 175, 350], fill='beige', outline='black') | |
draw.rectangle([225, 150, 275, 350], fill='beige', outline='black') | |
# Hands | |
draw.ellipse([100, 300, 150, 350], fill='beige', outline='black') | |
draw.ellipse([250, 300, 300, 350], fill='beige', outline='black') | |
# Legs | |
draw.rectangle([175, 400, 200, 550], fill='beige', outline='black') | |
draw.rectangle([200, 400, 225, 550], fill='beige', outline='black') | |
# Feet | |
draw.ellipse([165, 550, 210, 600], fill='beige', outline='black') | |
draw.ellipse([190, 550, 235, 600], fill='beige', outline='black') | |
return img | |
avatar_image = create_avatar() | |
# Streamlit app | |
st.title("Advanced Humanoid Techno-Sensory Simulation") | |
# Display avatar | |
st.image(avatar_image, use_column_width=True) | |
# Touch input | |
touch_x = st.slider("Touch X coordinate", 0, AVATAR_WIDTH, AVATAR_WIDTH // 2) | |
touch_y = st.slider("Touch Y coordinate", 0, AVATAR_HEIGHT, AVATAR_HEIGHT // 2) | |
# Touch duration | |
touch_duration = st.slider("Touch duration (seconds)", 0.1, 5.0, 1.0, 0.1) | |
if st.button("Apply Touch"): | |
sensation = avatar_sensation_map[touch_y, touch_x] | |
pain, pleasure, pressure_sens, temp_sens, texture_sens, em_sens, tickle_sens = sensation | |
measured_pressure = Sensors.measure_pressure(pressure_sens, touch_duration) | |
measured_temp = Sensors.measure_temperature(37, touch_duration) | |
measured_texture = Sensors.measure_texture(touch_x, touch_y) | |
measured_em = Sensors.measure_em_field(touch_x, touch_y) * em_sens | |
# Calculate overall sensation | |
pain_level = pain * measured_pressure | |
pleasure_level = pleasure * (measured_temp - 37) / 5 | |
tickle_level = tickle_sens * (1 - np.exp(-touch_duration / 0.5)) | |
st.write(f"Touch applied at ({touch_x}, {touch_y}) for {touch_duration:.1f} seconds") | |
st.write(f"Pressure: {measured_pressure:.2f}") | |
st.write(f"Temperature: {measured_temp:.2f}°C") | |
st.write(f"Texture: {measured_texture}") | |
st.write(f"Electromagnetic field: {measured_em:.2f}") | |
st.write(f"Pain level: {pain_level:.2f}") | |
st.write(f"Pleasure level: {pleasure_level:.2f}") | |
st.write(f"Tickle level: {tickle_level:.2f}") | |
# Generate description | |
prompt = f"""Human: Describe the sensation when touched at ({touch_x}, {touch_y}) for {touch_duration:.1f} seconds with these measurements: | |
Pressure: {measured_pressure:.2f} | |
Temperature: {measured_temp:.2f}°C | |
Texture: {measured_texture} | |
Electromagnetic field: {measured_em:.2f} | |
Resulting in: | |
Pain: {pain_level:.2f}, Pleasure: {pleasure_level:.2f}, Tickle: {tickle_level:.2f} | |
Avatar:""" | |
input_ids = tokenizer.encode(prompt, return_tensors="pt") | |
output = model.generate(input_ids, max_length=200, num_return_sequences=1, no_repeat_ngram_size=2, top_k=50, top_p=0.95, temperature=0.7) | |
response = tokenizer.decode(output[0], skip_special_tokens=True).split("Avatar: ")[-1].strip() | |
st.write("Avatar's response:") | |
st.write(response) | |
# Visualize sensation map | |
st.subheader("Sensation Map Visualization") | |
fig, axs = plt.subplots(2, 4, figsize=(20, 10)) | |
titles = ['Pain', 'Pleasure', 'Pressure', 'Temperature', 'Texture', 'EM Field', 'Tickle'] | |
for i, title in enumerate(titles): | |
ax = axs[i // 4, i % 4] | |
im = ax.imshow(avatar_sensation_map[:, :, i], cmap='viridis') | |
ax.set_title(title) | |
fig.colorbar(im, ax=ax) | |
axs[1, 3].axis('off') # Turn off the last unused subplot | |
plt.tight_layout() | |
st.pyplot(fig) | |
st.write("The sensation map shows the sensitivity of different body parts to various stimuli. Brighter colors indicate higher sensitivity.") | |
# Add some context about the avatar's sensory capabilities | |
st.subheader("Avatar Sensory Capabilities") | |
st.write(""" | |
This advanced humanoid avatar is equipped with cutting-edge sensory technology: | |
1. Pressure Sensors: Highly sensitive to touch, with increased sensitivity in hands and feet. | |
2. Temperature Sensors: Can detect slight changes in temperature, simulating human thermal perception. | |
3. Texture Analysis: Capable of distinguishing between various textures, from smooth to rough. | |
4. Electromagnetic Field Detection: Mimics the subtle EM sensitivity some humans report. | |
5. Pain and Pleasure Processing: Simulates the complex interplay of pain and pleasure responses. | |
6. Tickle Sensation: Replicates the unique tickle response, which can be pleasurable or uncomfortable. | |
The avatar's responses are generated using an advanced language model, attempting to describe the sensations in human-like terms. | |
""") | |
# Footer | |
st.write("---") | |
st.write("Advanced Humanoid Techno-Sensory Simulation v1.0") | |
st.write("Disclaimer: This is a simulation and does not represent actual human sensory experiences.") | |