一个在线文字转语音工具
因为参加比赛过程中要频繁使用文字转语音的功能,遂写了这个工具,暂时先用着。
工具基于百度API , 目前只支持 1K 以内的文字转语音。
后续版本拟增加讯飞接口,批量转换,语音识别,在线更新等功能,在在线更新功能上线之前,以本文为更新源。
运行截图:
代码:
public partial class Form1 : Form
{
string APP_ID = "BAIDU_TTS_APPID";
string API_KEY = "BAIDU_TTS_APIKEY";
string SECRET_KEY = "BAIDU_TTS_SECRET_KEY";
string storeLocation = null;
string fileName = null;
string toConvert;
string macAddress;
Baidu.Aip.Speech.Tts client;
int voiceSpeed = 5;
int voiceTune = 5;
int volum = 5 ;
int character = 0 ;
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
client = new Baidu.Aip.Speech.Tts(API_KEY, SECRET_KEY);
client.Timeout = 60000; // 修改超时时间
macAddress = GetMacAddressByNetworkInformation();
}
private void button1_Click(object sender, EventArgs e)
{
shellTextbox.AppendText(System.DateTime.Now.ToString() + "开始转换\n");
if(storeLocation == null)
{
shellTextbox.AppendText(System.DateTime.Now.ToString() + "转换失败,请检查音频文件存贮位置\n");
return;
}
else if(textBox1.Text == null)
{
shellTextbox.AppendText(System.DateTime.Now.ToString() + "转换失败,请检查需要转换的文字\n");
return;
}
toConvert = textBox1.Text;
Tts();
}
public void Tts()
{
// 可选参数
var option = new Dictionary<string, object>()
{
{"spd", voiceSpeed}, // 语速
{"vol", volum}, // 音量
{"per", character}, // 发音人,4:情感度丫丫童声
{ "cuid" , macAddress},
{ "pit" , voiceTune}
};
var result = client.Synthesis(toConvert, option);
if (result.ErrorCode == 0) // 或 result.Success
{
File.WriteAllBytes( storeLocation + fileName + ".mp3", result.Data);
}
else
{
shellTextbox.AppendText(System.DateTime.Now.ToString() + "转换失败,ErrorCode :" +
result.ErrorCode.ToString() + "\n");
}
}
public string GetMacAddressByNetworkInformation()
{
string key = "SYSTEM\\CurrentControlSet\\Control\\Network\\{4D36E972-E325-11CE-BFC1-08002BE10318}\\";
string macAddress = string.Empty;
try
{
NetworkInterface[] nics = NetworkInterface.GetAllNetworkInterfaces();
foreach (NetworkInterface adapter in nics)
{
if (adapter.NetworkInterfaceType == NetworkInterfaceType.Ethernet
&& adapter.GetPhysicalAddress().ToString().Length != 0)
{
string fRegistryKey = key + adapter.Id + "\\Connection";
RegistryKey rk = Registry.LocalMachine.OpenSubKey(fRegistryKey, false);
if (rk != null)
{
string fPnpInstanceID = rk.GetValue("PnpInstanceID", "").ToString();
int fMediaSubType = Convert.ToInt32(rk.GetValue("MediaSubType", 0));
if (fPnpInstanceID.Length > 3 &&
fPnpInstanceID.Substring(0, 3) == "PCI")
{
macAddress = adapter.GetPhysicalAddress().ToString();
for (int i = 1; i < 6; i++)
{
macAddress = macAddress.Insert(3 * i - 1, ":");
}
break;
}
}
}
}
}
catch (Exception ex)
{
//这里写异常的处理
return "could_not_get_mac_addr";
}
return macAddress;
}
private void button2_Click(object sender, EventArgs e)
{
if(textBox2.Text == "请在此处填写音频文件存储位置")
{
shellTextbox.AppendText(System.DateTime.Now.ToString() + "请检查音频文件存贮位置\n");
return;
}
if(textBox3.Text == "请在此处填写音频文件名(无.mp3)")
{
shellTextbox.AppendText(System.DateTime.Now.ToString() + "请检查音频文件名\n");
return;
}
storeLocation = textBox2.Text;
fileName = textBox3.Text;
}
private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
{
voiceSpeed = comboBox1.SelectedIndex;
}
private void comboBox2_SelectedIndexChanged(object sender, EventArgs e)
{
voiceTune = comboBox1.SelectedIndex;
}
private void comboBox3_SelectedIndexChanged(object sender, EventArgs e)
{
volum = comboBox1.SelectedIndex;
}
private void comboBox4_SelectedIndexChanged(object sender, EventArgs e)
{
character = comboBox1.SelectedIndex;
}
private void linkLabel1_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
{
System.Diagnostics.Process.Start("http://blog.csdn.net/Apheal"); //在浏览器中打开链接
}
private void button3_Click(object sender, EventArgs e)
{
shellTextbox.AppendText(System.DateTime.Now.ToString() + "目前无法在线更新,请到CSDN查看\n");
}
private void linkLabel2_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
{
System.Diagnostics.Process.Start(" http://puretool.picp.io/");
}
}