1. 程式人生 > >基於百度雲實現微信服務號內文字語音互轉STT TTS

基於百度雲實現微信服務號內文字語音互轉STT TTS

.com wid ech 設置 errcode creat ice 遍歷 組裝

先上效果圖:

技術分享圖片

使用百度語音識別和語音合成兩個接口實現

1.語音識別STT

用戶微信輸入,調用百度api,得到識別文本。

2.語音合成TTS

用戶輸入問題,調用百度api,得到mps音頻,使用開源轉碼工具ffmpeg,轉成微信音頻格式amr

代碼

使用基於.net的NorWeChat開源微信框架

        [HttpPost]
        [ActionName("Callback")]
        public ActionResult Post(string msg_signature, string timestamp, string nonce)
        {
            
try { string obj = wx.GetMsgStr(Request.InputStream, msg_signature, timestamp, nonce); ReceiveMsg obj = ReceiveMsg.GetMsgObj(msg.Text); if (obj != null) { WeChat wx = WXClient.GetWXAPI(); var
resStr = string.Empty; switch (obj.MsgType) { case "text": RceMsgText ttobj = (RceMsgText)obj; TextToVoice.Send(ttobj); break;
case "voice": RceMsgVoice rmvobj = (RceMsgVoice)obj; VoiceToText.Send(rmvobj); break; } } catch (Exception ex) { fileLog.Error(ex.Message); fileLog.Error(ex.StackTrace); fileLog.Error(ex.ToString()); } return Content(null); }

/// <summary>
/// 處理發送的消息
/// </summary>
/// <param name="obj">發送消息</param>
public static void Send(RceMsgText obj)
{
// 設置APPID/AK/SK
var APP_ID = "你的xxx";
var API_KEY = "你的xxx";
var SECRET_KEY = "你的xxx";
//1.調用百度語音合成接口,生成音頻文件mp3
var client = new Baidu.Aip.Speech.Tts(API_KEY, SECRET_KEY);
// 可選參數
var option = new Dictionary<string, object>()
{
{"spd", 5}, // 語速
{"vol", 7}, // 音量
{"per", 1} // 發音人,4:情感度丫丫童聲
};


string name = DateTime.Now.ToString("yyyyMMddhhmmssttt");


var result = client.Synthesis(obj.Content, option);


if (result.ErrorCode == 0) // 或 result.Success
{
File.WriteAllBytes(@"D:\amr\ffmpeg\mp3\" + name + ".mp3", result.Data);
//mp3轉amr
//ffmpeg -i 5.mp3 -ar 8000 -ab 12.2k -ac 1 6.amr
VideoConvertFlv(@"D:\amr\ffmpeg\mp3\" + name + ".mp3", @"D:\amr\ffmpeg\amr\" + name + ".amr");
//amr上傳到微信臨時素材
WeChat wc = new WeChat(WeChatParameter.CorpID, WeChatParameter.Secret, WeChatParameter.AgentID);
UploaMedia media = wc.mediaTemp(wc.GetAccessTokenVal(), "voice", @"D:\amr\ffmpeg\amr\" + name + ".amr");
if (media != null && media.errcode == 0)
{
//發送臨時素材
string res = wc.SendVoice(wc.GetAccessTokenVal(), obj.FromUserName, "", "", obj.AgentID, media.media_id, "0");
}
}
}


public static void VideoConvertFlv(string FromName, string ExportName)
{


string ffmpeg = @"D:\amr\ffmpeg\ffmpeg.exe";
//FromName = "";
//ExportName = "";
string Command = " -i " + FromName + " -ar 8000 -ab 12.2k -ac 1 " + ExportName; //Flv格式
//string Command = " -i \"test.wmv\" -y -ab 32 -ar 22050 -b 800000 -s 320*240 \"2.flv\"";


//string Command = "E:\\FFmpeg\\ffmpeg.exe -i E:\\ClibDemo\\VideoPath\\admin\\a.wmv -y -ab 56 -ar 22050 -b 500 -r 15 -s 320*240 " ExportName;
System.Diagnostics.Process p = new System.Diagnostics.Process();
p.StartInfo.FileName = ffmpeg;
p.StartInfo.Arguments = Command;
p.StartInfo.WorkingDirectory = @"D:\amr\ffmpeg\";
p.StartInfo.UseShellExecute = false;
p.StartInfo.RedirectStandardInput = true;
p.StartInfo.RedirectStandardOutput = true;
p.StartInfo.RedirectStandardError = true;
p.StartInfo.CreateNoWindow = false;
//開始執行
p.Start();
p.BeginErrorReadLine();
p.WaitForExit();
p.Close();
p.Dispose();
}

public static void Send(RceMsgVoice obj)
{
string returnText = string.Empty;

//組裝下載鏈接
string downloadurl = string.Format("https://qyapi.weixin.qq.com/cgi-bin/media/get?access_token={0}&media_id={1}", wx.GetAccessTokenVal(), obj.MediaId);

System.Net.WebClient _WebClient = new System.Net.WebClient();

_WebClient.DownloadFile(downloadurl, @"D:\amr\" + obj.MediaId + ".amr");

// 設置APPID/AK/SK
var APP_ID = "11059149";
var API_KEY = "0i6s4Z7Rj4HVwYSi324mXhN1";
var SECRET_KEY = "InmF5wDHuQl7gyLbMc7hNuyiM3rWt5Vf";

var client = new Baidu.Aip.Speech.Asr(API_KEY, SECRET_KEY);

var data = File.ReadAllBytes(@"D:\amr\" + obj.MediaId + ".amr");
JObject mObj = client.Recognize(data, "amr", 8000);

int id = Convert.ToInt32(mObj["err_no"]);
string err_msg = mObj["err_msg"].ToString();
string result = string.Empty;
if (mObj["result"] != null)
{
JToken arr = mObj["result"];//獲取Json裏的數組 {arr:[{yy:1,zz:2},{yy:3,zz:4}]}

foreach (JToken baseJ in arr)//遍歷數組
{
result = baseJ.Value<string>();
}
}

if (mObj != null && id == 0)
{
returnText = result;
}
else
{
returnText = err_msg;
}


//發送消息
wx.SendText(wx.GetAccessTokenVal(), obj.FromUserName, "", "", obj.AgentID, returnText, "0");
}

 

基於百度雲實現微信服務號內文字語音互轉STT TTS