WebScoketClient.cs 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177
  1. using Websocket.Client;
  2. using System.Text.Json;
  3. using System.Reactive.Linq;
  4. using FunASRWSClient_Offline;
  5. using System.Text.RegularExpressions;
  6. namespace WebSocketSpace
  7. {
  8. internal class CWebSocketClient
  9. {
  10. private static readonly Uri serverUri = new Uri($"ws://{WSClient_Offline.host}:{WSClient_Offline.port}"); // 你要连接的WebSocket服务器地址
  11. private static WebsocketClient client = new WebsocketClient(serverUri);
  12. public async Task<string> ClientConnTest()
  13. {
  14. string commstatus = "WebSocket通信连接失败";
  15. try
  16. {
  17. client.Name = "funasr";
  18. client.ReconnectTimeout = null;
  19. client.ReconnectionHappened.Subscribe(info =>
  20. Console.WriteLine($"Reconnection happened, type: {info.Type}, url: {client.Url}"));
  21. client.DisconnectionHappened.Subscribe(info =>
  22. Console.WriteLine($"Disconnection happened, type: {info.Type}"));
  23. client
  24. .MessageReceived
  25. .Where(msg => msg.Text != null)
  26. .Subscribe(msg =>
  27. {
  28. recmessage(msg.Text);
  29. });
  30. await client.Start();
  31. if (client.IsRunning)
  32. commstatus = "WebSocket通信连接成功";
  33. }
  34. catch (Exception ex)
  35. {
  36. Console.WriteLine(ex.ToString());
  37. client.Dispose();
  38. }
  39. return commstatus;
  40. }
  41. public async Task<Task> ClientSendFileFunc(string file_name)//文件转录
  42. {
  43. string fileExtension = Path.GetExtension(file_name);
  44. fileExtension = fileExtension.Replace(".", "");
  45. if (!(fileExtension == "mp3" || fileExtension == "mp4" || fileExtension == "wav" || fileExtension == "pcm"))
  46. return Task.CompletedTask;
  47. try
  48. {
  49. if (client.IsRunning)
  50. {
  51. if (fileExtension == "wav")
  52. {
  53. var exitEvent = new ManualResetEvent(false);
  54. string path = Path.GetFileName(file_name);
  55. string firstbuff = string.Format("{{\"mode\": \"offline\", \"wav_name\": \"{0}\", \"is_speaking\": true,\"hotwords\":\"{1}\"}}", Path.GetFileName(file_name), WSClient_Offline.hotword);
  56. client.Send(firstbuff);
  57. showWAVForm(client, file_name);
  58. }
  59. else
  60. {
  61. var exitEvent = new ManualResetEvent(false);
  62. string path = Path.GetFileName(file_name);
  63. string firstbuff = string.Format("{{\"mode\": \"offline\", \"wav_name\": \"{0}\", \"is_speaking\": true,\"hotwords\":\"{1}\", \"wav_format\":\"{2}\"}}", Path.GetFileName(file_name), WSClient_Offline.hotword, fileExtension);
  64. client.Send(firstbuff);
  65. showWAVForm_All(client, file_name);
  66. }
  67. }
  68. }
  69. catch (Exception ex)
  70. {
  71. Console.WriteLine(ex.ToString());
  72. }
  73. return Task.CompletedTask;
  74. }
  75. public void recmessage(string message)
  76. {
  77. if (message != null)
  78. {
  79. try
  80. {
  81. string timestamp = string.Empty;
  82. JsonDocument jsonDoc = JsonDocument.Parse(message);
  83. JsonElement root = jsonDoc.RootElement;
  84. string mode = root.GetProperty("mode").GetString();
  85. string text = root.GetProperty("text").GetString();
  86. string name = root.GetProperty("wav_name").GetString();
  87. if (message.IndexOf("timestamp") != -1)
  88. {
  89. Console.WriteLine($"文件名称:{name}");
  90. //识别内容处理
  91. text = text.Replace(",", "。");
  92. text = text.Replace("?", "。");
  93. List<string> sens = text.Split("。").ToList();
  94. //时间戳处理
  95. timestamp = root.GetProperty("timestamp").GetString();
  96. List<List<int>> data = new List<List<int>>();
  97. string pattern = @"\[(\d+),(\d+)\]";
  98. foreach (Match match in Regex.Matches(timestamp, pattern))
  99. {
  100. int start = int.Parse(match.Groups[1].Value);
  101. int end = int.Parse(match.Groups[2].Value);
  102. data.Add(new List<int> { start, end });
  103. }
  104. int count = 0;
  105. for (int i = 0; i< sens.Count; i++)
  106. {
  107. if (sens[i].Length == 0)
  108. continue;
  109. Console.WriteLine(string.Format($"[{data[count][0]}-{data[count + sens[i].Length - 1][1]}]:{sens[i]}"));
  110. count += sens[i].Length;
  111. }
  112. }
  113. else
  114. {
  115. Console.WriteLine($"文件名称:{name} 文件转录内容: {text} 时间戳:{timestamp}");
  116. }
  117. }
  118. catch (JsonException ex)
  119. {
  120. Console.WriteLine("JSON 解析错误: " + ex.Message);
  121. }
  122. }
  123. }
  124. private void showWAVForm(WebsocketClient client, string file_name)
  125. {
  126. byte[] getbyte = FileToByte(file_name).Skip(44).ToArray();
  127. for (int i = 0; i < getbyte.Length; i += 1024000)
  128. {
  129. byte[] send = getbyte.Skip(i).Take(1024000).ToArray();
  130. client.Send(send);
  131. Thread.Sleep(5);
  132. }
  133. Thread.Sleep(10);
  134. client.Send("{\"is_speaking\": false}");
  135. }
  136. private void showWAVForm_All(WebsocketClient client, string file_name)
  137. {
  138. byte[] getbyte = FileToByte(file_name).ToArray();
  139. for (int i = 0; i < getbyte.Length; i += 1024000)
  140. {
  141. byte[] send = getbyte.Skip(i).Take(1024000).ToArray();
  142. client.Send(send);
  143. Thread.Sleep(5);
  144. }
  145. Thread.Sleep(10);
  146. client.Send("{\"is_speaking\": false}");
  147. }
  148. public byte[] FileToByte(string fileUrl)
  149. {
  150. try
  151. {
  152. using (FileStream fs = new FileStream(fileUrl, FileMode.Open, FileAccess.Read))
  153. {
  154. byte[] byteArray = new byte[fs.Length];
  155. fs.Read(byteArray, 0, byteArray.Length);
  156. return byteArray;
  157. }
  158. }
  159. catch
  160. {
  161. return null;
  162. }
  163. }
  164. }
  165. }