.. include:: /index.rst
:start-after: start_hello_message
:end-before: end_hello_message
.. _py_ai_health_assistant:
(Beispiel) AI-Gesundheitsassistent mit Temperaturüberwachung
=======================================================================
**Einführung**
Dieses Projekt erstellt einen intelligenten **AI-Gesundheitsassistenten**, der Körpertemperaturmessung mit Sprachinteraktion kombiniert, um personalisierte Gesundheitseinschätzungen zu liefern. Das System integriert:
1. **Thermistorbasierte Temperaturmessung** für eine präzise Erfassung der Körpertemperatur
2. **Spracherkennung** zum Verstehen von Symptomen und Anfragen des Benutzers
3. **AI-gestützte Gesundheitsanalyse** mit OpenAI GPT zur medizinischen Einschätzung
4. **Text-to-Speech-Feedback** für hörbare Gesundheitsempfehlungen
5. **Echtzeitüberwachung** mit kontinuierlicher Temperaturumrechnung
.. raw:: html
Der Gesundheitsassistent misst die Körpertemperatur über eine Thermistorschaltung, analysiert den Messwert mit AI und gibt auf Grundlage etablierter medizinischer Temperaturbereiche passende Gesundheitshinweise.
* :ref:`py_online_llm`
* :ref:`py_stt_whisper`
* :ref:`tts_espeak_pico2wave`
* :ref:`py_thermistor`
----------------------------------------------
**Was Sie benötigen**
Für dieses Projekt werden die folgenden Komponenten benötigt:
.. list-table::
:widths: 30 20
:header-rows: 1
* - COMPONENT
- PURCHASE LINK
* - :ref:`cpn_thermistor`
- |link_thermistor_buy|
* - :ref:`cpn_resistor`
- |link_resistor_buy| (10kΩ)
* - :ref:`cpn_fusion_hat`
- \-
* - :ref:`cpn_wires`
- |link_wires_buy|
* - Raspberry Pi
- \-
----------------------------------------------
**Schaltplan**
Verbinden Sie die Komponenten wie folgt mit dem Fusion HAT+:
.. image:: img/fzz/health_assistant_bb.png
:width: 80%
:align: center
----------------------------------------------
.. include:: python_online_llms.rst
:start-after: start_setup_openai
:end-before: end_setup_openai
----------------------------------------------
**Beispiel ausführen**
#. Code ausführen
.. raw:: html
.. code-block:: shell
cd ~/ai-lab-kit/llm
sudo python3 llm_openai_health.py
#. Ergebnis prüfen
Wenn das Programm startet, werden Sie aufgefordert zu sprechen. Anschließend schätzt es Ihre Körpertemperatur
und gibt passende Gesundheitshinweise aus.
Typische Konsolenausgabe:
.. code-block:: text
Hello, I am a health assistant. Please hold your thermometer and I will assess your
body temperature based on the thermistor reading. If you feel unwell, please provide
your symptoms and I will provide appropriate health advice.
Say something
partial: I feel
partial: I feel very
partial: I feel very warm
final: I feel very warm and tired
Your body temperature is 38.7°C, which indicates a mild fever. Please rest, stay
hydrated, and monitor your symptoms. If the fever persists or worsens, consider
seeking medical attention.
#. Beispiel-Szenarien
* Normale Temperatur (36.5°C):
.. code-block:: text
User: "How's my temperature?"
AI: "Your body temperature is 36.5°C, which is within the normal range. You're
doing well, but continue to monitor how you feel."
* Hohes Fieber (39.2°C):
.. code-block:: text
User: "I have a headache and feel hot"
AI: "Your body temperature is 39.2°C, indicating a high fever. Please rest
immediately, stay hydrated, and consider seeking medical advice as soon as possible."
* Niedrige Temperatur (34.2°C):
.. code-block:: text
User: "I feel cold and shivering"
AI: "Your body temperature is 34.2°C, which is below normal and may indicate
hypothermia. Please warm up immediately with blankets and warm drinks."
**Code**
Hier ist das vollständige Python-Skript für den AI-Gesundheitsassistenten:
.. raw:: html
.. code-block:: python
from fusion_hat.llm import OpenAI
from secret import OPENAI_API_KEY
import time
from fusion_hat.stt import STT
from fusion_hat.adc import ADC
import math
from fusion_hat.tts import Pico2Wave
# Setup Text-to-Speech and Speech-to-Text
tts = Pico2Wave()
tts.set_lang('en-US')
stt = STT(language="en-us")
# Register OpenAI API
# openai.com
# Export your openai api key with :LLM_API_KEY
# export LLM_API_KEY=sk-xxxxxxxxxxxxxxxxx
# Setup ADC for thermistor reading on channel A3
thermistor = ADC('A3')
# Setup LLM with health assessment instructions
INSTRUCTIONS = '''
You are a health assistant. Your task is to assess the user's body temperature based on the thermistor reading and provide appropriate health advice.
The thermistor reading represents body temperature in Celsius.
### Input Format:
"thermistor: [value], message: [user query]"
### Output Guidelines:
1. If temperature < 35.0°C, warn about hypothermia and suggest warming up.
2. If 35.0°C ≤ temperature ≤ 37.5°C, confirm normal temperature and reassure the user.
3. If 37.5°C < temperature ≤ 38.5°C, indicate mild fever and suggest rest and hydration.
4. If temperature > 38.5°C, alert about high fever and recommend medical attention.
5. Include the temperature value in your response to justify your assessment.
6. Your reply should be brief and concise, no more than two sentences.
### Example Input:
thermistor: 39.0, message: I feel unwell.
### Example Output:
Your body temperature is 39.0°C, which indicates a high fever. Please rest, stay hydrated, and consider seeking medical advice if symptoms persist.
'''
WELCOME = "Hello, I am a health assistant. Please hold your thermometer and I will assess your body temperature based on the thermistor reading. If you feel unwell, please provide your symptoms and I will provide appropriate health advice."
llm = OpenAI(
api_key=OPENAI_API_KEY,
model="gpt-4o",
)
# Set how many messages to keep
llm.set_max_messages(20)
# Set instructions
llm.set_instructions(INSTRUCTIONS)
# Set welcome message
llm.set_welcome(WELCOME)
print(WELCOME)
# Function to read and convert thermistor value to temperature
def temperature():
while True:
# Read analog value (0-4095)
analogVal = thermistor.read()
# Calculate voltage across thermistor
Vr = 3.3 * float(analogVal) / 4095
# Check for sensor issues
if 3.3 - Vr < 0.1:
print("Please check the sensor")
continue
# Calculate thermistor resistance
Rt = 10000 * Vr / (3.3 - Vr)
# Convert resistance to temperature using Steinhart-Hart equation
# B = 3950 (thermistor coefficient), R0 = 10000Ω at 25°C
temp = 1 / (((math.log(Rt / 10000)) / 3950) + (1 / (273.15 + 25)))
# Convert from Kelvin to Celsius
Cel = temp - 273.15
return Cel
# Main loop for voice interaction
while True:
print("Say something")
# Listen for speech input
for result in stt.listen(stream=True):
if result["done"]:
# Print final recognized text
print(f"\r\x1b[Kfinal: {result['final']}")
# Measure temperature and combine with user query
current_temp = temperature()
input_text = f"thermistor: {current_temp:.1f}, message: {result['final']}"
# Get response from LLM with streaming
response = llm.prompt(input_text, stream=True)
# Collect the full response
string = ""
for next_word in response:
if next_word:
print(next_word, end="", flush=True)
string += next_word
# Speak the response
tts.say(string)
print("") # New line after response
else:
# Print partial recognition results
print(f"\r\x1b[Kpartial: {result['partial']}", end="", flush=True)
----------------------------------------------
**Code verstehen**
1. Initialisierung des Temperatursensors
Der Thermistor ist mit dem ADC-Kanal A3 verbunden:
.. code-block:: python
thermistor = ADC('A3')
Dadurch werden analoge Werte von 0–4095 gelesen, die Spannungspegel repräsentieren.
2. Temperaturumrechnung mit der Steinhart-Hart-Gleichung
Der Thermistor verwendet die Steinhart-Hart-Gleichung für eine präzise Temperaturberechnung:
.. code-block:: python
# Analogen Wert lesen (0–4095)
analogVal = thermistor.read()
# In Spannung umrechnen (0–3.3 V)
Vr = 3.3 * float(analogVal) / 4095
# Thermistorwiderstand mit Spannungsteilerformel berechnen
Rt = 10000 * Vr / (3.3 - Vr)
# Steinhart-Hart-Gleichung: 1/T = 1/T0 + 1/B * ln(R/R0)
temp = 1 / (((math.log(Rt / 10000)) / 3950) + (1 / (273.15 + 25)))
# Kelvin in Celsius umrechnen
Cel = temp - 273.15
3. Sensor-Fehlerprüfung
Der Code enthält eine grundlegende Fehlererkennung:
.. code-block:: python
if 3.3 - Vr < 0.1:
print("Please check the sensor")
continue
Damit wird erkannt, ob der Thermistor getrennt oder kurzgeschlossen ist.
4. Einrichtung der Spracherkennung
Sowohl STT als auch TTS sind für Englisch konfiguriert:
.. code-block:: python
tts = Pico2Wave()
tts.set_lang('en-US')
stt = STT(language="en-us")
5. Aufbau der kontextbezogenen Eingabe
Die Temperaturdaten werden mit der Benutzeranfrage kombiniert:
.. code-block:: python
current_temp = temperature()
input_text = f"thermistor: {current_temp:.1f}, message: {result['final']}"
Format: ``"thermistor: 37.2, message: I feel dizzy"``
6. Medizinische Klassifikationslogik
Die AI-Anweisungen definieren Temperaturbereiche:
.. code-block:: python
# Temperaturbereiche für medizinische Einschätzung:
# < 35.0°C: Warnung vor Unterkühlung
# 35.0–37.5°C: Normalbereich
# 37.5–38.5°C: Leichtes Fieber
# > 38.5°C: Hohes Fieber
7. Sprachverarbeitung in Echtzeit
Das System zeigt Teilergebnisse der Spracherkennung an:
.. code-block:: python
for result in stt.listen(stream=True):
if result["done"]:
# Endgültige Erkennung
print(f"final: {result['final']}")
else:
# Teilweise Erkennung
print(f"partial: {result['partial']}", end="", flush=True)
8. Gestreamte AI-Antwort
Die AI-Antwort wird gestreamt und anschließend gesprochen:
.. code-block:: python
response = llm.prompt(input_text, stream=True)
string = ""
for next_word in response:
if next_word:
print(next_word, end="", flush=True)
string += next_word
tts.say(string) # Vollständige Antwort sprechen
9. Temperaturformatierung
Die Temperatur wird auf eine Dezimalstelle formatiert:
.. code-block:: python
f"thermistor: {current_temp:.1f}"
Dadurch wird eine konsistente Genauigkeit sichergestellt (z. B. 36.5°C statt 36.512345°C).
10. Saubere Konsolenausgabe
Verwendet ANSI-Escape-Codes für eine übersichtliche Ausgabe:
.. code-block:: python
print(f"\r\x1b[Kpartial: {result['partial']}", end="", flush=True)
- ``\r``: Zum Anfang der Zeile zurückkehren
- ``\x1b[K``: Bis zum Zeilenende löschen
- Verhindert überlappenden Text während der Streaming-Ausgabe
----------------------------------------------
**Fehlerbehebung**
- Temperaturmessung ungenau
- Überprüfen Sie die Verdrahtung des Thermistors: korrekte Spannungsteiler-Konfiguration
- Prüfen Sie den Widerstandswert: sollte zum Nennwiderstand des Thermistors passen
- Kalibrieren Sie mit einer bekannten Temperaturquelle
- Überprüfen Sie die Referenzspannung des ADC (sollte stabil bei 3.3 V liegen)
- Keine Spracherkennung
- Mikrofon testen: ``arecord --duration=3 test.wav && aplay test.wav``
- Audiogerät bei der STT-Initialisierung überprüfen
- Hintergrundgeräusche möglichst reduzieren
- Deutlich und in moderatem Tempo sprechen
- AI antwortet nicht
- Internetverbindung überprüfen
- OpenAI-API-Schlüssel in ``secret.py`` kontrollieren
- Sicherstellen, dass im OpenAI-Konto die Abrechnung aktiviert ist
- Prüfen, ob API-Ratenlimits überschritten wurden
- Temperatur springt stark
- Softwarefilter hinzufügen, z. B. gleitenden Mittelwert
- Lose Verbindungen prüfen
- Kondensator (0.1µF) parallel zum Thermistor zur Rauschunterdrückung hinzufügen
- Sicherstellen, dass der Thermistor guten thermischen Kontakt hat
- Text-to-Speech funktioniert nicht
- Audioausgabe testen: ``speaker-test -t sine -f 440``
- Spracheinstellung prüfen: ``tts.set_lang('en-US')``
- Lautstärke prüfen: ``alsamixer``
- Audio-Setup-Skript erneut ausführen: ``sudo /opt/setup_fusion_hat_audio.sh``
- Sensorwert zeigt 0 oder 4095
- Verdrahtung prüfen: Thermistor könnte kurzgeschlossen (0) oder offen (4095) sein
- Berechnung des Spannungsteilers überprüfen
- ADC mit bekannter Spannung testen
- ADC-Kanal prüfen (sollte A3 sein)
**Sicherheits- und medizinischer Hinweis**
.. warning::
Dieses Projekt dient ausschließlich **zu Bildungs- und Demonstrationszwecken**.
Es ist **KEIN medizinisches Gerät** und darf **NICHT** für echte medizinische Diagnosen oder Behandlungen verwendet werden.
#. Sicherheitsrichtlinien
* Nicht für medizinische Nutzung: Treffen Sie keine Gesundheits- oder Behandlungsentscheidungen auf Grundlage dieses Systems.
* Notfälle: Bei ernsthaften Symptomen immer professionelle medizinische Hilfe suchen.
* Genauigkeitsgrenzen: Thermistoren sind weniger genau als medizinische Thermometer.
* Kalibrierung erforderlich: Regelmäßige Kalibrierung mit einem medizinischen Thermometer ist notwendig.
* Aufsicht empfohlen: Bei Nutzung zu Bildungszwecken wird die Aufsicht durch Erwachsene empfohlen.
#. Wann Sie medizinische Hilfe suchen sollten
Suchen Sie professionelle medizinische Hilfe, wenn eines der folgenden Symptome auftritt:
* Temperatur > 39.5°C (103.1°F) bei Erwachsenen
* Temperatur > 38.0°C (100.4°F) bei Säuglingen unter 3 Monaten
* Fieber länger als 3 Tage
* Atembeschwerden oder Brustschmerzen
* Starke Kopfschmerzen oder Nackensteifigkeit
* Verwirrtheit oder Krampfanfälle
----------------------------------------------
Dieser AI-Gesundheitsassistent zeigt, wie Sensortechnologie, Sprachinteraktion und künstliche Intelligenz zusammenarbeiten können, um zugängliche Gesundheitsüberwachungssysteme zu erstellen – während gleichzeitig die Bedeutung professioneller medizinischer Beratung bei ernsthaften Gesundheitsproblemen betont wird.