Hugging FaceVeröffentlichung der Quelle

Einführung von AnySpeechRecognizer und AnyDecisionModel: Offene Modelle für Sprache und Entscheidungen auf Apple-Plattformen

Sprachmodellen können viel leisten. Sie schreiben, fasern, übersetzen und nutzen Tools.

Sprachmodellen können viel leisten. Sie schreiben, fasern, übersetzen und nutzen Tools. Aber sie sind nur ein kleiner Teil dessen, was maschinelles Lernen leisten kann.

Sagen Sie, dass ein Kunde die Unterstützungslinie anruft. Zuerst möchten Sie wissen, was er sagt (Spracherkennung). Danach müssen Sie entscheiden, wohin man ihn schicken soll (Entscheidung). Man könnte beides an ein Sprachmodell senden, aber es gibt Modelle, die für jeden Fall speziell entwickelt sind, die besser, schneller und kostengünstiger sind.

In unserem AnyLanguageModel 1.0 Recap haben wir ein Jahr lang lokale und hostete Modelle in Swift betrachtet. Mit den aktuellen 1.x-Versionen von AnyLanguageModel und swift-huggingface erweitern wir denselben Ansatz für Sprache und Entscheidungen: vertraute Swift-APIs mit einer Auswahl an Modellen.

Heute veröffentlichen wir zwei Pakete:

  • AnySpeechRecognizer implementiert Apples neue Speech-to-Text-API mit verschiedenen Erkennungsmaschinen, einschließlich Nvidias Parakeet und Alibabs Qwen3-ASR, die lokal auf Core ML laufen, und fügt eine Sprecherdiarisation hinzu, um zu erkennen, wer wann spricht.
  • AnyDecisionModel beantwortet Ja-Nein-, Multiple-Choice- und Bewertungsskala-Fragen mit eingegebenen Ergebnissen und Wahrscheinlichkeiten. Es erzeugt jedes Ergebnis aus den Wahrscheinlichkeiten des Modells anstatt Text zu generieren, durch einen Modell auf Ihrem Gerät mit MLX, Core AI oder llama.cpp, oder durch ein Entscheidungsmodell von Jev oder Ollama.

Beide Pakete können offene Modelle vom Hugging Face Hub herunterladen und sie auf dem Gerät ausführen.

AnySpeechRecognizer

Computer haben seit Jahrzehnten Sprache zu transkribieren, und in den letzten Jahren sind sie dabei sehr gut geworden. Die Apple-Plattformen verfügen bereits über eine API dafür. macOS 26 und iOS 26 brachten SpeechAnalyzer ein, Apples neue API für Sprache-zu-Text-Übersetzung. Man fügt einem Analysegerät Module wie SpeechTranscriber und SpeechDetector hinzu, gibt ihm eine Datei oder einen Audiosstream sowie die Ergebnisse aus asynchronen Sequenzen, sobald sie eintreffen. AssetInventory installiert die Modelle, sodass Ihr App entscheidet, wann die Downloads stattfinden.

Es ist eine gut entwickelte API, aber der einzige Motor dahinter ist die von Apple. AnySpeechRecognizer behält die API bei und ermöglicht es Ihnen, den Motor zu wählen:

- import Speech
+ import AnySpeechRecognizer

Das Paket simuliert SpeechAnalyzer, SpeechTranscriber, DictationTranscriber, SpeechDetector und AssetInventory, wobei das Apple Speech-Framework als Standardmotor verwendet wird. Wenn Ihr Code diese gemeinsame API verwendet, reicht es aus, die Importanweisung zu ändern. Um stattdessen Parakeet zu verwenden, muss man nur die Art und Weise ändern, wie der Transcriber erstellt wird:

let transcriber = SpeechTranscriber(
    model: ParakeetSpeechModel(variant: .v3),
    transcriptionOptions: [],
    reportingOptions: [.volatileResults],
    attributeOptions: [.audioTimeRange]
)

