Files
voice_recognition/whisper2/lib/whisper/server/whisper_server.ex

57 lines
1.6 KiB
Elixir

defmodule WhisperServer do
use GenServer
require Logger
def start_link(ref), do: GenServer.start_link(__MODULE__, %{ref: ref}, name: via(ref))
defp via(ref), do: {:via, Registry, {WhisperLive.Registry, ref}}
def init(state) do
{:ok, Map.merge(state, %{live_text: "", final_text: "", finalized?: false})}
end
# Llamado por el sistema de transcripción en vivo
def update_live_text(ref, new_text) do
GenServer.cast(via(ref), {:update_live_text, new_text})
end
# Llamado al terminar el audio (cuando llega la mejora)
def finalize(ref, improved_text) do
GenServer.cast(via(ref), {:finalize, improved_text})
end
def get_combined_text(ref) do
GenServer.call(via(ref), :get_combined_text)
end
# --- HANDLERS ---
def handle_cast({:update_live_text, new_text}, state) do
{:noreply, %{state | live_text: new_text}}
end
def handle_cast({:finalize, improved_text}, state) do
# Separar parte ya mejorada y lo que aún está "en vivo"
# Suponemos que improved_text reemplaza una parte al inicio del texto
final_length = String.length(improved_text)
live_tail = String.slice(state.live_text, final_length..-1) || ""
combined = improved_text <> live_tail
Logger.info("[whisper] Texto combinado tras mejora: #{inspect(combined)}")
# Broadcast a LiveView
Phoenix.PubSub.broadcast(
WhisperLive.PubSub,
"transcription:#{state.ref}",
{:updated_text, combined}
)
{:noreply, %{state | final_text: improved_text, live_text: combined, finalized?: true}}
end
def handle_call(:get_combined_text, _from, %{live_text: text} = state) do
{:reply, text, state}
end
end