Ollama mit Text-to-Speech: Ihr lokales Modell spricht, komplett offline
Ollama führt Sprachmodelle auf Ihrem eigenen Rechner aus, und seine Chat-API antwortet in Text. Um die Antworten zu hören, brauchen Sie einen Text-to-Speech-Schritt, und wenn Sie Ollama wegen der Privatsphäre gewählt haben, sollte auch dieser lokal laufen.
Diese Anleitung ergänzt ihn mit der kostenlosen SuperClonica-Engine: Ein kurzes Python-Skript schickt Ihre Frage an Ollama, liest die Antwort, während sie hereinströmt, und spricht jeden Satz, sobald er fertig ist. So beginnt die Stimme lange bevor das Modell zu Ende geschrieben hat. Nichts verlässt Ihren Rechner.
Installation
Installieren Sie Ollama, laden Sie ein Modell und starten Sie es, dann installieren Sie die zwei Python-Pakete:
ollama pull llama3.2
pip install requests superclonica-cpu
Beim ersten Start lädt die Engine das Supertonic-3-Modell, etwa 400 MB; danach läuft sie offline auf einer normalen CPU, eine NVIDIA-Grafikkarte macht sie nur schneller. Unter Linux spielt das Skript Ton mit aplay aus alsa-utils ab.
Das Skript
Speichern Sie es als ollama_voice.py und starten Sie es. Tippen Sie eine Frage; die Antwort wird gleichzeitig angezeigt und gesprochen, und das Gespräch behält seinen Verlauf:
import json, os, re, subprocess, sys, tempfile
import requests
from superclonica import Superclonica
OLLAMA = "http://localhost:11434/api/chat"
MODEL = "llama3.2" # any model you pulled with ollama pull
VOICE = "F1" # M1..M5, F1..F5 or a voice file from the catalog
SENTENCE_END = re.compile(r"[.!?]\s+")
tts = Superclonica()
def play(path):
if sys.platform == "win32":
import winsound
winsound.PlaySound(path, winsound.SND_FILENAME)
elif sys.platform == "darwin":
subprocess.run(["afplay", path], check=True)
else:
subprocess.run(["aplay", "-q", path], check=True)
def say(sentence):
sentence = re.sub(r"[*#`_]", "", sentence).strip()
if sentence:
audio, _ = tts.synthesize(sentence, voice=VOICE, lang="en")
path = os.path.join(tempfile.gettempdir(), "ollama-say.wav")
tts.save(path, audio)
play(path)
history = []
while True:
history.append({"role": "user", "content": input("You: ")})
answer = buffer = ""
body = {"model": MODEL, "messages": history, "stream": True}
with requests.post(OLLAMA, json=body, stream=True, timeout=300) as response:
response.raise_for_status()
for line in response.iter_lines():
if not line:
continue
piece = json.loads(line).get("message", {}).get("content", "")
print(piece, end="", flush=True)
answer += piece
buffer += piece
while match := SENTENCE_END.search(buffer):
say(buffer[:match.end()])
buffer = buffer[match.end():]
say(buffer)
print()
history.append({"role": "assistant", "content": answer})Das Skript schneidet den Stream am Ende jedes Satzes und vertont ihn, während Ollama weiterschreibt. Es entfernt Markdown-Zeichen wie Sternchen, die Modelle gern nutzen und die vorgelesen seltsam klingen.
Damit es richtig klingt
Bitten Sie das Modell um Sprache statt Text: Beginnen Sie den Verlauf mit einer Systemnachricht wie „Antworte in kurzen gesprochenen Sätzen, ohne Listen, Tabellen oder Formatierung.“ Setzen Sie lang in say auf die Sprache Ihres Gesprächs, etwa "de"; die Engine spricht 31 Sprachen, aber noch kein Chinesisch. VOICE nimmt eine der zehn Standardstimmen M1 bis M5 und F1 bis F5 oder den Pfad einer Stimmdatei aus dem SuperClonica-Katalog, etwa eine Assistentenstimme im Stil einer Film-KI.
Per Stimme sprechen
Um zu sprechen statt zu tippen, setzen Sie eine lokale Spracherkennung vor das Skript, etwa Whisper über das Paket faster-whisper, und geben Sie deren Text dort weiter, wo das Skript input aufruft. Dann läuft der ganze Assistent, Ohren, Gehirn und Stimme, auf Ihrem eigenen Rechner.