继续完善小程序,昨天对crawler接口进行了修改,解决了网页压缩导致的html乱码
问题和JSON对象序列化
问题,现在对tts接口进行修改,使其处理科大讯飞在线tts接口的1000字节问题。
1000字节,也就是500中文,为了避免有些网页的乱码等情况,经尝试取text切分长度=345(?340-350之间),然后是调用第一版的tts方法,这里我用的是多线程处理的,最后将生成的多段语音拼接(注意这里不是合并,合并/混合是将两段音频并到一条时间轴上,这里的拼接是将两段时间轴连接)
先来说一说ffmpeg,我之前使用ffmpeg转码微信小程序录音.mp3为科大讯飞iat接口要求的.wav格式 :
ffmpeg -y -i D:\IISLocalServer\audios\a.mp3 -acodec pcm_s16le -f s16le -ac 1 -ar 16000 D:\IISLocalServer\audios\a.wav
这次用的他的音视频拼接功能:
网上找到的几个方法我都尝试过,最后选择的是下图第三种,先将文件名写入.txt然后进行拼接,最后将中间的.wav和.txt删除,保留最后结果,并返回相对路径:
//混合音频
ffmpeg -i 1.wav -i 2.wav -filter_complex amix=inputs=2:duration=first:dropout_transition=2 -f wav c.wav
//拼接音频
ffmpeg.exe -i "concat:123.mp3|124.mp3" -acodec copy output.mp3
ffmpeg -f concat -i list.txt -c copy res.wav
上图第一种为合并,最后效果是混合的,类似多重唱,感觉可以用来做音乐伴奏之类的。第二种为直接写文件名,测试时没得到我想要的结果,建议采用第三种写入文件的方式,不过这样会对多个文件进行创建写入甚至还有删除操作,会很慢,即使最大化了gap=345依然很慢,后期我会慢慢尝试改进,包括这里的多线程处理的优化也是,对多线程一直接触很少,Java期间也基本没用过。
这里要注意一下,第三条若是在.NET中无法合并,建议用命令行尝试命令,若是报错类似于“文件名不合法”
,尝试加入-safe -0
ffmpeg -f concat -safe -0 -i list.txt -c copy res.wav
附上最新版本代码:
/// <summary>
/// 拼接音频
/// </summary>
/// <param name="list">需要合并的音频绝对路径列表</param>
/// <param name="fileCatlog">最后的拼接音频放入的目录,也是拼接的工作区</param>
/// <returns></returns>
#region 合并音频
public string mergeAudios(ArrayList list,string fileCatlog)
{
string mergeListName = CreateFileName(".txt");
string mergeList = System.IO.Path.Combine(fileCatlog, mergeListName);
FileStream fs = new FileStream(mergeList, FileMode.Create);
StreamWriter sw = new StreamWriter(fs);
foreach (string s in list)
{
sw.Write("file '"+s+ "'\r\n");
}
sw.Flush();//清空缓冲区
sw.Close();
fs.Close();
string mergeFileName = CreateFileName(".wav");
string mergeFile = System.IO.Path.Combine(fileCatlog, mergeFileName);
string strCmd = "-f concat -safe -0 -i " + mergeList + " -c copy " + mergeFile;
//调用ffmpeg.exe
System.Diagnostics.Process p = new System.Diagnostics.Process();
p.StartInfo.FileName = "D:\\ffmpeg\\bin\\ffmpeg.exe";
p.StartInfo.Arguments = " " + strCmd;
p.StartInfo.UseShellExecute = true;
p.StartInfo.RedirectStandardInput = false;//可能接受来自调用程序的输入信息
p.StartInfo.RedirectStandardOutput = false;//由调用程序获取输出信息
p.StartInfo.RedirectStandardError = false;//重定向标准错误输出
p.StartInfo.CreateNoWindow = false;//不显示程序窗口
//启动程序
p.Start();
//等待程序执行完退出进程
p.WaitForExit();
//删除中间.txt文件,中间.wav文件
deleteFile(mergeList,1);
foreach(string file in list)
{
deleteFile(file, 1);
}
if (System.IO.File.Exists(mergeFile))
{
//return returnURL;
return mergeFile;
}
return "";
}
#endregion