使用百度语音合成API时,与使用人脸识别API的最大不同之处在于:人脸识别API返回结果均为JSON格式的字符串,而语音合成API则是返回的二进制语音文件。因此在代码的编写上有很大的不同。在此之前我也上网查了好多,但是没有针对UWP的示例,经过一番摸索算是找到了可以用的办法 (~ ̄▽ ̄)~
下面直接写出核心代码以供来日复习参考。
注:示例代码均是从uwp项目中截取的,保留了异步用法,不清楚的话可以大致先了解一下异步编程。
使用到的命名空间:
using Windows.Web.Http;//HttpClient所属
using System.Threading.Tasks;//Task所属
using Windows.Storage.Streams;//IBuffer所属
using Windows.Media.Playback;//MediaPlayer所属
using Windows.Media.Core;//MediaSource所属
这是请求的参数列表:
List<KeyValuePair<String, String>> paralist = new List<KeyValuePair<string, string>>
{
new KeyValuePair<string, string>("tex",tex_seting),
new KeyValuePair<string, string>("lan",lan_setting),
new KeyValuePair<string, string>("tok",access_Token),
new KeyValuePair<string, string>("ctp",ctp_setting),
new KeyValuePair<string, string>("cuid","cuid"),
new KeyValuePair<string, string>("spd",spd_setting),
new KeyValuePair<string, string>("pit",pit_setting),
new KeyValuePair<string, string>("vol",vol_setting),
new KeyValuePair<string, string>("per",per_setting)
};
获取content 内容:
private async Task GetTtsResultAsync(string url, List> list)// 获取文件
{
HttpClient hc = new HttpClient();
using (var content = new HttpFormUrlEncodedContent(list))
{
var response = await hc.PostAsync(new Uri(url), content);
IBuffer buffer = await response.Content.ReadAsBufferAsync();
return buffer;
}
}
此处的关键点在于 使用 ReadAsBufferAsync()
来将content中的内容读取为IBuffer
类型。
private async void PlayAudio(IBuffer result)//最终播放音频
{
folder = await KnownFolders.MusicLibrary.CreateFolderAsync("Greeting", CreationCollisionOption.ReplaceExisting);//创建文件夹
StorageFile x = await folder.CreateFileAsync("语音文件.mp3", CreationCollisionOption.ReplaceExisting);//创建文件
StorageFile storageFile = await folder.GetFileAsync("语音文件.mp3");
await FileIO.WriteBufferAsync(storageFile, result);//从缓冲写入文件
// storageFile = await folder.GetFileAsync("语音文件.mp3");
MediaPlayer _mediaPlayer = new MediaPlayer();
_mediaPlayer.Source = MediaSource.CreateFromStorageFile(storageFile);
_mediaPlayer.Play();
}
将content中的内容读取为缓冲类型之后,在写入文件时就可以使用 FileIO.WriteBufferAsync()
方法来将数据从缓冲区写入文件了。因为此处为mp3格式,所以在创建文件时,需要加上后缀名.mp3
StorageFile x = await folder.CreateFileAsync("语音文件.mp3", CreationCollisionOption.ReplaceExisting);
我想,其他获取其他类型的文件也可以同理吧 :-)