defmodule WhisperWeb.VadLive do use WhisperWeb, :live_view alias Phoenix.PubSub def mount(_, _, socket) do PubSub.subscribe(Whisper.PubSub, "transcription") socket = socket |> assign(:transcription, "") |> assign(:started, false) |> assign(:transcriptions, []) {:ok, socket} end def handle_event("start_vad", _params, socket) do push_event(socket, "init-vad", %{}) {:noreply, assign(socket, started: true)} end def handle_event("stop_vad", _params, socket) do push_event(socket, "stop-vad", %{}) {:noreply, assign(socket, started: false)} end def handle_info({:transcription, %{"received_at" => ts, "text" => new_text}}, socket) do updated_transcriptions = [%{received_at: ts, text: new_text} | socket.assigns.transcriptions] |> Enum.sort_by(& &1.received_at) final_text = updated_transcriptions |> Enum.map_join(" ", & &1.text) socket = socket |> assign(:transcriptions, updated_transcriptions) |> assign(:transcription, final_text) {:noreply, socket} end def render(assigns) do ~H"""
<%= if !@started do %> <% end %>
<%= if @transcription != "" do %>

✅ Transcripción

<%= @transcription %>

<% end %>
""" end end