Arkitektur
Tre klienter talar med två motorer. Skrivbord, chatt och telefon skickar text till en egen gateway på den hyrda servern. Gatewayen översätter anropet till Azure Speech i Sweden Central och returnerar MP3. Klienterna ser ett OpenAI-liknande anrop, POST /v1/audio/speech. De ser aldrig Azure, och nyckeln lämnar inte servern.
Dikteringen är lokal. Skrivbordets tangent spelar in ljud och skickar det till KBLab/kb-whisper-small på den egna datorn, CPU och int8, via faster-whisper. Chatten når samma motor över det privata nätet. Gatewayens anrop mot Azure är reserven när den lokala motorn inte svarar.
Tre klienter, tre röstval
- Skrivbordet ber om Sofie Omni på svenska och Ava DragonHD på engelska, spelar MP3 lokalt och kapar text över 4000 tecken.
- Chatten använder samma gateway och ber om standardrösten
sv-SE-SofieNeural. Att båda heter Sofie betyder inte att de är samma röstprodukt. - Telefonen skickar Sofie Omni, eller Ava DragonHD när språket är engelska.
Telefonen
Telefonen är den enda klienten som är en Android-systemmotor. Kravet var att Keep, Brave och Select to Speak skulle kunna tala utan att känna till Azure. En egen app med tillgänglighetstjänst avinstallerades, för att BankID inte ska varna för skärmövervakning. Motorn exponerar bara taltjänsten. Select to Speak, som redan var på, läser fönstret och ber motorn tala.
Ett eget Rhino-plugin postar samma JSON som skrivbordet och lämnar tillbaka MP3. Appens inbyggda Azure-plugin, som vill ha nyckeln i telefonen, används inte. Två patchar mot 2023-koden gör att en svensk telefon överhuvudtaget talar: språklistan accepterar svenska, och ett saknat röstnamn blir en tom sträng i stället för en krasch.
Två lyssningar är fortfarande öppna. Keep kan byta röst efter starten när en exempelgrupp med flerröst är på. Brave lämnar ett mellanrum efter punkt, för motorn hämtar varje mening först när den förra är färdigspelad.
Diktering
kb-whisper-small är Kungliga bibliotekets finjustering av Whisper, tränad på svenska. Inferensen tar ett anrop åt gången. Korta klipp och tomma undertextfraser klistras inte in. Kommandot som startar uppläsningen kontrollerar att dikteringen svarar. Det startar inte motorn om den har stoppats.