Die Schritte zur Installation der Assets, zum Ausführen des Analysators und zur Lesung der Ergebnisse bleiben gleich. Der README enthält ein vollständiges Beispiel, und listet die Unterschiede zum Apple-Framework auf.

Treffen Sie die Modelle

Parakeet v3 ist NVIDIOS Parakeet TDT 0.6B v3. Es ist ein Polyglot: es erkennt 25 europäische Sprachen und weiß aus, welche es hört, so dass kein Lokalierungswählen notwendig ist.

Parakeet Ultra ist Moondreams post-trainierte Version von v3. Sie war in den meisten unserer Messungen genauer.

Parakeet Unified ist NVIDIAs ausschließlich englisches Parakeet.

Die drei Parakeets laufen auf dem eigenen Core ML-Runtime des Pakets, das Datei- und Live-Eingaben, flüchtige Ergebnisse, Wortzeitangaben und Wortvertrauen unterstützt.

Qwen3-ASR ist Alibabas Sprachmodell, in 0.6B und 1.7B Größen. Es erkennt 30 Sprachen und 22 chinesische Dialekte, einschließlich Mandarin, Kantonesisch, Japanisch und Koreanisch, die Parakeet nicht abdeckt. Es erkennt die Sprache automatisch, oder Sie können eine festlegen:

let transcriber = SpeechTranscriber(
    model: QwenSpeechModel(variant: .large, language: Locale.Language(identifier: "yue")),
    transcriptionOptions: [],
    reportingOptions: [],
    attributeOptions: []
)

Qwen3-ASR liefert für jeden Abschnitt von bis zu 40 Sekunden ein endgültiges Ergebnis, ohne flüchtige Ergebnisse, Worttiming oder Zuverlässigkeit. Es läuft auf der GPU und ist langsamer als Parakeet, daher eignet es sich besser für die Transkription von Dateien als für Live-Eingaben.

Um einen weiteren Motor hinzuzufügen, implementieren Sie SpeechRecognitionModel für seine Konfiguration und SpeechRecognitionExecutor für die Sitzung eines Moduls. Das README enthält einen kleinen Anbieter, der Platzhaltertext meldet, um Ihnen bei der Einrichtung zu helfen.

Kern-ML-Modelle auf der Hub-Plattform

Um diese Modelle in Apps zu nutzen, haben wir sie in Core ML umgewandelt und auf dem Hub veröffentlicht:

Modell Core ML Konvertierung Ursprünglicher Checkpoint Lizenz
Parakeet TDT 0.6B v3 mattt/parakeet-tdt-0.6b-v3-coreml nvidia/parakeet-tdt-0.6b-v3 CC BY 4.0
Parakeet Ultra mattt/parakeet-ultra-coreml moondream/parakeet-ultra CC BY 4.0
Parakeet Unified EN 0.6B mattt/parakeet-unified-en-0.6b-coreml nvidia/parakeet-unified-en-0.6b NVIDIA Open Model License
Qwen3-ASR 0.6B mattt/qwen3-asr-0.6b-coreml Qwen/Qwen3-ASR-0.6B-hf Apache 2.0
Qwen3-ASR 1.7B mattt/qwen3-asr-1.7b-coreml Qwen/Qwen3-ASR-1.7B-hf Apache 2.0
Streaming Sortformer 4spk v2 mattt/diar-streaming-sortformer-4spk-v2-coreml nvidia/diar_streaming_sortformer_4spk-v2 CC BY 4.0
Streaming Sortformer 4spk v2.1 mattt/diar-streaming-sortformer-4spk-v2.1-coreml nvidia/diar_streaming_sortformer_4spk-v2.1 NVIDIA Open Model License

Jeder Repository speichert seinen Quell-Checkpoint und einen Checksumme für jedes File, und das Paket wird an eine feste Revision gebunden. Die Parakeet-Repositories fügen einen 8-Sekunden-Encoder für den Live-Eingang hinzu, was die Zeit der Live-Analyse um etwa ein Drittel reduziert, unter der Bedingung einer etwas höheren Wortfehlerrate. Der Repository verfügt auch über die Konvertierungsworkflows, die die meisten dem mobius-Script von FluidInference folgen, und jede Konvertierung wird gegen das ursprüngliche Modell geprüft.

