123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174 |
- @using System.Text
- @using System.Net.WebSockets
- @inject HttpClient http
- @code {
- private bool ready = false;
- private string msg = "← Click it";
- private string num = "";
- private List<string> logs = new();
- private ClientWebSocket sck;
- }
- <div class="container">
- <h2>Simple Web Chat(Voice)</h2>
- @if (!ready)
- {
- <div class="row m-2">
- <div class="col-12">
- <button @onclick="@Init" class="btn btn-primary">Open Microphone</button>
- <span>@msg</span>
- </div>
- </div>
- }
- else
- {
- <div class="row">
- <div class="col-6">
- <div class="row mt-1">
- <div class="col-3">
- <button class="btn btn-secondary" @onclick="@(()=>num="")">X</button>
- </div>
- <div class="col-6">
- <InputText ValueExpression="()=>num" ValueChanged="(v) =>num=v" Value="@num" class="w-100"></InputText>
- </div>
- <div class="col-3">
- <button class="btn btn-danger" @onclick="@Go">→</button>
- </div>
- </div>
- <div class="row mt-1">
- <div class="col-3"></div>
- <div class="col-3"><button class="btn btn-primary" @onclick="@(()=> { num += "1"; StateHasChanged(); })">1</button></div>
- <div class="col-3"><button class="btn btn-primary" @onclick="@(()=> { num += "2"; StateHasChanged(); })">2</button></div>
- <div class="col-3"><button class="btn btn-primary" @onclick="@(()=> { num += "3"; StateHasChanged(); })">3</button></div>
- </div>
- <div class="row mt-1">
- <div class="col-3"></div>
- <div class="col-3"><button class="btn btn-primary" @onclick="@(()=> { num += "4"; StateHasChanged(); })">4</button></div>
- <div class="col-3"><button class="btn btn-primary" @onclick="@(()=> { num += "5"; StateHasChanged(); })">5</button></div>
- <div class="col-3"><button class="btn btn-primary" @onclick="@(()=> { num += "6"; StateHasChanged(); })">6</button></div>
- </div>
- <div class="row mt-1">
- <div class="col-3"></div>
- <div class="col-3"><button class="btn btn-primary" @onclick="@(()=> { num += "7"; StateHasChanged(); })">7</button></div>
- <div class="col-3"><button class="btn btn-primary" @onclick="@(()=> { num += "8"; StateHasChanged(); })">8</button></div>
- <div class="col-3"><button class="btn btn-primary" @onclick="@(()=> { num += "9"; StateHasChanged(); })">9</button></div>
- </div>
- <div class="row mt-1">
- <div class="col-3"></div>
- <div class="col-3"><button class="btn btn-primary" @onclick="@(()=> { num += "*"; StateHasChanged(); })">*</button></div>
- <div class="col-3"><button class="btn btn-primary" @onclick="@(()=> { num += "0"; StateHasChanged(); })">0</button></div>
- <div class="col-3"><button class="btn btn-primary" @onclick="@(()=> { num += "#"; StateHasChanged(); })">#</button></div>
- </div>
- </div>
- <div class="col-6">
- @foreach (var s in logs)
- {
- <div>
- <pre>@s</pre>
- </div>
- }
- </div>
- </div>
- }
- @code {
- private WebSocket socket;
- private async Task Init()
- {
- try
- {
- ready = await AudioCaptureModule.Init();
- }
- catch (Exception e)
- {
- msg = e.Message;
- }
- if (ready)
- {
- AudioCaptureModule.ChunkArrive += SendChunk;
- }
- }
- private void SendChunk(byte[] obj)
- {
- socket?.SendAsync(obj, WebSocketMessageType.Binary, true, default);
- }
- private async Task Go()
- {
- if (socket != null)
- {
- try
- {
- await socket.CloseAsync(WebSocketCloseStatus.Empty, "Brrrrrr", default);
- }
- catch
- {
- //FUCK ERR
- }
- try
- {
- socket.Dispose();
- }
- catch
- {
- //FUCK ERR
- }
- logs.Insert(0, "Disconnected");
- StateHasChanged();
- socket = null;
- }
- sck = new ClientWebSocket();
- sck.Options.AddSubProtocol("svcp");
- var b = http.BaseAddress;
- try
- {
- await sck.ConnectAsync(new Uri($"{(b.Scheme == "https" ? "wss" : "ws")}://{b.Host}:{b.Port}/connect/voice"), default);
- await sck.SendAsync(Encoding.UTF8.GetBytes(num), WebSocketMessageType.Text, true, default);
- logs.Insert(0, "Connected");
- socket = sck;
- await AudioCaptureModule.Start();
- while (true)
- {
- var buf = new Byte[15384];
- var r = await sck.ReceiveAsync(buf, default);
- if (r.Count == 0)
- {
- logs.Insert(0, "Disconnected");
- StateHasChanged();
- break;
- }
- if (r.MessageType == WebSocketMessageType.Text)
- {
- logs.Insert(0, Encoding.UTF8.GetString(buf, 0, r.Count));
- StateHasChanged();
- }
- else
- {
- var chunk = new byte[r.Count];
- Array.Copy(buf, 0, chunk, 0, chunk.Length);
- await AudioPlaybackModule.PlayChunk(chunk);
- }
- }
- }
- catch (Exception e)
- {
- logs.Insert(0, e.ToString());
- StateHasChanged();
- }
- }
- }
- </div>
|