Tipps & Tricks

Entwicklung eines Tools zur Analyse von Kundenstimmungen aus Telefonaufzeichnungen

10 min Lesezeit
Entwicklung eines Tools zur Analyse von Kundenstimmungen aus Telefonaufzeichnungen

Jeden Tag zeichnen Kundenservicezentren Tausende von Gesprächen auf. In diesen Audioaufzeichnungen verbergen sich wertvolle Informationen. Sind die Kunden zufrieden? Welche Probleme werden am häufigsten erwähnt? Wie verändern sich die Emotionen während eines Gesprächs?

Die manuelle Analyse dieser Aufzeichnungen ist eine Herausforderung. Mit moderner künstlicher Intelligenz (KI) können wir jedoch Anrufe automatisch transkribieren, Emotionen erkennen und wiederkehrende Themen extrahieren – alles offline und mit Open-Source-Tools.

In diesem Artikel führe ich Sie durch ein vollständiges Projekt zur Analyse von Kundenstimmungen. Sie werden lernen, wie man:

  • Audio-Dateien mit Whisper in Text umwandelt
  • Stimmungen (positiv, negativ, neutral) und Emotionen (Frustration, Zufriedenheit, Dringlichkeit) erkennt
  • Themen automatisch mit BERTopic extrahiert
  • Ergebnisse in einem interaktiven Dashboard anzeigt

Das Beste daran ist, dass alles lokal läuft. Ihre sensiblen Kundendaten verlassen niemals Ihren Computer.

Die folgende Abbildung zeigt eine Übersicht des Dashboards mit einem Stimmungsindikator, einem Emotionsradar und der Themenverteilung.

Die Bedeutung von lokaler KI für Kundendaten

Cloud-basierte KI-Dienste wie die API von OpenAI sind zwar leistungsstark, bringen jedoch Bedenken hinsichtlich der Privatsphäre mit sich, da Kundenanrufe häufig persönliche Informationen enthalten. Zudem können hohe Kosten entstehen, da man pro API-Aufruf zahlt, was sich bei hohen Volumina schnell summiert. Die Abhängigkeit von Internetgeschwindigkeitsbeschränkungen ist ein weiteres Problem. Durch den lokalen Betrieb ist es einfacher, Anforderungen an den Datenstandort zu erfüllen.

Dieses Tutorial zur KI-Spracherkennung hält alles auf Ihrer Hardware. Modelle werden einmal heruntergeladen und laufen dann offline für immer.

Die Systemarchitektur zeigt, wie jede Komponente eine Aufgabe gut bewältigt. Dieses modulare Design macht das System leicht verständlich, testbar und erweiterbar.

Voraussetzungen

Bevor Sie beginnen, stellen Sie sicher, dass Sie Folgendes haben:

  • Python 3.9 oder höher ist auf Ihrem Computer installiert.
  • FFmpeg sollte für die Audioverarbeitung installiert sein.
  • Sie sollten grundlegende Kenntnisse in Python und Konzepten des maschinellen Lernens haben.
  • Sie benötigen etwa 2 GB Speicherplatz für die KI-Modelle.

Einrichtung Ihres Projekts

Klonen Sie das Repository und richten Sie Ihre Umgebung ein:

git clone https://github.com/zenUnicorn/Customer-Sentiment-analyzer.git

Erstellen Sie eine virtuelle Umgebung:

python -m venv venv

Aktivieren Sie die Umgebung (Windows):

.\venv\\Scripts\\Activate

Aktivieren Sie die Umgebung (Mac/Linux):

source venv/bin/activate

Installieren Sie die Abhängigkeiten:

pip install -r requirements.txt

Beim ersten Ausführen werden die KI-Modelle (~1,5 GB insgesamt) heruntergeladen. Danach funktioniert alles offline.

Transkription von Audio mit Whisper

Im Kundenstimmungsanalysator ist der erste Schritt, gesprochene Worte aus Telefonaufzeichnungen in Text umzuwandeln. Dies geschieht mit Whisper, einem automatischen Spracherkennungssystem (ASR), das von OpenAI entwickelt wurde. Lassen Sie uns untersuchen, wie es funktioniert, warum es eine hervorragende Wahl ist und wie wir es im Projekt verwenden.

