如何在 MediaPlayer 中从 SpeechSynthesizer 播放 wav 文件

我有一些代码(在 WPF 应用程序中),当一些文本被复制到剪贴板时,它将使用 SpeechSynthesizer 读出文本(我所有的代码都在这篇文章的底部)。


但是,以这种方式播放音频不允许我暂停、倒带或播放等。


所以我想我会使用 SpeechSynthesizer 来保存一个 wav 文件。然后使用 MediaPlayer 类,因为它很容易暂停、播放等。


但是,保存文件后,该文件无法在我的媒体播放器中播放。该文件很好,当我手动运行它时可以完美运行。我想使用 MediaPlayer,因为我已经为它编写了一些代码。


更新


使用此页面上的示例,我可以播放我的 wav 文件。我不知道为什么该文件没有在我的代码中运行?在上面的示例中,我知道他们正在使用媒体元素,并且在我的代码中尝试过它没有任何区别。我不是只播放视频音频,因此我使用 MediaPlayer。


这是我当前的所有代码。文件正在保存,但据我所知,媒体播放器没有播放任何内容,我的计算机上的音量非常高。


     using System;

     using System.Windows;

     using System.Windows.Controls;

     using System.Windows.Media;

     using System.Windows.Media.Imaging;

     using System.Windows.Interop;

     using System.IO;

     using System.Speech.Synthesis;

     using System.Windows.Controls.Primitives;

     using System.Windows.Threading;


     namespace CSWPFClipboardViewer

     {

      /// <summary>

      /// Main window of the application, also will be used to get clipboard messages.

      /// </summary>

      public partial class MainWindow : Window

      {

        #region Private fields


        /// <summary>

        /// Next clipboard viewer window 

        /// </summary>

        private IntPtr hWndNextViewer;


        /// <summary>

        /// The <see cref="HwndSource"/> for this window.

        /// </summary>

        private HwndSource hWndSource;


        private bool isViewing;


        private MediaPlayer mePlayer = new MediaPlayer();


        #endregion


        public MainWindow()

        {

           InitializeComponent();

        }


        #region Clipboard viewer related methods


        private void InitCBViewer()

        {

            WindowInteropHelper wih = new WindowInteropHelper(this);

            hWndSource = HwndSource.FromHwnd(wih.Handle);


            hWndSource.AddHook(this.WinProc);   // start processing window messages

            hWndNextViewer = Win32.SetClipboardViewer(hWndSource.Handle);   // set this window as a viewer

            isViewing = true;

        }

当年话下
浏览 228回答 2
2回答

偶然的你

默认情况下synthesizer.SpeakAsync将使用扬声器作为输出。您将输出设置为波形文件。如果您现在调用synthesizer.SpeakAsync合成器,它将对波形文件“说话”,在这种情况下,这意味着写入它。因此,synthesizer.SpeakAsync将不会起到任何可听见的声音。有关更多指导,请参见此处的示例。一旦创建了 wav 文件,您就可以使用媒体播放器打开它。synthesizer.SpeakAsync("Youre text goes here");var pathUri = new Uri(path);player.Open(pathUri.AbsoluteUri);

守着一只汪

当我尝试复制您的问题时,我发现了一些非常有趣的东西。令人惊讶的是,我遇到了同样的问题。为了调试它,我探索了 MediaPlayer apis 并MediaFailed在我的代码中添加了事件处理程序。令我惊讶的是,每次播放某些内容时,处理程序都会被以下内部异常调用: MILAVERR_INVALIDWMPVERSION (Exception from HRESULT: 0x88980507).更多的谷歌搜索导致了这篇文章,由于少数国家的反竞争政府政策,windows 10 缺少常见的媒体应用程序。要解决此问题,您可以确保安装了 WMP 10 或更高版本,或者直接使用SoundPlayer。private SoundPlayer player = new SoundPlayer();player.SoundLocation = System.IO.Path.Combine(path, fileName);player.Play();
打开App,查看更多内容
随时随地看视频慕课网APP