Windows 10 Store App - 将URI保存为文件

时间:2015-08-17 12:00:44

标签: windows save uri windows-10 voice-recognition

我正在撰写Windows 10商店应用。在应用程序中,用户可以输入文本,然后按"阅读文本"和Cortana大声朗读文本。这很好。

现在我想添加这个功能,按下一个名为" Save"的按钮。或类似的东西,然后将Cortanas输出保存为mp3文件。这应该通过普通的保存文件对话框来实现。

这是我到目前为止所得到的。

private static MediaElement mediaplayer = new MediaElement();
/// ... mediaplayer element gets content ...
Uri file = mediaplayer.Source;

我可以使用此信息获取SpeechSynthesisStream,而不是Uri元素。

如何将此Uri / Stream保存到文件中?

修改

这是最终的代码:

var stream2 = stream.CloneStream();

//... use stream2 as mediaelement ...

if(stream != null)
        {
            using (var reader = new DataReader(stream))
            {
                FileSavePicker savePicker = new FileSavePicker();
                savePicker.SuggestedStartLocation = PickerLocationId.PicturesLibrary;

                savePicker.FileTypeChoices.Add("WAV", new List<string>() { ".wav" });

                savePicker.SuggestedFileName = "sound.wav";
                StorageFile file = await savePicker.PickSaveFileAsync();

                if (file != null)
                {
                    using (var outputStream = await file.OpenAsync(FileAccessMode.ReadWrite))
                    {
                        using (var writer = new DataWriter(outputStream.GetOutputStreamAt(0)))
                        {
                            long writtenBytes = 0;
                            const int bufferSize = 8192;

                            uint loadedBytes = 0;
                            while ((loadedBytes = (await reader.LoadAsync(bufferSize))) > 0) //!!!
                            {
                                IBuffer buffer = reader.ReadBuffer(loadedBytes);
                                writer.WriteBuffer(buffer);
                                uint tmpWritten = await writer.StoreAsync(); //!!!
                                writtenBytes += tmpWritten;
                            }
                        }
                    }
                }
            }
        }

1 个答案:

答案 0 :(得分:0)

如果您正在尝试将输出写入文件而不是将其以可听的方式呈现给MediaElement,那么您可能也需要这样的内容。

  SpeechSynthesisStream synthesisStream = await synthesizer.SynthesizeTextToStreamAsync(text);
  var stream2 = synthesisStream.CloneStream();

  FileSavePicker savePicker = new FileSavePicker();
  savePicker.SuggestedStartLocation = PickerLocationId.MusicLibrary;

  savePicker.FileTypeChoices.Add("WAV", new List<string>() { ".wav" });

  savePicker.SuggestedFileName = "sound.wav";
  StorageFile file = await savePicker.PickSaveFileAsync();

  using (var reader = new DataReader(synthesisStream))
  {
      using (var outputStream = await file.OpenAsync(FileAccessMode.ReadWrite))
      {
          using (var writer = new DataWriter(outputStream.GetOutputStreamAt(0)))
          {
              long writtenBytes = 0;
              const int bufferSize = 8192;

              uint loadedBytes = 0;
              while ((loadedBytes = (await reader.LoadAsync(bufferSize))) > 0) //!!!
              {
                  IBuffer buffer = reader.ReadBuffer(loadedBytes);
                  writer.WriteBuffer(buffer);
                  uint tmpWritten = await writer.StoreAsync(); //!!!
                  writtenBytes += tmpWritten;
              }

          }
      }
  }


  // Set the source and start playing the synthesized audio stream.
  media.AutoPlay = true;
  media.SetSource(stream2, synthesisStream.ContentType);
  media.Play();

一个问题是synthesisStream不可重绕(据我所知),所以你可能需要将它合成两次,或者如果你想制作它,可以制作一个流的第二个(内存中)副本同时听到。