标题微信公众号如何实现录音功能(包含下载到服务器+AMR转化为MP3格式)

标题微信公众号如何实现录音功能(包含下载到服务器+AMR转化为MP3格式)

我们在微信公众号开发的过程中,总会遇到各种各样的需求和难题,然而最大的难题是微信公众号的开发文档,说多了都是泪,总结起来就是一个‘虚’字了得,不过项目还是要做的,下面是我在开发过程中的一点心得,希望对大家能有帮助,不足之处,请大家多多指正,共同学习。
在这里插入图片描述
一、 微信音频接口说明
具体以最新官方文档为准原文地址: https://developers.weixin.qq.com/doc/offiaccount/OA_Web_Apps/JS-SDK.html#23

1.1.1 权限的声明
在使用前需要申明相对应的权限,具体使用以个人卡发需求为主。

 wx.config({
                debug: false, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
                appId: appId, // 必填,公众号的唯一标识
                timestamp: timestamp, // 必填,生成签名的时间戳
                nonceStr: nonceStr, // 必填,生成签名的随机串
                signature: signature,// 必填,签名,见附录1
                jsApiList: [            
                    'startRecord',
                    'stopRecord',
                    'onVoiceRecordEnd',             
                    'downloadVoice',
                    'uploadVoice'
                ] // 必填,需要使用的JS接口列表,所有JS接口列表见附录2
            });

1.1.2 开始录音接口

wx.startRecord();

1.1.3 停止录音接口

wx.stopRecord({
success: function (res) {
var localId = res.localId;
}
});

1.1.4 监听录音自动停止接口

wx.onVoiceRecordEnd({
// 录音时间超过一分钟没有停止的时候会执行 complete 回调
complete: function (res) {
var localId = res.localId;
}
});

1.1.5 播放语音接口

wx.playVoice({
localId: '' // 需要播放的音频的本地ID,由stopRecord接口获得
});

1.1.6 暂停播放接口

wx.pauseVoice({
localId: '' // 需要暂停的音频的本地ID,由stopRecord接口获得
});

1.1.7 停止播放接口

wx.stopVoice({
localId: '' // 需要停止的音频的本地ID,由stopRecord接口获得
});

1.1.8 监听语音播放完毕接口

wx.onVoicePlayEnd({
success: function (res) {
var localId = res.localId; // 返回音频的本地ID
}
});

1.1.9 上传语音接口

wx.uploadVoice({
localId: '', // 需要上传的音频的本地ID,由stopRecord接口获得
isShowProgressTips: 1, // 默认为1,显示进度提示
success: function (res) {
var serverId = res.serverId; // 返回音频的服务器端ID
}
});

备注:上传语音有效期3天,可用微信多媒体接口下载语音到自己的服务器,此处获得的 serverId 即 media_id,参考文档 .目前多媒体文件下载接口的频率限制为10000次/天,如需要调高频率,请登录微信公众平台,在开发 - 接口权限的列表中,申请提高临时上限。

1.2.0下载语音接口

wx.downloadVoice({
serverId: '', // 需要下载的音频的服务器端ID,由uploadVoice接口获得
isShowProgressTips: 1, // 默认为1,显示进度提示
success: function (res) {
var localId = res.localId; // 返回音频的本地ID
}
});

1.2.1智能接口
识别音频并返回识别结果接口

wx.translateVoice({
localId: '', // 需要识别的音频的本地Id,由录音相关接口获得
isShowProgressTips: 1, // 默认为1,显示进度提示
success: function (res) {
alert(res.translateResult); // 语音识别的结果
}
});

二、 H5页面功能实现

封装一下录音 的方法,在需要用的地址直接调用就可以。

  WechatEvent: {
             //开始录音
             Wechat_StartRecord: function () {
                 wx.startRecord({                  
                     cancel: function () {
                       //用户取消权限的处理...
                     }
                 });
             },
             //停止录音
             Wechat_StopRecord: function () {
                 wx.stopRecord({
                     success: function (res) {
                         var localId = res.localId;
                          //上传录音文件到微信服务器
                              wx.uploadVoice({
                                 localId: localId, // 需要上传的音频的本地ID,由stopRecord接口获得
                                 isShowProgressTips: 1, // 默认为1,显示进度提示
                                 success: function (res) {
                                     var serverId = res.serverId; // 返回音频的服务器端ID
                                  WechatEvent.DownLoadAudio(serverId );//上传到自己服务器下载的方法....                                    

                                 }
                         });
                     }
                 });
             },

 //自己服务器下载微信服务器录音文件的方法(服务器的方法)
  	 DownLoadAudio: function (serverId) {
		jQuery.ajax({
		type: "POST",//使用get方法访问后台
		dataType: "json",
		url: "自己的接口地址", 
		data: { "serverId": serverId},   //上传到微信服务器后返回的serverId
			success: function (data) {
                 //服务器处理成功的时候页面自己处理
                   	  },
                  	   }
                 });
             },

三、服务器端下载微信音频文件部分

服务器利用ffmpeg.exe 将从微信服务器上获取的录音文件**,转化为自己想要的格式**

核心代码:

