From 07526dcccf40b3ed8a39d69d6cd6d3bffe8e6035 Mon Sep 17 00:00:00 2001 From: aime-rolandi Date: Tue, 17 Jun 2025 12:01:21 -0300 Subject: [PATCH] se inician chanels para recibir y enviar chunks desde el front --- .../channels/control_chanel.ex | 17 +++ .../stt_recorder_web/channels/data_chanel.ex | 26 ++++ .../stt_recorder_web/channels/user_socket.ex | 14 +++ stt_recorder/lib/stt_recorder_web/endpoint.ex | 3 + .../live/stt/test_with_channel.ex | 115 ++++++++++++++++++ stt_recorder/lib/stt_recorder_web/router.ex | 2 +- 6 files changed, 176 insertions(+), 1 deletion(-) create mode 100644 stt_recorder/lib/stt_recorder_web/channels/control_chanel.ex create mode 100644 stt_recorder/lib/stt_recorder_web/channels/data_chanel.ex create mode 100644 stt_recorder/lib/stt_recorder_web/channels/user_socket.ex create mode 100644 stt_recorder/lib/stt_recorder_web/live/stt/test_with_channel.ex diff --git a/stt_recorder/lib/stt_recorder_web/channels/control_chanel.ex b/stt_recorder/lib/stt_recorder_web/channels/control_chanel.ex new file mode 100644 index 00000000..2eb04f08 --- /dev/null +++ b/stt_recorder/lib/stt_recorder_web/channels/control_chanel.ex @@ -0,0 +1,17 @@ +defmodule SttRecorderWeb.Channels.ControlChanel do + use Phoenix.Channel + + def join("control:lobby", _payload, socket) do + {:ok, socket} + end + + def handle_in("set_parameter", %{"parameter" => param, "value" => value}, socket) do + GenServer.cast(SttServer.Transcriber, {:set_param, param, value}) + {:reply, {:ok, %{message: "Parameter updated"}}, socket} + end + + def handle_in("call_method", %{"method" => method}, socket) do + GenServer.cast(SttServer.Transcriber, {:call_method, method}) + {:reply, {:ok, %{message: "Method called"}}, socket} + end +end diff --git a/stt_recorder/lib/stt_recorder_web/channels/data_chanel.ex b/stt_recorder/lib/stt_recorder_web/channels/data_chanel.ex new file mode 100644 index 00000000..6d5344f0 --- /dev/null +++ b/stt_recorder/lib/stt_recorder_web/channels/data_chanel.ex @@ -0,0 +1,26 @@ +defmodule SttServerWeb.DataChannel do + use Phoenix.Channel + + def join("data:lobby", _payload, socket) do + IO.puts("🟢 Cliente conectado al canal de datos") + {:ok, socket} + end + + # Recibe audio codificado en base64 (para transporte seguro) + def handle_in("audio_chunk", %{"data" => base64_chunk, "sample_rate" => sample_rate}, socket) do + case Base.decode64(base64_chunk) do + {:ok, binary_audio} -> + # Enviamos al transcriptor + GenServer.cast(SttServer.Transcriber, {:audio_chunk, binary_audio, sample_rate}) + {:noreply, socket} + + :error -> + IO.puts("⚠️ Error al decodificar base64") + {:reply, {:error, %{reason: "Invalid base64 audio"}}, socket} + end + end + + def handle_in(_unknown, _payload, socket) do + {:noreply, socket} + end +end diff --git a/stt_recorder/lib/stt_recorder_web/channels/user_socket.ex b/stt_recorder/lib/stt_recorder_web/channels/user_socket.ex new file mode 100644 index 00000000..4d580ac9 --- /dev/null +++ b/stt_recorder/lib/stt_recorder_web/channels/user_socket.ex @@ -0,0 +1,14 @@ +defmodule SttRecorderWeb.Channels.UserSocket do + use Phoenix.Socket + + ## Channels + channel "control:*", SttRecorderWeb.Channels.ControlChanel + channel "data:*", SttServerWeb.DataChannel + + + @impl true + def connect(_params, socket, _connect_info), do: {:ok, socket} + + @impl true + def id(_socket), do: nil +end diff --git a/stt_recorder/lib/stt_recorder_web/endpoint.ex b/stt_recorder/lib/stt_recorder_web/endpoint.ex index 9a289bef..1e858a13 100644 --- a/stt_recorder/lib/stt_recorder_web/endpoint.ex +++ b/stt_recorder/lib/stt_recorder_web/endpoint.ex @@ -15,6 +15,9 @@ defmodule SttRecorderWeb.Endpoint do websocket: [connect_info: [session: @session_options]], longpoll: [connect_info: [session: @session_options]] + socket "/socket", SttRecorderWeb.Channels.UserSocket, + websocket: true, + longpoll: false # Serve at "/" the static files from "priv/static" directory. # # You should set gzip to true if you are running phx.digest diff --git a/stt_recorder/lib/stt_recorder_web/live/stt/test_with_channel.ex b/stt_recorder/lib/stt_recorder_web/live/stt/test_with_channel.ex new file mode 100644 index 00000000..37e97d87 --- /dev/null +++ b/stt_recorder/lib/stt_recorder_web/live/stt/test_with_channel.ex @@ -0,0 +1,115 @@ +defmodule SttRecorderWeb.Stt.TestWithChannel do + use SttRecorderWeb, :live_view + + def mount(_params, _session, socket) do + {:ok, socket} + end + + def render(assigns) do + ~H""" +
+
Presioná "Start Recording"…
+ + + +
+
+
+ +
+
+
+ + + + +
+ """ + end +end diff --git a/stt_recorder/lib/stt_recorder_web/router.ex b/stt_recorder/lib/stt_recorder_web/router.ex index ff72c50e..f2d247e7 100644 --- a/stt_recorder/lib/stt_recorder_web/router.ex +++ b/stt_recorder/lib/stt_recorder_web/router.ex @@ -18,7 +18,7 @@ defmodule SttRecorderWeb.Router do pipe_through :browser get "/", PageController, :home - live "/sttrecorder", Stt.SttLive + live "/testchannel", Stt.TestWithChannel live "/test", Stt.TestRecorder end