Tutorial: Bau von konversationellen NPCs in Unity 6 mit dem MorVoice SDK (Zero-Latency-Setup)
Der heilige Gral des modernen Gamings ist der 'Smarte NPC' – ein Charakter, mit dem man sprechen kann und der intelligent antwortet. Während LLMs (wie GPT-4) den Gehirnteil gelöst haben, blieb der Sprachteil ein Flaschenhals. Traditionelles TTS ist zu langsam (Latenz) und zu roboterhaft (Immersionsbruch).
Dieses Tutorial zeigt Ihnen, wie Sie das **MorVoice Streaming SDK** in Unity 6 implementieren. Wir erreichen eine Sprachantwortlatenz von unter 200ms (siehe unseren [Latenz-Benchmark](/blog/websocket-vs-http-tts-latency-benchmark-2026)), wodurch sich das Gespräch sofort anfühlt.
Voraussetzungen
- Unity 2022.3 LTS or higher (Unity 6 recommended)
- MorVoice SDK (Install via Package Manager: https://npm.morvoice.com)
- An API Key from dashboard.morvoice.com
- A basic NPC GameObject with an AudioSource componentArchitektur: Die Streaming-Pipeline
Speichern Sie Audio NICHT auf Festplatte. Datei-I/O fügt 50-100ms Verzögerung hinzu. Wir werden rohe PCM-Daten direkt vom WebSocket-Speicherpuffer in den Clip-Puffer der AudioSource streamen.
Schritt 1: Der NPC-Voice-Controller
Erstellen Sie ein neues Skript `NPCVoiceController.cs` und hängen Sie es an Ihren Charakter an.
using UnityEngine;
using MorVoice.SDK;
using System.Collections;
public class NPCVoiceController : MonoBehaviour
{
[SerializeField] private string voiceId = "orc_warrior_v2";
private MorVoiceClient _client;
private AudioSource _audioSource;
void Start()
{
_client = new MorVoiceClient(ApiKey.LoadFromEnv());
_audioSource = GetComponent<AudioSource>();
}
public async void Speak(string text)
{
// 1. Start the stream. This returns immediately (active connection)
var stream = await _client.StreamSpeechAsync(text, voiceId);
// 2. Prepare a streaming AudioClip (Unity 2022+ feature)
var clip = AudioClip.Create("VoiceStream", 44100 * 60, 1, 44100, true,
(float[] data) => stream.ReadBuffer(data));
_audioSource.clip = clip;
_audioSource.Play();
}
}Schritt 2: Lippensynchronisation
Audio ist nicht genug; der Mund muss sich bewegen. MorVoice sendet 'Viseme'-Events (Mundformen) zusammen mit den Audio-Chunks über den WebSocket. Das ist viel schneller als die Analyse des Audios auf der Client-Seite.
// Inside Speak() method, subscribe to viseme events
stream.OnViseme += (visemeCode, duration) => {
// Map MorVoice viseme codes to your character's BlendShapes
// Example: Code 4 = 'Ah' sound -> Set BlendShape 'MouthOpen' to 100
float intensity = 100f;
SkinnedMeshRenderer.SetBlendShapeWeight(visemeCode, intensity);
// Auto-close mouth after duration
StartCoroutine(ResetMouth(visemeCode, duration));
};Optimierungstipps
1. Verbindung aufwärmen
Stellen Sie die WebSocket-Verbindung her, wenn der Spieler den Raum betritt, nicht wenn er zu sprechen beginnt. Dies spart die anfängliche SSL-Handshake-Zeit (ca. 100ms).
2. Caching häufiger Phrasen
Für Standardantworten wie 'Hallo', 'Was willst du?' oder 'Auf Wiedersehen', generieren Sie diese einmal und cachen Sie sie lokal. Verwenden Sie Streaming TTS nur für dynamische LLM-Antworten.
Häufige Fallstricke
❌ NEVER call .ToArray() on the stream. That waits for the full audio to download.
✅ ALWAYS use the streaming callback or buffer reader.
❌ WARNING: Don't use standard HTTP requests. They block the main thread in WebGL builds.
✅ Use the async/await pattern shown above.Fazit
Mit diesem Setup können Ihre NPCs Spieler unterbrechen, in Echtzeit auf Spielereignisse reagieren und dynamisch flüstern oder schreien. Das MorVoice SDK übernimmt die schwere Arbeit des Pufferns und Dekodierens, sodass Sie sich auf die Gameplay-Logik konzentrieren können.
Laden Sie das vollständige Unity-Projektbeispiel von unserem GitHub-Repository herunter.