3.1.1 下载微信服务器的录音文件到服务器指定的文件夹下
核心代码:

               string url =@”https://api.weixin.qq.com/cgi-bin/media/get?access_token={0}&media_id={1}“;
                  url = string.Format(url, files.Content, files.FileSize);   //  微信服务器下载录音问价的地址
                string strpath = string.Empty;
                 string savepath = string.Empty;
                 HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create(url);
                 req.Method = "GET";
                 using (WebResponse wr = req.GetResponse())
                 {
                     HttpWebResponse myResponse = (HttpWebResponse)req.GetResponse();
                     strpath = myResponse.ResponseUri.ToString();//下载录音文件的地址
                     WebClient mywebclient = new WebClient();
                     savepath = "服务器上文件夹的路径"+ ”录音文件的名字“ + ".amr";//微信服务器下载的                                                                                                                          录音文件保存的地址
                     try
                      {
                  mywebclient.DownloadFile(strpath, savepath);//下载录音文件                    
                     }
                     catch (Exception ex)
                     {                     
                     }
                 }
                 ```
**备注:因为编码方式不同,测试的时候要在真机上测试,在微信开发者工具上会存在一定问题。**

**3.1.2 录音文件格式的转化**1) 核心工具ffmpeg.exe ,百度自己下载即可
```csharp
	string outStr = "";
	Process process = new Process();
			try
				{
                	 string filepath = System.AppDomain.CurrentDomain.BaseDirectory;
               	  process.StartInfo.FileName = filepath+"ffmpeg" + "\\" + "ffmpeg.exe"; // 这里也可以指定  ffmpeg的绝对路径
                 process.StartInfo.Arguments = @" -i " + "下载到服务器的录音地址" + " " + (要转化到的地址) + ".mp3";
                 process.StartInfo.UseShellExecute = false;
                 process.StartInfo.CreateNoWindow = true;
                 process.StartInfo.RedirectStandardOutput = true;
                 process.StartInfo.RedirectStandardInput = true;
                 process.StartInfo.RedirectStandardError = true;
                 process.Start();
                 process.BeginErrorReadLine(); // 开始异步读取
                 process.WaitForExit(); // 等待转码完成
                 if (process.ExitCode == 0)
                 {
                     outStr = process.StandardOutput.ReadToEnd();
                 }
                 else
                 {
                     outStr = "";
                 }
             }
             catch (Exception ex)
             {
                              outStr = "";

             }
             finally
             {
                 process.Close();
                 process.Dispose();
             }
   return outStr;

(2) 利用ffmpeg.exe 获取音频文件的时长

          string duration = "";//时长
          try
             {
        	  using (Process pro = new Process())
               	  {
                     pro.StartInfo.UseShellExecute = false;
                     pro.StartInfo.ErrorDialog = false;
                     pro.StartInfo.RedirectStandardError = true;
                     pro.StartInfo.FileName = AppDomain.CurrentDomain.BaseDirectory + "ffmpeg" + "\\"                       + "ffmpeg.exe";
                     pro.StartInfo.Arguments = " -i " + ”要获取时长的音频文件的绝对地址“;
                     pro.Start();
                     System.IO.StreamReader errorreader = pro.StandardError;
                     pro.WaitForExit(1000);
                      string result = errorreader.ReadToEnd();
                     if (!string.IsNullOrEmpty(result))
                    	 {
                         //获取到的时长
                         result = result.Substring(result.IndexOf("Duration: ") + ("Duration: ").Length,                                    ("00:00:00").Length);
                         duration = result;
                     }
                 }
             }
       catch (Exception ex)
             {
             }

  return duration;

写在最后:本文只是列举了一下大概的实现,没有把全部代码放出来,大家可以根据核心代码自行封装即可

其实作为H5想要做语音识别,自认为还说有各种弊端得,同时还是微信公众号里面,如果小程序得话,或许会简单一点,但是这里是在公众号里面开发,在这个过程中查阅个各种资料,其实里面得东西都大同小异,但是大多数并不全, 首先微信公众号里面得H5开发语音录入,试过各种方法,由于是java渣渣,页面技术只是了解简单得,因此在使用标签得时候,本身并不能适用于当前得需求,因此最后只能选择了微信自带得录音功能,使用微信提供的接口,(具体得接口使用还是去看微信接口得使用) 由于使用微信得接口得话,首先要上传到它得服务器上面去(虽然也有本地得文件储存id,但是好像并没有用),这里就涉及到了一个serverid,这个值是存在于微信临时素材库得id,后期要用它来获取录音得文件。 通过微信提供得获取临时素材文件得接口,得到了文件(具体方法网上一搜一大堆,后期我也会将完整得代码放进资源里面),但是这里有一个坑得问题,他的格式为.amr格式,但是最后的目的是转换为文字,因此这里涉及到了格式转换 主要用了现成得技术,也是通过下载资源获取得jar以及实现得方法,将.amr转换为了MP3格式 然后就就是最后一部了,将mp3得音频文件转换为文字,我这里用的是讯飞得技术,当然百度得也可以, 其实整个需求得这个流程已经完成了,但是不得不说里面遇到得坑,由于是渣渣,除了人们总说的,转换为mp3得时候会报N/A得错误,我还遇到了unkowFormat这个错误。 这里只是记录一下自己在查询资料时没有一个符合自己需求得资料,同时也希望以后有这样需求得人,可以将思路捋的更加清楚,也可以进行交流.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值