<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      WPF調用FishSpeech的Demo

      寫了一個FishSpeech的教程:使用FishSpeech進行語音合成推理 - 天命小豬 - 博客園

      研究了一下如何調用服務器API,朗讀文本。

      經過調研,決定使用NAudio庫播放音頻。遇到了一些問題,如流媒體如何播放。

      流媒體請求時需要設定請求方式,否則需要等到流全部加載完成才能繼續。不能用 response = await client.PostAsync(url, content); 而是改用 response = await client.SendAsync(postRequest, HttpCompletionOption.ResponseHeadersRead); 

      var postRequest = new HttpRequestMessage(HttpMethod.Post, url);
      postRequest.Content = content;
      //流媒體請求頭
      response = await client.SendAsync(postRequest, HttpCompletionOption.ResponseHeadersRead);

      wav流媒體需要用bufferedWaveProvider緩存字節流,并判斷緩沖是否快溢出。

              private BufferedWaveProvider bufferedWaveProvider;
              private bool IsBufferNearlyFull
              {
                  get
                  {
                      return bufferedWaveProvider != null &&
                             bufferedWaveProvider.BufferLength - bufferedWaveProvider.BufferedBytes
                             < bufferedWaveProvider.WaveFormat.AverageBytesPerSecond / 4;
                  }
              }

      播放流媒體需要等待播放完成再結束,否則會提前釋放對象導致播放不完整。

      // 等待播放完成
      while (bufferedWaveProvider.BufferedBytes != 0)
      {
          Debug.WriteLine("等待播放完成");
          await Task.Delay(500);
      }

       

      完整參考:

      using NAudio.Wave;
      using Newtonsoft.Json;
      using System.Diagnostics;
      using System.Net.Http;
      using System.Text;
      using System.Windows;
      using System.Windows.Controls;
      using System.Windows.Data;
      using System.Windows.Documents;
      using System.Windows.Input;
      using System.Windows.Media;
      using System.Windows.Media.Imaging;
      using System.Windows.Navigation;
      using System.Windows.Shapes;
      using System.Threading;
      
      namespace WpfApp1
      {
          /// <summary>
          /// Interaction logic for MainWindow.xaml
          /// </summary>
          public partial class MainWindow : Window
          {
              public MainWindow()
              {
                  InitializeComponent();
              }
              private BufferedWaveProvider bufferedWaveProvider;
              private bool IsBufferNearlyFull
              {
                  get
                  {
                      return bufferedWaveProvider != null &&
                             bufferedWaveProvider.BufferLength - bufferedWaveProvider.BufferedBytes
                             < bufferedWaveProvider.WaveFormat.AverageBytesPerSecond / 4;
                  }
              }
              private async void Button_Click(object sender, RoutedEventArgs e)
              {
                  var url = $"{TextApiServer.Text.Trim()}";
                  var payload = new
                  {
                      text = $"{TextSource.Text.Trim()}",
                      chunk_length = 200,
                      format = "wav",
                      references = new object[] { },
                      reference_id = "畢業女",
                      use_memory_cache = "on",
                      normalize = true,
                      streaming = true as bool?,
                      max_new_tokens = 1024,
                      top_p = 0.7,
                      repetition_penalty = 1.2,
                      temperature = 0.7
                  };
      
                  var json = JsonConvert.SerializeObject(payload);
                  var content = new StringContent(json, Encoding.UTF8, "application/json");
      
                  try
                  {
                      using (var client = new HttpClient())
                      {
                          HttpResponseMessage response = null;
                          if (payload.streaming == true)
                          {
                              var postRequest = new HttpRequestMessage(HttpMethod.Post, url);
                              postRequest.Content = content;
                              //流媒體請求頭
                              response = await client.SendAsync(postRequest, HttpCompletionOption.ResponseHeadersRead);
                          }
                          else
                          {
                              response = await client.PostAsync(url, content);
                          }
      
                          if (response.IsSuccessStatusCode)
                          {
                              Debug.WriteLine("請求成功");
                              using (var stream = await response.Content.ReadAsStreamAsync())
                              {
      
                                  if (payload.format.ToString() == "mp3")
                                  {
                                      using (var reader = new Mp3FileReader(stream))
                                      using (var waveOut = new WaveOutEvent())
                                      {
                                          waveOut.Init(reader);
                                          waveOut.Play();
      
                                          // 等待播放完成
                                          while (waveOut.PlaybackState == PlaybackState.Playing)
                                          {
                                              await Task.Delay(500);
                                              //Thread.Sleep(100);
                                          }
                                      }
                                      Debug.WriteLine("End");
                                  }
                                  else if (payload.format.ToString() == "wav")
                                  {
      
                                      #region WAV
      
                                      //// 假設音頻格式為 16bit 16kHz 單聲道
                                      var waveFormat = new WaveFormat(44100, 16, 1);
      
                                      bufferedWaveProvider = new BufferedWaveProvider(waveFormat)
                                      {
                                          BufferDuration = TimeSpan.FromSeconds(20) // 設置緩沖區大小
                                      };
      
                                      using (var waveOut = new WaveOutEvent())
                                      {
                                          waveOut.Init(bufferedWaveProvider);
                                          waveOut.Play();
                                          // 5. 持續讀取流數據
                                          byte[] buffer = new byte[4096];
                                          int bytesRead;
                                          while ((bytesRead = await stream.ReadAsync(buffer, 0, buffer.Length)) > 0)
                                          {
                                              if (IsBufferNearlyFull)
                                              {
                                                  Debug.WriteLine("Buffer getting full, taking a break");
                                                  //await Task.Delay(500);
                                                  Thread.Sleep(500);
                                              }
                                              Debug.WriteLine($"Add bytes,length:{bytesRead}");
                                              bufferedWaveProvider.AddSamples(buffer, 0, bytesRead);
                                          }
                                          // 等待播放完成
                                          while (bufferedWaveProvider.BufferedBytes != 0)
                                          {
                                              Debug.WriteLine("等待播放完成");
                                              await Task.Delay(500);
                                          }
                                          Debug.WriteLine("End");
                                      }
                                      #endregion
                                  }
                              }
                          }
                          else
                          {
                              Debug.WriteLine($"Error: {response.StatusCode}");
                              throw new Exception(response.Content.ToString());
                          }
                      }
      
                  }
                  catch (Exception ex)
                  {
                      throw ex;
                  }
              }
          }
      }

      Git地址:6112562a/WpfAppDemo: WPF demo應用

       

      posted @ 2025-02-24 18:01  天命小豬  閱讀(102)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 亚洲精品国产中文字幕| 丁香花成人电影| 亚洲老妇女一区二区三区| 97人妻精品一区二区三区| 无码av永久免费专区麻豆| 视频一区视频二区制服丝袜| 欧美午夜精品久久久久久浪潮 | 人妻精品动漫h无码| 欧美大bbbb流白水| 国产成人无码区免费内射一片色欲 | 中文字幕亚洲一区二区三区| 无码日韩精品一区二区三区免费| 国产精品成人av电影不卡| 动漫精品中文字幕无码| 日本精品一区二区不卡| 久久精品国产蜜臀av| 亚洲中文久久久久久精品国产| 亚洲国产精品一二三四五| 99精品国产兔费观看久久99| 扒开粉嫩的小缝隙喷白浆视频| 中文字幕一区有码视三区| 亚洲国产在一区二区三区| 大又大又粗又硬又爽少妇毛片| 日本高清视频网站www| 麻豆tv入口在线看| 国产成人a在线观看视频免费| 国产性色的免费视频网站| 久久久精品2019中文字幕之3| 女主播扒开屁股给粉丝看尿口| 国产精品亚洲二区在线播放| 亚洲一区二区三级av| 免费看视频的网站| 免费无码又爽又刺激成人| 久久精品国内一区二区三区| AV最新高清无码专区| 亚洲色大成网站www在线| 亚洲高清成人av在线| 亚洲男人电影天堂无码| 久热这里只精品99国产6-99RE视…| 国产91精品调教在线播放| 99热精品久久只有精品|