Die Downloads erfolgen nur, wenn Ihre App sie verlangt: etwa 600 MB für jeden Parakeet, plus etwa 590 MB für den Live-Encoder, 0,9 bis 2,4 GB für Qwen3-ASR und etwa 250 MB für Sortformer. Die Dateien gelangen in den standardmäßigen Hugging Face-Cache, so dass eine Mac-Anwendung außerhalb des Sandboxes sie mit Python und anderen Hugging Face-Tools teilt.

Sprecherdiarisation

Wenn Sie eine Unterhaltung transkribieren, möchten Sie oft wissen, wer was gesagt hat. Das ist Sprecherdiarisation, und das Apple-Sprachframework verfügt nicht über einen Modul dafür, daher fügt AnySpeechRecognizer einen hinzu. SpeakerDiarizer läuft Nvidias Streaming Sortformer auf Core ML zusammen mit einem Apple- oder Parakeet-Transkribierungsprogramm, auf derselben Zeittimeline:

let diarizer = SpeakerDiarizer(model: SortformerDiarizationModel())
if let request = try await AssetInventory.assetInstallationRequest(
    supporting: [transcriber, diarizer]
) {
    try await request.downloadAndInstall()
}
let analyzer = SpeechAnalyzer(modules: [transcriber, diarizer])

Der Diarizer verfolgt bis zu vier Sprecher, selbst wenn sie sich gegenseitig überlappen. Ein SpeakerTimeline sammelt die Ergebnisse und ordnet jedes timede Wort einem Sprecher zu, sodass man eine Transkription nach Sprecherfolgen ausdrucken kann. Wie die Bildunterstützung in AnyLanguageModel üblich, geht dies über das hinaus, was die Apple-API heute anbietet.

Der Diarizer verwendet standardmäßig Sortformer v2. Sie können auch v2.1 wählen, bei dem NVIDIA mit mehr Meetingdaten trainiert hat und der in unseren Messungen auch genauer ist.

Wie gut funktioniert es?

Wir maßen das Paket mit seinem hear Kommandozeilenwerkzeug auf einem M4 Max Mac Studio mit macOS 27.0.1. Hier sind die Wortfehlerraten auf LibriSpeech-Dateien von 3 bis 8 Minuten:

Transkribator test-clean test-other
Parakeet v3, Datei 1.55% 2.78%
Parakeet v3, Live 4.73% 4.29%
Parakeet Ultra, Datei 1.66% 2.55%
Parakeet Ultra, Live 2.65% 3.28%
Parakeet Unified, Datei 1.43% 2.19%
Parakeet Unified, Live 1.45% 2.42%
Apples Transkriptor, Datei 2.12% 3.97%

Der Parakeet transkribiert eine Stunde Audiodaten in etwa 20 bis 40 Sekunden aus einer Datei, oder etwa 1,5 bis 2,5 Minuten live, mit etwa 100 MB an Speicherkapazität, sobald das Core ML-Modell kompiliert ist. Qwen3-ASR ist viel langsamer und benötigt einige Gigabyte an Speicher. Sitzungen sind für alle schwierig: bei AMI-Aufzeichnungen, in denen Menschen miteinander sprechen, lag die Wortfehlerrate jedes getesteten Engines über 23%.

Diese Zahlen stammen von einer Maschine und einigen Datensätzen, also messen Sie mit Ihrem eigenen Hardware- und Audio-System. hear evaluate funktioniert mit Ihren eigenen Dateien, und das Werkzeug natural-speech-eval.py des Repositories wiedergibt diese Messungen. Bisher haben wir nur auf macOS 27 getestet, nicht auf einem iPhone.

Danach möchten wir mehr Engine hinzufügen, einschließlich Core AI auf macOS 27 und iOS 27.

