Alle nennenswerten Änderungen am Alternis-VoIP-Projekt werden in dieser Datei dokumentiert.
Das Format basiert auf Keep a Changelog,
und dieses Projekt hält sich an Semantic Versioning.
- DTMF-Signalunterstützung: DTMF-Tastentöne können nun über einen neuen Endpunkt
POST /api/v1/dtmf übermittelt werden und erscheinen wie jede andere Nachricht im Nachrichtenstrom (message-type: dtmf) – für Telefonie-/Gateway-Integrationen, die die Töne bereits selbst dekodieren. Details siehe DTMF.
- RTT-Anzeige in der Sitzungsliste: Sitzungen mit einer aktiven Real-Time-Text-Registrierung zeigen jetzt ein Symbol in der Sitzungsliste, sodass auf einen Blick erkennbar ist, welche Anrufe einen RTT-Teilnehmer haben, ohne sie öffnen zu müssen.
- Fehlerprotokoll-Metriken für die Lizenz: Die Lizenzserver-Prüfung meldet nun zusätzlich, wie viele STT-, Übersetzungs- (TRL), Zusammenfassungs- (LLM) und Sprachsynthese-Jobs (TTS) seit der letzten Prüfung fehlgeschlagen sind, damit eine erhöhte Fehlerrate (z. B. durch eine ausfallende GPU) remote erkannt und gemeldet werden kann.
- Voreingestellte Rollensprachen: Eine erweiterte Einstellung wurde hinzugefügt, um für jede Rolle eine erwartete Sprache voreinzustellen, ähnlich den TTS-Regeln. Die Voreinstellung wird nur als Anfangssprache für einen neu registrierten RTP-Stream verwendet und automatisch überschrieben, sobald eine Sprache erkannt, explizit registriert oder ausgewählt wird.
- Call-Control-API (CallCTL): Alternis kann den Telefonie-/VoIP-Anbieter nun anweisen, einen Anruf zu tätigen, aufzulegen oder weiterzuleiten. Befehle werden über einen neuen internen Endpunkt
/api/internal/metactl/callctl ausgelöst und als call-command-Ereignis über den bestehenden Sessions Stream verteilt – der Anbieter muss also /api/v1/sessions/events abonniert haben, um sie zu empfangen. Der Endpunkt liefert 503, wenn aktuell niemand abonniert ist, sodass Aufrufer sicher erneut versuchen können.
- Anrufer-/Angerufener-Felder bei Sitzungen: Sitzungen verfügen jetzt über optionale Telefonnummernfelder
caller/callee, die vom Telefonie-/VoIP-Anbieter über die Query-Parameter von /api/v1/register-rtp gesetzt werden können – nur als Referenz für konsumierende Clients.
- Übersetzungsanweisungen: Eine neue erweiterte Einstellung „Translation Instructions“ wurde hinzugefügt (neben den bestehenden Transkriptions-/Zusammenfassungs-Systemprompts), die auf jeden lokalen LLM-Übersetzungsaufruf angewendet wird – sowohl für die Live-Nachrichtenübersetzung als auch für die Prefab-Generierung, damit Betreiber Übersetzungsstil oder Terminologie steuern können. Betrifft nur den On-Premise-LLM-Übersetzungspfad – Azure kennt keinen entsprechenden Mechanismus und ignoriert die Einstellung.
- Sprachkonfiguration pro Anfrage: API-Aufrufe, die im Hintergrund eine Sprachsynthese auslösen, können nun die Stimme für diese eine Anfrage anpassen:
POST /api/v1/message akzeptiert ein optionales voice-config-Objekt, und POST /api/internal/prefabs die entsprechenden optionalen Query-Parameter, jeweils für den bevorzugten TTS-Anbieter und das Stimmgeschlecht. Jedes Feld ist optional und fällt auf den bisherigen Standard zurück, wenn es weggelassen wird – Aufrufe, die diese Option nicht nutzen, sind also nicht betroffen. Die Konfiguration gilt nur für die Synthese, der sie übergeben wurde, und wird nie gespeichert. Das Prefab-Erstellungsformular im Control Center bietet dieselben Optionen jetzt unter einem neuen Abschnitt „Voice Settings“.
- Sprachanweisungen (Voice Instructions): Die Sprachkonfiguration pro Anfrage akzeptiert nun ein optionales Freitextfeld
instructions, das beschreibt, wie eine Zeile gesprochen werden soll (z. B. „ruhig und langsam sprechen“) – im voice-config-Objekt von POST /api/v1/message, als instructions-Query-Parameter bei POST /api/internal/prefabs und im Abschnitt „Voice Settings“ der Prefab-Erstellung im Control Center. Nur VoxCPM unterstützt dieses Konzept; Piper und Azure ignorieren es, ebenso eine Anfrage, die auf sie zurückfällt. Das Setzen einer Anweisung schaltet diese eine Synthese auf eine Referenzmodus-Stimme um, was die Sprachsteuerung zu einem kleinen Preis bei der Klontreue ermöglicht – Anfragen ohne Anweisung sind nicht betroffen und behalten die bisherige Qualität.
- Compliance-Audit-Trail: Jedes sicherheitsrelevante Ereignis (Login-Erfolg/-Fehlschlag/Logout, Berechtigungsverweigerungen, Konto-/Geräte-Lebenszyklus, Ausstellung von Zugangsdaten, Löschung von Sitzungen und Nachrichten, Löschung von Anrufaufzeichnungen, Prefab-Import/-Export, Änderungen an Einstellungen und Lizenzschlüssel) wird nun in einem manipulationssicheren, hash-verketteten Audit-Trail (
./data/logs/audit/) erfasst, unabhängig von den operativen error-/blacklist-Logs. Einträge enthalten nur Metadaten (Akteur, Aktion, Ziel-ID, Ergebnis, Zeitstempel) – niemals Nachrichtentext oder geänderte Feldwerte. Die Aufbewahrungsdauer ist konfigurierbar (audit-log-retention-days, Standard 365 Tage), und das Ablaufen wird selbst protokolliert, damit eine spätere Integritätsprüfung für die Lücke einen dokumentierten Grund vorfindet statt eines Anscheins von Manipulation. Ein neuer Endpunkt GET /api/internal/audit-log/verify berechnet die Kette über einen angegebenen Zeitraum neu und meldet den ersten Bruch, falls vorhanden. Einträge können optional zusätzlich nach stdout gestreamt (audit-log-to-stdout, z. B. für einen Container-Log-Treiber) oder über eine konfigurierbare Webhook-URL an ein externes SIEM weitergeleitet werden (audit-log-webhook-url). Ein neuer Tab „Audit Log“ im Control Center erlaubt das Durchsuchen, Filtern und Paginieren des Trails und bietet die Integritätsprüfung an.
- Erweiterte On-Premise-Sprachabdeckung: 9 weitere Sprachen werden nun vollständig On-Premise verarbeitet, statt einen Azure-Schlüssel zu benötigen: Hindi, Indonesisch, Japanisch, Koreanisch, Malaiisch, Thailändisch, Bosnisch, Kroatisch und Serbisch. Die Aufteilung Basis-/Erweitert liegt nun bei 35/7 (vorher 26/16).
- Verbesserte Sprachsynthese-Qualität: Die Sprachsynthese-Qualität für Text-/RTT-Nachrichten und die Prefab-Generierung wurde verbessert, und die Wiedergabelautstärke ist nun über Sprachen und Stimmen hinweg konsistenter.
- Verbesserte Zusammenfassungs- und Übersetzungsmodelle: Die On-Premise-Modelle für Anrufzusammenfassungen und Übersetzung wurden für bessere Qualität und Kontextverarbeitung aktualisiert.
- Sprachsortierung auf der Einstellungsseite: Sprach-Chips im Bereich der erweiterten Einstellungen sind nun alphabetisch nach Anzeigename sortiert, Basissprachen zuerst.
- Sprachstatistiken in der Dokumentation: Sprach-/Regions-/Sprecherzahlen auf der Dokumentations-Startseite werden nun direkt aus dem Sprachdatensatz berechnet statt manuell gepflegt zu werden, sodass sie nicht mehr aus dem Takt geraten können, wenn Sprachen zwischen Stufen wechseln.
- Azure ausgeblendet, wenn nicht konfiguriert: Der Azure-TTS-Anbieter wird im Prefab-Erstellungsformular nicht mehr als Sprachoption angeboten, wenn kein Azure-TTS-Schlüssel konfiguriert ist, und
POST /api/v1/message/POST /api/internal/prefabs lehnen eine Anfrage, die ihn explizit anfordert, nun mit 400 ab, statt stillschweigend auf einen anderen Anbieter zurückzufallen.
- Flag für mehrsprachiges Modell: Das Feld
use-multilang-model bei POST /api/v1/message wird nicht mehr verwendet und wurde entfernt. Es wählte eine mehrsprachige Cloud-Stimme aus, die inzwischen von den On-Premise-Anbietern abgedeckt wird, und hatte nur dann eine Wirkung, wenn ein Azure-Schlüssel konfiguriert war. Aufrufer, die das Feld weiterhin senden, sind nicht betroffen – es wird ignoriert statt abgelehnt.
- Falsch-positive Versionskonflikte bei Compute-Nodes: Die Seite „Compute Nodes“ verglich die Version des verbundenen Nodes mit der erwarteten Version per exaktem String-Vergleich und markierte dadurch jedes Patch-Release als Konflikt. Sie meldet nun nur noch einen echten Major-/Minor-Konflikt, und die erwartete Compute-Node-Version ist jetzt
1.1.x.
- Totaler Server-Freeze bei gleichzeitigen Sitzungs-Reconnects: Ein kritischer Fehler wurde behoben, bei dem das Neuladen eines Clients mit aktivem Anruf den gesamten Server blockieren konnte, sodass er für alle Geräte nicht mehr reagierte, bis er neu gestartet wurde. Ursache waren zwei SSE-Endpunkte, die dieselben zwei Locks in umgekehrter Reihenfolge belegten – zuverlässig ausgelöst, wenn ein Seiten-Reload gleichzeitig den Sitzungs- und den Nachrichten-Event-Stream öffnete.
- Blockierte Broadcasts durch hängenden SSE-Client: Ein einzelner nicht reagierender Event-Stream-Client (auf dem Sitzungs- oder dem Nachrichten-Stream) konnte den Ping-/Cleanup-Durchlauf für alle anderen Clients desselben Streams blockieren, sodass ein Neustart nötig war, um sich zu erholen. Broadcasting und die Bereinigung veralteter Clients blockieren nun nicht mehr durch einen langsamen Empfänger.
- Blacklist-Log enthält keinen Nachrichtentext mehr: Der vollständige Text einer blockierten Nachricht wurde bisher ohne Aufbewahrungsbegrenzung in
blacklist.log geschrieben. Das Log erfasst jetzt nur noch, welcher Blacklist-Eintrag zugetroffen hat, und die Nachrichtenlänge.
- Log-Endpunkt jetzt auf bekannte Dateien beschränkt:
GET /api/internal/log akzeptierte eine beliebige id und blockierte nur wenige Path-Traversal-Muster, wodurch effektiv jedes Control-Center-Konto durch eine passend konstruierte id jede vom Serverprozess erreichbare Datei lesen konnte. Der Endpunkt bedient jetzt nur noch die operativen Logs error und blacklist über eine explizite Allowlist.
- Rotation und Aufbewahrung der operativen Logs:
error.log und blacklist.log wuchsen unbegrenzt. Beide rotieren nun täglich (error-YYYY-MM-DD.log / blacklist-YYYY-MM-DD.log) und werden nach demselben Aufbewahrungszeitraum wie der Audit-Trail gelöscht.
- Unbeabsichtigte rückwirkende Übersetzung: Ein Fehler wurde behoben, bei dem die Funktion für rückwirkende Übersetzung unbeabsichtigte Last auf das Übersetzungssystem verursachen konnte, selbst wenn sie nicht aktiviert war, aufgrund einer fehlenden Prüfung in der Verarbeitungslogik. Dies konnte in Szenarien mit häufigen Sprachwechseln und kurzen Nachrichten zu Leistungseinbußen führen.
- Live-Sitzungsdauer: Aktive Sitzungen zeigen jetzt einen Echtzeit-Dauerzähler im Client an, der sekündlich tickt, statt nur bei Server-Ereignissen aktualisiert zu werden.
- Übersetzungssichtbarkeit im Archiv: Inaktive (archivierte) Sitzungen zeigen jetzt alle verfügbaren Übersetzungen für Nachrichten an, unabhängig von aktiven RTP-Registrierungen.
- Archiv-SSE-Verbindung: Der Client öffnet für archivierte Sitzungen keine SSE-Nachrichten-Stream-Verbindung mehr, was unnötigen Ressourcenverbrauch vermeidet.
- Unterdrückung doppelter RTT-Nachrichten: Ein Fehler wurde behoben, bei dem das mehrfache Senden derselben Textnachricht per RTT nur die erste Instanz per UDP übertragen hat.
- Sprachsynthese für fremde Sprachen: Ein Fehler wurde behoben, bei dem das Flag
synthesis_played vorzeitig gesetzt wurde, sobald die erste (eigensprachige) TTS-Synthese abgeschlossen war, wodurch die Sprachsynthese für Fremdsprachen innerhalb derselben Nachricht nicht generiert und abgespielt wurde.
- Auswahl der Archivsitzung: Die ausgewählte Sitzung bevorzugt jetzt das direkt abgerufene Sitzungsobjekt (mit vollständigen Nachrichtendaten) gegenüber dem reduzierten Listeneintrag, was Fälle behebt, in denen beim Anzeigen archivierter Sitzungen Nachrichtendaten fehlten.
- Übersetzungsverlauf: Nutzung der letzten 20 Nachrichten zur Verbesserung der Übersetzungsqualität.
- Rückwirkende Übersetzung: Optionale Umgebungsvariable zur Aktivierung der experimentellen rückwirkenden Übersetzung von Nachrichten, die vor der Erkennung eines Sprachwechsels verarbeitet wurden. Damit lassen sich Übersetzungslücken bei Nachrichten schließen, die mit einer unvollständigen Spracheinstellung verarbeitet wurden.
- Verbesserungen bei der Soft-Lock-Erkennung: 3 wiederholte Sprach-Identifikationen mit demselben Ergebnis bei Nachrichten unter 1,5 Sekunden lösen jetzt einen Soft-Lock aus, um die Spracherkennung bei kurzen Nachrichten zu verbessern.
- Sitzungsdauer: Die Sitzungsdauer wird jetzt in der Oberfläche angezeigt, um die Sitzungslänge besser nachvollziehen und Sitzungen leichter identifizieren zu können.
- Archiv-Paginierung: Die Archivansicht lädt Sitzungen jetzt seitenweise zu je 20, was die anfängliche Ladezeit reduziert und die Skalierbarkeit für große Sitzungsdatenbanken verbessert.
- Archiv-Suche und -Filterung: Serverseitige Suche (Label und Zusammenfassung) sowie Datumsbereichsfilterung für die Archivansicht wurden hinzugefügt, mit entprelltem (debounced) Sucheingabefeld und Von/Bis-Datumsauswahl.
- Query-Parameter für die Sessions-API:
GET /api/v1/sessions unterstützt jetzt die optionalen Query-Parameter state, limit, offset, from, to und search für gefilterte und paginierte Sitzungsabfragen. Ein X-Total-Count-Response-Header wird für die Paginierung mitgeliefert. Vollständig abwärtskompatibel – ohne Parameter werden wie bisher alle Sitzungen zurückgegeben.
- Optimiertes Laden aktiver Sitzungen: Der Client ruft auf der Seite für aktive Anrufe jetzt nur noch aktive (nicht inaktive) Sitzungen per SSE ab, statt vorab alle Sitzungen zu laden.
- RTT – Real-Time-Text-Unterstützung: RTT-Unterstützung, damit Audio- und Real-Time-Text-Teilnehmer nahtlos kommunizieren können. RTT-Nachrichten werden live übersetzt und für Audio-Teilnehmer synthetisiert, gesprochene Nachrichten werden übersetzt und als RTT-Nachricht übertragen.
- Handhabung langer Sprachbeiträge: Verbesserte Handhabung gesprochener Nachrichten über 45 Sekunden für höhere Leistung bei meeting-artigem Verhalten.
- Synthesis-Info über die SSE-API: Sprachsynthese-Info-Ereignisse werden jetzt auch über den (SSE-)Event-Stream für Nachrichten übertragen, um die API-Nutzung zu vereinheitlichen.
- Übersetzungen von Systemnachrichten: Alle Systemnachrichten sind jetzt in den 42 Sprachen verfügbar.
- Reduzierte Nachrichten-SSE-Emissionen: Es werden jetzt nur noch wesentliche Nachrichtenzustandsänderungen per SSE gesendet, um das Netzwerk nicht unnötig mit Audiodauer-Updates ohne weitere Information zu belasten.
- Feld „audio-duration“ bei Synthesis-Info: Die SynthesisInfo-Struktur enthält jetzt ein Feld „audio-duration“ für Verwaltungszwecke.
- Spracherkennung bei kurzen Sprachbeiträgen: Verbesserte Handhabung sehr kurzer Nachrichten (unter 3 Sekunden) mit unklarer Spracherkennung.
- Endlosschleife bei der Sprachsynthese-Generierung: Ein Fehler in der Sprachsynthese-Generierungslogik wurde behoben, der bei der Erzeugung von Sprache für Übersetzungen zu einer Endlosschleife führte. Dies ist bisher nur in Szenarien bekannt, in denen ein Notitia-VoiceBot als verwaltende Instanz den Lebenszyklus einer Alternis-Sitzung steuert. Bei „normalen“ Anwendungsfällen wurde dasselbe Problem nicht beobachtet.
- Entfernen von Prefab-Gruppen: Das Löschen einer gesamten Prefab-Gruppe entfernt jetzt korrekt alle darin enthaltenen Prefabs.
- Verlust von Nachrichtenübersetzungen: Ein Fehler wurde behoben, bei dem die Übersetzung einer Nachricht nach Erkennung eines Sprachwechsels verworfen wurde.
- Sprachkennzeichen der Sitzung: Ein Fehler wurde behoben, bei dem eine Sitzung nicht die tatsächlich in der Unterhaltung verwendeten Sprachen anzeigte.
- Lizenzbasierter Reset nutzbarer Sprachen: Wird eine Lizenz herabgestuft und stehen dadurch einige Sprachen nicht mehr zur Verfügung, entfernt das System diese Sprachen jetzt automatisch aus den Einstellungen, um Fehlkonfigurationen und Verarbeitungsfehler zu vermeiden.
- Standard-Zusammenfassungs-Prompt: Der Standardprompt für Zusammenfassungsaufgaben wurde aktualisiert, um Kontextrelevanz und Ausgabequalität zu verbessern. Nutzern wird empfohlen, den Prompt zu überprüfen und bei Bedarf für ihren spezifischen Anwendungsfall anzupassen.
- Payload-Größenlimit beim Prefab-Import: Ein Problem wurde behoben, bei dem der Import großer Prefabs aufgrund von Payload-Größenbeschränkungen fehlschlagen konnte. Der Server erlaubt jetzt standardmäßig größere Payloads (200 MB), um größere Prefab-Importe zu ermöglichen. Das Limit kann über die Umgebungsvariable
FILE_UPLOAD_LIMIT angepasst werden.
🎉 Erste Produktivversion – Echtzeit-Plattform für mehrsprachige Sprachverarbeitung bei VoIP-Anrufen
- Sitzungsverwaltung: Vollständiger Lebenszyklus von Anrufsitzungen mit Zustandsverfolgung und Protokollierung
- RTP-Stream-Verarbeitung: Echtzeit-Audioverarbeitung mit Unterstützung für den G.711-A-law-Codec
- Geräteregistrierung: Sicheres mehrstufiges Onboarding mit berechtigungsbasierter Autorisierung
- Audioverwaltung: Erzeugung, Speicherung und Abruf von WAV-Dateien für verarbeitetes Audio
- Unterstützung für 42 Sprachen: Mehrsprachige Verarbeitung für über 3,6 Mrd. Muttersprachler
- 26 Sprachen vollständig On-Premise (keine Internetverbindung erforderlich)
- 16 weitere Sprachen mit cloud-unterstützter Verarbeitung
- Speech-to-Text: Echtzeit-Transkription mit kontextbewusster Verarbeitung und automatischer Spracherkennung
- Text-to-Speech: Hochwertige Sprachsynthese mit optionaler „Nova Voice“-Erweiterung
- Echtzeitübersetzung: Simultane Mehrsprachenübersetzung während Anrufen
- Compute-Node-Architektur: Verteilte Verarbeitung mit Lastverteilung und Health-Monitoring
- Moderne Weboberfläche: Vue-3+TypeScript-SPA mit Material Design (Vuetify)
- Echtzeit-Updates: Live-Übertragung von Sitzungen und Nachrichten per Server-Sent Events
- Geräteverwaltung: Registrierungen genehmigen, Berechtigungen verwalten und Gerätemetadaten bearbeiten
- Kontoverwaltung: Benutzerauthentifizierung, Passwortverwaltung
- Einstellungs-Dashboard: Lizenzvalidierung, Systemkonfiguration
- Prefab-Vorlagen: Schnelleinrichtung mit Import-/Exportfunktion
- Mehrsprachige Oberfläche: Unterstützung für Englisch und Deutsch
- Interne API (
/api/internal): Administrative Operationen für Konten, Geräte, Compute-Nodes und Einstellungen
- Öffentliche API v1 (
/api/v1): Geräteseitige Operationen für Registrierung, Sitzungen, Nachrichten und RTP-Streams
- OpenAPI-Dokumentation: Interaktive Swagger-UI unter
/api/docs/ mit vollständiger API-Spezifikation
- Event-Streaming: SSE-Endpunkte für Echtzeit-Updates zu Sitzungen und Nachrichten
- Dreifach-Server-Architektur: HTTP-Server (Port 80), Compute-Node-Server (Port 81), VoIP-UDP (Port 35000)
- Docker-Unterstützung: Produktionsreife Containerisierung mit persistenten Datenvolumes
- Lizenzverwaltung: Stündliche Validierung mit einmonatiger Kulanzfrist bei Verbindungsproblemen
- SQLite-Datenbanken: Leichtgewichtige Speicherung für Konten, Geräte und Sitzungen
- Single-Binary-Deployment: Eingebetteter Web-Client und eingebettete Dokumentation für einfaches Deployment
- VitePress-Website: Umfassende technische Dokumentation unter
/docs/
- Einrichtungsanleitungen: Server-Deployment, Docker-Compose-Beispiele und Systemkonfiguration
- Integrationsleitfäden: Geräteregistrierung, Sitzungsverwaltung, Event-Streaming und Workflows zur Sprachsynthese
- Architekturdiagramme: Visualisierung von Systemtopologie und Komponenteninteraktion
- Interaktive Karte: Visuelle Darstellung von über 185 unterstützten Sprachregionen
- Backend: Rust 2024 mit dem Actix-web-4.11-Framework
- Frontend: Vue 3 + TypeScript mit Vite-Build-System
- Datenbank: SQLite mit rusqlite
- Sicherheit: Ring-Kryptografie (PBKDF2), OpenSSL, Bearer-Token-Authentifizierung
- Async-Laufzeitumgebung: Tokio für hochparallele Operationen
- Granulare Berechtigungen: Berechtigungstypen für feingranulare Gerätezugriffskontrolle
- Sichere Passwortspeicherung: PBKDF2-Hashing mit kryptografischen Salts
- Compute-Node-Authentifizierung: Verschlüsselte Kommunikation zwischen Manager und Compute-Nodes
- Webzugriffskontrolle: Optionaler öffentlicher Zugriff mit separaten Authentifizierungstoken