File size: 7,858 Bytes
0611560
c5987cc
58b97f2
d9be852
a750190
9aeacca
0611560
6e1639c
d9be852
0611560
9aeacca
 
 
d9be852
 
9aeacca
 
 
 
d9be852
a750190
 
 
 
d9be852
a750190
 
 
d9be852
a750190
 
 
 
d9be852
a750190
 
 
d9be852
a750190
60e6faa
a750190
60e6faa
 
a750190
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4f53727
60e6faa
 
9aeacca
0611560
a750190
d9be852
 
 
4f53727
d9be852
 
a750190
 
 
 
 
 
 
4f53727
d9be852
 
4f53727
d9be852
 
 
4f53727
a750190
 
 
 
d9be852
 
 
4f53727
a750190
 
 
 
d9be852
 
 
 
6e1639c
d9be852
9aeacca
a750190
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
d9be852
 
 
 
 
a750190
d9be852
4f53727
9aeacca
d9be852
4f53727
a750190
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
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
@st.cache_resource
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:
    @staticmethod
    def measure_pressure(base_sensitivity, duration):
        return base_sensitivity * (1 - np.exp(-duration / 2))

    @staticmethod
    def measure_temperature(base_temp, duration):
        return base_temp + 5 * (1 - np.exp(-duration / 3))

    @staticmethod
    def measure_texture(x, y):
        textures = ["smooth", "rough", "bumpy", "silky", "grainy"]
        return textures[hash((x, y)) % len(textures)]

    @staticmethod
    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.")