AnyDecisionModel

Jeder Entscheidungsmodell ist eine andere Geschichte. Es gibt kein Apple-Framework, auf das man sich beziehen kann, und Entscheidungsmodelle sind auch nicht wirklich neu.

Es ist nur ein Entscheidungsmodell, wenn es aus dem Entscheidungsgebiet Frankreich stammt; ansonsten handelt es sich um eine funkelnde Zero-Shot-Klassifizierung.

Was neu ist, ist der Name – viel Aufmerksamkeit – und eine Reihe von Modellen, die darauf trainiert sind, Entscheidungen zu treffen. Wir glauben, dass das der Trend ist, deshalb wollten wir eine Swift-API erstellen, die bereit für sie ist.

Apps bitten oft Sprachmodellen, Entscheidungen zu treffen. Ist diese Nachricht dringend? Welches Team sollte diesen Ticket bearbeiten? Wie frustriert ist dieser Kunde? Die übliche Vorgehensweise ist, ein Sprachmodell anzuregen und den von ihm generierten Text zu analysieren. Dadurch erhält man eine Antwort, aber es wird nicht angezeigt, welche Wahrscheinlichkeiten das Modell für die Alternativen vorgesehen hat.

Hier ist wie eine Entscheidung in Swift aussieht:

import AnyDecisionModel

enum Department: String, Choosable {
    case billing, technical, sales
}

let ticket = "I was charged twice for my order, and now the app logs me out when I try to ask for a refund."

let model = MLXDecisionModel(modelID: "mlx-community/Qwen3-4B-Instruct-2507-4bit")
let session = DecisionSession(model: model, state: .text(ticket))

let urgent = try await session.probability(of: "Does this convey urgency?")
let team = try await session.choice("Which team?", from: Department.self)
let anger = try await session.score(
    "How frustrated?",
    levels: ["Calm", "Frustrated", "Very angry"]
)

urgent ist ein Double. team ist eine Choice<Department>, die den ausgewählten Fall, die Wahrscheinlichkeit für jede Option und den Konfidenzwert enthält. anger ist ein Score, der den erwarteten Wert, die Wahrscheinlichkeit für jeden Wert und den Konfidenzwert enthält. Da Department dem Choosable entspricht, ist team.value ein Department, den man in einem ausführlichen switch verwenden kann.

Wenn Sie Foundation-Modelle oder AnyLanguageModel verwendet haben, wird das Modell-und-Sitzung-Muster bekannt vorkommen. Ein DecisionSession enthält einen einzigen Zustand, der aus Text oder JSON besteht, und jede Frage betrifft diesen Zustand. Die Fragen sind unabhängig: Eine Antwort wird niemals zur Eingabe für eine spätere Frage dienen. Um mehrere Fragen gleichzeitig zu stellen, geben Sie sie als Batch an decide(_:).

Für jede Frage erstellt das MLX-Backend einen Prompt mit einem einzigen-Token-Label für jede zulässige Antwort, danach liest es die Wahrscheinlichkeit jedes Labels aus einer Vorlauf-Passage.

Probieren Sie es aus: Emoji Magnet

Emoji Magnet ist eine macOS-App mit einem Textfeld über einer Menge von 343 Emojis. Tippen Sie einen Satz ein, wie zum Beispiel „Dinge, die man trägt“, und die passenden Emojis treten aus der Menge hervor. Optimieren Sie den Satz auf „Dinge, die man im Winter trägt“, und die nicht mehr passenden Emojis fallen zurück.

Die App hat keine eingebauten Schlüsselwortsatzregeln; das Modell entscheidet alles während der Inferenzzeit. Wenn Sie den Tippen pausieren, stellt die App das Modell eine Ja-oder-Nein-Frage zu jedem Emoji, zum Beispiel:

Statement: a heavy winter coat fits the description "things you wear". Is this statement true?

