Intento conectarme al modelo y pasar los chunks y recibir las transcripciones (no funciona)

This commit is contained in:
2025-06-17 16:46:04 -03:00
parent 07526dcccf
commit ba9ecfcff4
5 changed files with 133 additions and 2 deletions

View File

@ -11,6 +11,7 @@ defmodule SttRecorder.Application do
SttRecorderWeb.Telemetry,
{DNSCluster, query: Application.get_env(:stt_recorder, :dns_cluster_query) || :ignore},
{Phoenix.PubSub, name: SttRecorder.PubSub},
SttServer.Transcriber,
# Start the Finch HTTP client for sending emails
{Finch, name: SttRecorder.Finch},
# Start a worker by calling: SttRecorder.Worker.start_link(arg)

View File

@ -0,0 +1,70 @@
defmodule SttServer.Transcriber do
use GenServer
require Logger
def start_link(_) do
GenServer.start_link(__MODULE__, %{}, name: __MODULE__)
end
def init(_) do
python = "c:/Users/rolan/i_m/voice_recognition/minimal_server/realtime-env311/Scripts/python.exe"
script_path = "c:/Users/rolan/i_m/voice_recognition/stt_recorder/transcriber.py"
Logger.info("👉 Python path: #{python}")
Logger.info("👉 Script path: #{script_path}")
port = Port.open(
{:spawn_executable, python},
[:binary, :exit_status, :hide, args: [script_path]]
)
{:ok, %{port: port}}
end
def handle_cast({:audio_chunk, binary_audio, sample_rate}, state) do
base64 = Base.encode64(binary_audio)
message = %{
event: "transcribe",
audio_base64: base64,
sample_rate: sample_rate
}
json = Jason.encode!(message)
Port.command(state.port, json <> "\n")
{:noreply, state}
end
def handle_cast({:set_param, param, value}, state) do
message = %{event: "set_param", param: param, value: value}
json = Jason.encode!(message)
Port.command(state.port, json <> "\n")
{:noreply, state}
end
def handle_info({port, {:data, data}}, state) do
Logger.debug("💬 Output from Python: #{inspect(data)}")
case Jason.decode(data) do
{:ok, %{"type" => "realtime", "text" => text}} ->
# TODO: enviar el texto a LiveView/PubSub
Logger.info("📢 Transcripción: #{text}")
{:ok, %{"type" => "log", "msg" => msg}} ->
Logger.info("📝 Python: #{inspect(msg)}")
{:ok, %{"type" => "error", "error" => error}} ->
Logger.error("⚠️ Error en Python: #{inspect(error)}")
_ ->
Logger.warning("⚠️ Mensaje inesperado de Python: #{inspect(data)}")
end
{:noreply, state}
end
def handle_info({_port, {:exit_status, status}}, state) do
Logger.error("⚠️ Proceso Python finalizado con status #{status}")
{:stop, :python_exit, state}
end
end

View File

@ -1,11 +1,17 @@
defmodule SttServerWeb.DataChannel do
use Phoenix.Channel
def join("data:lobby", _payload, socket) do
IO.puts("🟢 Cliente conectado al canal de datos")
def join("data:lobby", _params, socket) do
Phoenix.PubSub.subscribe(SttRecorder.PubSub, "audio_output")
{:ok, socket}
end
def handle_info({:broadcast_audio, msg}, socket) do
push(socket, "transcription", Jason.decode!(msg))
{:noreply, 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