57 lines
1.6 KiB
Elixir
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
|