Der Zustand der Sitzung enthält den Satz. Die oben genannte Demo verwendet den aufgehaltenen Jev-Backend, der alle 343 Fragen in einer Anfrage beantwortet, so dass das Emoji für jeden Satz etwa eine halbe Sekunde benötigt. Ohne die TYPESAFE_AI_API_KEY läuft das App Qwen3 4B auf Ihrem Mac mit dem MLX-Backend. Dieser Backend nutzt Präfix-Caching, um den Zustand einmal zu bewerten, und dann beantwortet er 16 Fragen pro Vorlauf. Auf einem M4 Max dauert eine Gruppe von 16 Prozent etwa 0,45 Sekunden nach dem Modellladen. Ein vollständiger Vorlauf für alle 343 Emojis dauert etwa 10 Sekunden, und die Ergebnisse jeder Gruppe werden sofort angezeigt, sobald sie eintreffen.

Emoji Magnet befindet sich im AnyDecisionModel-Examples Repository.

Entscheidungskopf und Clef

Die Analyse der Wahrscheinlichkeiten des nächsten Tokens funktioniert mit allgemeinen Sprachmodellen, aber diese Modelle wurden nicht trainiert, um Entscheidungen zu treffen. Cloudflares Clef-Modelle sind ein Beispiel für eine neuere Methode: ein Modell mit einem trainierten Entscheidungskopf, der einen Zustand und ein Schema von typisierten Fragen in Entscheidungen umwandelt und die Wahrscheinlichkeiten für alle erlaubten Optionen der Fragen in einer einzigen Vorwärts-Passage zurückgibt. Clef-Flash ist die 9B-Variante.

Jeder DecisionModel führt Clef-Flash auf einem Mac mit MLX aus:

let model = MLXHeadDecisionModel(
    modelID: "mlx-community/clef-flash-4bit",
    head: .jointSchema
)

Sie verwenden dieselben Sitzungen und Fragen, aber MLXHeadDecisionModel liest jede Entscheidung aus dem trainierten Entscheidungskopf von Clef, anstatt aus den Wahrscheinlichkeiten des nächsten Tokens. Das 4-Bit-Modell erfordert eine Downloadmenge von 6,2 GB, und das Modellkartenempfehlt einen Mac mit mindestens 16 GB Arbeitsspeicher. Clef kann Bilder und Videos lesen, aber dieser Backend akzeptiert nur Text und JSON-Statements.

Kalibrierung und Überprüfung von Wahrscheinlichkeiten

Die Rohwahrscheinlichkeiten aus den Sprachmodellen sind oft überheblich. Die lokalen Backends akzeptieren eine Calibration, die eine Temperatur auf jede Antwort und einen Bias für Ja-oder-Nein-Antworten anwendet. Verwenden Sie separate Datensätze, um die Calibration zu anpassen und die Ergebnisse zu bewerten.

Sprachmodellen können eine Option auch aufgrund ihrer Position in einer Liste bevorzugen. Bei den MLX-, Core AI- und llama.cpp Next-Token-Backenden sollten rotationDebiasing aktiviert werden, um eine Wahlfrage einmal für jede Rotation der Optionen zu stellen und die Wahrscheinlichkeiten zu berechnen. Dies kostet eine Prompt-Evaluierung pro Rotation.

Jede lokale Wahl und Punktzahl enthält außerdem einen Vertrauenswert, der auf der Entropie der Wahrscheinlichkeiten beruht. Er misst, wie konzentriert die Wahrscheinlichkeiten sind – nicht ob die Antwort richtig ist. Überprüfen Sie daher den Fehlerraten Ihrer eigenen Daten, bevor Sie einen Schwellenwert wählen. Die Diagnose der Next-Token-Backenden berichtet, wie viel Wahrscheinlichkeit das Modell den zulässigen Antworten zugewiesen hat. Ein niedriger Wert bedeutet, dass das Modell die meiste Wahrscheinlichkeit an anderer Stelle vergeben hat.

Backenden