Whisper ist ein auf Transformatoren basierendes Encoder-Decoder-Modell, das auf 680.000 Stunden mehrsprachiger Audioaufnahmen trainiert wurde. Wenn Sie ihm eine Audiodatei zuführen, erfolgt Folgendes:

  • Die Audiodatei wird auf 16 kHz Mono umgewandelt.
  • Es wird ein Mel-Spektrum erzeugt – eine visuelle Darstellung der Frequenzen über die Zeit, die als Foto des Sounds dient.
  • Das Spektrum wird in 30-Sekunden-Fenster unterteilt.
  • Jedes Fenster wird durch einen Encoder geleitet, der verborgene Darstellungen erstellt.
  • Diese Darstellungen werden in Text-Tokens übersetzt, ein Wort (oder Teilwort) nach dem anderen.

Man kann sich das Mel-Spektrum als die Art und Weise vorstellen, wie Maschinen Geräusche „sehen“. Die x-Achse repräsentiert die Zeit, die y-Achse die Frequenz, und die Farbintensität zeigt die Lautstärke an. Das Ergebnis ist ein hochgenauer Transkript, selbst bei Hintergrundgeräuschen oder Akzenten.

Code-Implementierung

Hier ist die zentrale Logik zur Transkription:

import whisper\nclass AudioTranscriber:\n def __init__(self, model_size=\"base\"):\n self.model = whisper.load_model(model_size)\n def transcribe_audio(self, audio_path):\n result = self.model.transcribe(\n str(audio_path),\n word_timestamps=True,\n condition_on_previous_text=True\n )\n return {\n \"text\": result[\"text\"],\n \"segments\": result[\"segments\"],\n \"language\": result[\"language\"]\n }

Der Parameter model_size steuert die Genauigkeit im Vergleich zur Geschwindigkeit.

Modellparameter

  • tiny: 39M, schnellste Option, ideal für schnelle Tests.
  • base: 74M, schnell, geeignet für die Entwicklung.
  • small: 244M, mittlere Geschwindigkeit, für die Produktion geeignet.
  • large: 1550M, langsam, maximale Genauigkeit.

Für die meisten Anwendungsfälle bieten die Modelle base oder small das beste Gleichgewicht.

Analyse der Stimmung mit Transformatoren

Nachdem der Text extrahiert wurde, analysieren wir die Stimmung mithilfe von Hugging Face Transformers. Wir verwenden das RoBERTa-Modell von CardiffNLP, das auf sozialen Medien trainiert wurde und sich hervorragend für konversationelle Kundenanrufe eignet.

Vergleich von Stimmung und Emotion

Die Stimmungsanalyse klassifiziert den Text als positiv, neutral oder negativ. Wir verwenden ein fein abgestimmtes RoBERTa-Modell, da es den Kontext besser versteht als einfache Schlüsselwortabgleiche.

Das Transkript wird tokenisiert und durch einen Transformator geleitet. Die letzte Schicht verwendet eine Softmax-Aktivierung, die Wahrscheinlichkeiten ausgibt, die sich auf 1 summieren. Wenn beispielsweise positiv 0,85, neutral 0,10 und negativ 0,05 ist, dann ist die Gesamtstimmung positiv.

  • Stimmung: Gesamtpolarität (positiv, negativ oder neutral), die die Frage beantwortet: „Ist das gut oder schlecht?“
  • Emotion: Spezifische Gefühle (Wut, Freude, Angst), die die Frage beantworten: „Was genau fühlen sie?“

Wir erkennen beides für umfassende Einblicke.

Code-Implementierung für die Stimmungsanalyse

from transformers import AutoModelForSequenceClassification, AutoTokenizer\nimport torch.nn.functional as F\nclass SentimentAnalyzer:\n def __init__(self):\n model_name = \"cardiffnlp/twitter-roberta-base-sentiment-latest\"\n self.tokenizer = AutoTokenizer.from_pretrained(model_name)\n self.model = AutoModelForSequenceClassification.from_pretrained(model_name)\n def analyze(self, text):\n inputs = self.tokenizer(text, return_tensors=\"pt\", truncation=True)\n outputs = self.model(**inputs)\n probabilities = F.softmax(outputs.logits, dim=1)\n labels = [\"negative\", \"neutral\", \"positive\"]\n scores = {label: float(prob) for label, prob in zip(labels, probabilities[0])}\n return {\n \"label\": max(scores, key=scores.get),\n \"scores\": scores,\n \"compound\": scores[\"positive\"] - scores[\"negative\"]\n }

Der compound score reicht von -1 (sehr negativ) bis +1 (sehr positiv) und ermöglicht eine einfache Verfolgung von Stimmungstrends über die Zeit.

Warum einfache Lexikonmethoden vermeiden?

Traditionelle Ansätze wie VADER zählen positive und negative Wörter. Sie erfassen jedoch oft nicht den Kontext:

„Das ist nicht gut.“ Das Lexikon sieht „gut“ als positiv.

Ein Transformator versteht die Negation („nicht“) als negativ.

Transformatoren verstehen die Beziehungen zwischen Wörtern, was sie für reale Texte viel genauer macht.

Themenextraktion mit BERTopic

Es ist nützlich zu wissen, wie die Stimmung ist, aber worüber sprechen die Kunden? BERTopic entdeckt automatisch Themen im Text, ohne dass Sie diese im Voraus definieren müssen.

Funktionsweise von BERTopic

  • Embeddings: Wandeln Sie jedes Transkript in einen Vektor um, indem Sie Sentence Transformers verwenden.
  • Dimensionsreduktion: UMAP komprimiert diese Vektoren in einen niederdimensionalen Raum.
  • Clustering: HDBSCAN gruppiert ähnliche Transkripte.
  • Themenrepräsentation: Für jeden Cluster werden die relevantesten Wörter mit c-TF-IDF extrahiert.

Das Ergebnis ist eine Reihe von Themen wie „Rechnungsprobleme“, „technische Unterstützung“ oder „Produktfeedback“. Im Gegensatz zu älteren Methoden wie Latent Dirichlet Allocation (LDA) versteht BERTopic die semantische Bedeutung. „Versandverzögerung“ und „späte Lieferung“ gruppieren sich, weil sie die gleiche Bedeutung haben.

Code-Implementierung

from bertopic import BERTopic\nclass TopicExtractor:\n def __init__(self):\n self.model = BERTopic(\n embedding_model=\"all-MiniLM-L6-v2\",\n min_topic_size=2,\n verbose=True\n )\n def extract_topics(self, documents):\n topics, probabilities = self.model.fit_transform(documents)\n topic_info = self.model.get_topic_info()\n topic_keywords = {\n topic_id: self.model.get_topic(topic_id)[:5]\n for topic_id in set(topics) if topic_id != -1\n }\n return {\n \"assignments\": topics,\n \"keywords\": topic_keywords,\n \"distribution\": topic_info\n }

Hinweis: Die Themenextraktion erfordert mehrere Dokumente (mindestens 5-10), um sinnvolle Muster zu finden. Einzelne Anrufe werden mit dem angepassten Modell analysiert.

Erstellung eines interaktiven Dashboards mit Streamlit

Rohdaten sind schwer zu verarbeiten. Wir haben ein Streamlit-Dashboard (app.py) entwickelt, das es Geschäftsanwendern ermöglicht, die Ergebnisse zu erkunden. Streamlit verwandelt Python-Skripte mit minimalem Code in Webanwendungen. Unser Dashboard bietet:

  • Upload-Schnittstelle für Audiodateien
  • Echtzeitverarbeitung mit Fortschrittsanzeigen
  • Interaktive Visualisierungen mit Plotly
  • Detailansicht zur Erkundung einzelner Anrufe

Code-Implementierung für die Dashboard-Struktur

import streamlit as st\ndef main():\n st.title(\"Kundenstimmungsanalysator\")\n uploaded_files = st.file_uploader(\n \"Audio-Dateien hochladen\",\n type=[\"mp3\", \"wav\"],\n accept_multiple_files=True\n )\n if uploaded_files and st.button(\"Analysieren\"):\n with st.spinner(\"Verarbeitung...\"):\n results = pipeline.process_batch(uploaded_files)\n # Ergebnisse anzeigen\n col1, col2 = st.columns(2)\n with col1:\n st.plotly_chart(create_sentiment_gauge(results))\n with col2:\n st.plotly_chart(create_emotion_radar(results))

Die Caching-Funktion von Streamlit (@st.cache_resource) stellt sicher, dass Modelle einmal geladen werden und über Interaktionen hinweg bestehen bleiben, was für eine reaktionsschnelle Benutzererfahrung entscheidend ist.

Wichtige Funktionen

  • Audio hochladen (oder Beispieltranskripte zum Testen verwenden)
  • Transkript mit hervorgehobenen Stimmungen anzeigen
  • Emotionen im Zeitverlauf (wenn der Anruf lang genug ist)
  • Themenvisualisierung mit interaktiven Plotly-Diagrammen

Caching für Leistung

Streamlit führt das Skript bei jeder Interaktion erneut aus. Um eine erneute Verarbeitung schwerer Modelle zu vermeiden, verwenden wir @st.cache_resource:

@st.cache_resource\n def load_models():\n return CallProcessor()\nprocessor = load_models()

Echtzeitverarbeitung

Wenn ein Benutzer eine Datei hochlädt, zeigen wir einen Ladeindikator während der Verarbeitung an und zeigen dann sofort die Ergebnisse an:

if uploaded_file:\n with st.spinner(\"Transkribieren und analysieren...\"):\n result = processor.process_file(uploaded_file)\n st.success(\"Fertig!\")\n st.write(result[\"text\"])\n st.metric(\"Stimmung\", result[\"sentiment\"][\"label\"])

Praktische Lektionen überprüfen

Audioverarbeitung: Von der Wellenform zum Text

Die Magie von Whisper liegt in seiner Umwandlung des Mel-Spektrums. Das menschliche Gehör ist logarithmisch, was bedeutet, dass wir tiefere Frequenzen besser erkennen als hohe. Die Mel-Skala ahmt dies nach, sodass das Modell „hört“, ähnlich wie ein Mensch. Das Spektrum ist im Wesentlichen ein 2D-Bild (Zeit vs. Frequenz), das der Transformator-Encoder ähnlich verarbeitet, wie er es mit einem Bildpatch tun würde. Deshalb kann Whisper auch mit geräuschhaften Audioquellen gut umgehen; es sieht das gesamte Bild.

Transformer-Ausgaben: Softmax vs. Sigmoid

  • Softmax (Stimmung): Erzwingt, dass die Wahrscheinlichkeiten sich auf 1 summieren. Dies ist ideal für sich gegenseitig ausschließende Klassen, da ein Satz normalerweise nicht sowohl positiv als auch negativ ist.
  • Sigmoid (Emotionen): Behandelt jede Klasse unabhängig. Ein Satz kann gleichzeitig freudig und überrascht sein. Sigmoid ermöglicht diese Überlappung.

Die Wahl der richtigen Aktivierung ist entscheidend für Ihr Problemfeld.

Einblicke mit Visualisierung kommunizieren

Ein gutes Dashboard zeigt nicht nur Zahlen an; es erzählt eine Geschichte. Plotly-Diagramme sind interaktiv; Benutzer können mit der Maus über Details fahren, in Zeitbereiche hineinzoomen und Legenden anklicken, um Datenserien umzuschalten. Dies verwandelt rohe Analysen in umsetzbare Erkenntnisse.

Ausführen der Anwendung

Um die Anwendung auszuführen, folgen Sie den Schritten zu Beginn dieses Artikels. Testen Sie die Stimmungs- und Emotionsanalyse ohne Audiodateien:

python main.py --demo

Analysieren Sie eine einzelne Aufnahme:

python main.py --audio path/to/call.mp3

Batchverarbeitung eines Verzeichnisses:

python main.py --batch data/audio/

Für die vollständige interaktive Erfahrung:

python main.py --dashboard

Öffnen Sie http://localhost:8501 in Ihrem Browser.

Fazit

Wir haben ein vollständiges, offline-fähiges System entwickelt, das Kundenanrufe transkribiert, Stimmungen und Emotionen analysiert und wiederkehrende Themen extrahiert – alles mit Open-Source-Tools. Dies ist eine produktionsbereite Grundlage für:

  • Kundenserviceteams zur Identifizierung von Schmerzpunkten
  • Produktmanager zur Sammlung von Feedback in großem Maßstab
  • Qualitätssicherung zur Überwachung der Agentenleistung

Das Beste daran? Alles läuft lokal, respektiert die Privatsphäre

Bildquelle: ai-generated-gemini

KI Snack