为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C#
当年话下 2022-01-09 15:44:27
我有一些代码(在 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;        }
查看完整描述

2 回答

?
偶然的你

TA贡献1841条经验 获得超3个赞

默认情况下synthesizer.SpeakAsync将使用扬声器作为输出。您将输出设置为波形文件。如果您现在调用synthesizer.SpeakAsync合成器,它将对波形文件“说话”,在这种情况下,这意味着写入它。因此,synthesizer.SpeakAsync将不会起到任何可听见的声音。


有关更多指导,请参见此处的示例。


一旦创建了 wav 文件,您就可以使用媒体播放器打开它。


synthesizer.SpeakAsync("Youre text goes here");

var pathUri = new Uri(path);

player.Open(pathUri.AbsoluteUri);


查看完整回答
反对 回复 2022-01-09
?
守着一只汪

TA贡献1872条经验 获得超3个赞

当我尝试复制您的问题时,我发现了一些非常有趣的东西。令人惊讶的是,我遇到了同样的问题。为了调试它,我探索了 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();


查看完整回答
反对 回复 2022-01-09
  • 2 回答
  • 0 关注
  • 227 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信