Jeder DecisionModel hat sechs Backends:

  • MLX führt ein kleines Sprachmodell auf Apple-Silicon aus mit mlx-swift-lm und lässt es vom Hub herunterladen.
  • MLX Entscheidungskopf führt ein Modell mit seinem eigenen trainierten Entscheidungskopf aus, wie z. B. Clef.
  • Core AI tut dasselbe wie MLX mit einem Core AI-Modell auf macOS 27 und iOS 27.
  • llama.cpp liest Entscheidungen aus einem lokalen GGUF-Modell über llama.swift.
  • Jev ruft TypeSafe’s Jev über die System One API an, oder über jeden Server, der sie implementiert, wie z. B. Kev.
  • Ollama ruft ein System One Entscheidungsmodell auf einem lokalen Ollama-Server oder in Ollamas Cloud. Es erfordert Ollama 0.35.0 oder neuer, oder 0.40.5 oder neuer für Cloud-Modelle.

Die Backend-Endpunkte kennen Etiketten für „ja“ und „nein“, von A bis Z oder von 0 bis 9, sodass eine Entscheidung maximal 26 Optionen haben kann und die Punktzahl maximal 10 Stufen betragen kann. Die Entscheidungsknoten haben keinen solchen Limit.

Wie AnyLanguageModel verwendet das Paket Swift-Paket-Traits. Ohne Traits hat es keine Abhängigkeiten von Drittanbietern. Man erhält die Kerntypen sowie die Jev- und Ollama-Backends, die ebenfalls auf Linux basieren. Ermöglichen Sie das MLX, CoreAI oder Llama-Trait für die lokalen Backends.

Beginnen Sie

Beide Pakete erfordern Swift 6.2 oder neuer sowie macOS 26 oder iOS 26 oder neuer. Die Laufzeitumgebungen Parakeet und Sortformer sowie der MLX-Backend erfordern Apple Silicon. Die MLX-Build-Tasks von AnyDecisionModel verwenden Xcode mit Swift 6.4 oder neuer sowie die Metal-Toolchain; Core AI erfordert Xcode 27 und eine Laufzeitumgebung mit OS 27.

Fügen Sie die Pakete in Ihren Package.swift ein:

dependencies: [
    .package(url: "https://github.com/mattt/AnySpeechRecognizer", from: "0.1.0"),
    .package(
        url: "https://github.com/mattt/AnyDecisionModel",
        from: "0.6.0",
        traits: ["MLX"]
    ),
]

Für den Moment kann das CoreAI-Trait von AnyDecisionModel nicht mit AnySpeechRecognizer kombiniert werden, weil coreai-kit 0.7.3 unterhalb von 1.0 auf swift-huggingface angewiesen ist und AnySpeechRecognizer 1.x erfordert.

Jeder README enthält mehr Beispiele und Details zu Anforderungen und Backends. AnySpeechRecognizer enthält außerdem eine Kommandozeile-Werkzeug, hear, das lokale Dateien transkribiert, deren Sprecher markiert und die Ergebnisse bewertet. Jedes hear-Kommando erfordert --backend apple, --backend parakeet oder --backend qwen; führen Sie hear prepare mit denselben Backend- und Modelloptionen vor der Analyse aus, um die erforderlichen Assets zu installieren.

Probieren Sie sie in Ihren Apps aus und teilen Sie uns mit, was funktioniert und was nicht. Probleme und Pull Requests sind in beiden Repositories willkommen.

Links

Dank NVIDIA für Parakeet, Sortformer und NeMo, Dank Moondream für Parakeet Ultra, Dank FluidInference, deren FluidAudio- und mobius-Projekte die Konventionen dokumentieren, die der Parakeet-Runtime und die Core ML-Konvertierungen befolgen, Dank Cloudflare für Clef, und allen, die zum AnyLanguageModel beigetragen haben, deren Muster die beiden Pakete übernommen haben.

Originalquelle

Hugging Face

Hinweise zum Inhalt

Originalveröffentlichung und Rechte liegen bei der Quelle.

Maschinelle Übersetzung · Original beachten