精华内容
下载资源
问答
  • 如何实现个voip录音系统

    千次阅读 2015-07-18 11:27:51
    如何实现个高效率的voip录音系统? 采用了无锁缓冲区--环形队列。 sip消息处理和rtp包处理采用独创的写锁和读锁。

    这里讨论的voip录音系统,是在网络交换机上设置端口镜像,将所有坐席(如ip话机)的端口数据镜像到指定端口,录音系统接到该端口,抓取端口上所有的数据包。

    市场上做voip录音的厂家,有些是硬件如板卡,有些是纯软件,他们的产品存在下列缺点:
    1、很贵;
    2、会丢失录音,原因一是处理能力不够,二是程序不稳定;
    3、界面或接口复杂,有的还需要调用CTI接口。

    我花了几天思考了一下,并用一周的时间实现了它,设计目标如下:
    1、高性能:
    支持1000线以上的并发录音。
    2、简单、自成体系:
    系统对sip消息也进行了处理,分析创建会话和结束会话的消息,并从消息中抽取主叫号码、被叫号码等信息。
    支持UDP或TCP传输的sip协议。
    不支持H323等过时的协议,原因一是此类协议很复杂,二是原先使用h323协议的厂商产品如Avaya,很容易配置成SIP 。
    系统可将会话记录写到数据库表,包括主、被叫号码,开始时间,通话时长,录音文件名等信息,供外部应用进行查询匹配。
    (因为主叫或被叫,总有一方对应坐席分机,匹配和查询统计是很容易的)
    通过数据库,可以很容易和第三方应用集成。
    3、稳定:
    可长时间稳定运行,不会丢失录音,也不会丢包。
    4、支持多种音频编解码:
    包括:g711a、g711u,g729ab,gsm,g723,iLbc等多种编码。

    实现的要点:
    1、抓包采用wincaplib,抓取tcp和udp,抓取后做快速判断,比如判断是否为sip的应答、建立会话200 OK消息,或是sip的bye消息,或是rtp包,如是上述三类包,则放入到缓冲区;
    2、线程池去处理缓冲区,如sip处理的从缓冲区读取消息来生成会话和创建录音文件,或者关闭会话关闭录音。

    高效率的要点是读写必须无锁,每个线程上的缓冲区为环形队列。

    3、rtp包的处理:根据源或目标地址和端口,到会话队列中去匹配会话,此时需要对队列进行加锁。
    我参考数据库思想设计了两种锁,读锁和写锁,多个线程同时可以读,但读锁和写锁之间互斥。
    sip消息处理线程在创建会话或拆除会话时,使用写锁;
    rtp包处理线程在定位会话时,使用读锁。

    这是巧妙的设计,因为录音系统大部分时间在处理rtp包,采用读锁机制既保证了线程安全,又大大地提高了效率。

    4、媒体处理:
    每个会话的两个方向的rtp包收到后要进入缓冲区去抖动,并解码成线性pcm数据,录音合成线程(是个线程池)会以20ms的间隔去合成两个方向的pcm数据并延迟写入录音文件。延迟写入可以提高磁盘io的效率。
    媒体处理使用了蓝星际自行开发并长期使用的库:LxjMediaApi.dll,这个库经过升级后可以支持外部数据源。
    特别地,蓝星际媒体库对g729的处理十分高效,因为我们采用了Intel的IPP库,是业界公认性能最佳的g729编解码器。

    欢迎和我讨论,或索取试用程序。
    bluesen@sina.com

    展开全文
  • 李哭去的录音,这两在币圈可是传疯了,传疯了不为别的,仅仅是因为标题党,本来个正常的私下沟通的录音,在当下这个熊了半年的币圈行情下,人人敏感的神经下,取了个这个名字:李哭去割-韭-菜录音,那我可以不...

    BTC比特币价格:¥43711.16

    李哭去的录音,这两天在币圈可是传疯了,传疯了不为别的,仅仅是因为标题党,本来一个正常的私下沟通的录音,在当下这个熊了半年的币圈行情下,人人敏感的神经下,取了个这个名字:李哭去割-韭-菜录音,那我可以不客气的告诉你,币圈混的人得一半儿以上都得听过这个录音,你想想这个事件带来的流量可怕到什么地步,也可以想象这个这个标题取得水平之高!

    这个录音我是完整的听完了的,我也准备多听几遍,因为排除掉标题党不说,本身这个音频的内容,对于币圈从业者,或者准备从业者来说,都是非常有帮助的。

    网上也有很多人总结了一下李哭去的录音,但是,不客气的说,都是从批评,鄙视和投资的角度来说,很少有人从学习了解的角度来讲。

    这段录音,其实客观来说,干货满满,仔细听来,李哭去的心得几乎没有隐藏的都说出来了。

    今天我在这里讲一下我听完之后最大的几个收获。

    1、币圈最重要的是IP,其实之前我也意识到了这一点,但是没有意识的那么透彻。IP的本质是流量,而流量是不分好坏的,也不分正确与错误的,因为万事万物皆有得有失,皆有好坏,你做的再好,我也能挑出毛病,你做的再差,也能找到闪光点,唯一的评判标准,就是成王败寇,你做成了,你就是王,这在币圈是赤裸裸的。

    现在你明白币圈为什么都在撕逼了吧,吸引眼球,抓粉,互相配合,你吸你的粉,我抓我的粉,撕逼带来的流量,会割裂币圈,会让你IP从小IP到到IP,但他们不在乎,因为流量在币圈变现容易的已经是——我已经说不下去了;

    2、其他的就是一些币圈的事实了,比如,帅-初,比如老-猫,比如-孙-宇-晨,比如币-安的黑-历-史,他说的很直白,也能让你明白币圈的真实情况,这是非常有价值的。

    3、社群的价值,录这个录音的福建的这个哥们,可能是刚入币圈,对社群的价值是没有完全意识到,录音中,李哭去的话,这哥们都理解不了,我也是醉了。

    而,社群的重要性,我个人是非常赞同李哭去的看法的。我也准备建立自己的币圈社群——【黑洞社群】,希望能为刚入币圈的人,尽自己一份力量去帮助他们认识币圈本身,去投资链圈真正的好项目,去实现自己屌丝逆袭的梦想。

    如果你对黑洞社群有兴趣,可以加我微信,或者直接加入黑洞社群群:

    QQ交流群:458942499

    展开全文
  • // 将 amr 文件格式转换成 mp3 格式 ,不需要转换的在这里就结束了,当然了可以写个语句把MP3的路径保存起来,方便调用,下篇讲一下ffmpeg的安装使用。 $amrFile = DT_ROOT .'/file/upload/123/'.$now.'.amr';...

    网上查了很多资料,自己在总结一下,感谢各位大佬提供的资料。

    页面

    <div class="lbox_close wxapi_form">
    		<button class="btn btn_primary" id="startRecord">开始</button>
    		<button class="btn btn_primary" id="deleteVoice">删除</button>
    		<button class="btn btn_primary" id="uploadVoice">确认</button>
    	</div>
    
    <script>
    	//文档加载完后立即执行
    	wx.config({
    		debug: false, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
    		appId: '{$sign["appId"]}', // 必填,公众号的唯一标识
    		timestamp: {$sign['timestamp']}, // 必填,生成签名的时间戳
    		nonceStr: '{$sign["nonceStr"]}', // 必填,生成签名的随机串
    		signature: '{$sign["signature"]}',// 必填,签名
    		jsApiList: [
    			"startRecord",
    			"stopRecord",
    			"onVoiceRecordEnd",
    			"playVoice",
    			"pauseVoice",
    			"stopVoice",
    			"onVoicePlayEnd",
    			"uploadVoice",
    			"downloadVoice",]// 必填,需要使用的JS接口列表
    	});
    
    	wx.ready(function () {
    				var voice = {
    					localId: '',
    					serverId: ''
    				};
    				var startRecord = document.querySelector('#startRecord');
    				var stopClearTimeout;
    				startRecord.onclick = function () {
    					//开始录音
    					if(startRecord.innerHTML == '开始'){
    						wx.startRecord({
    							success: function(){
    								startRecord.innerHTML = '停止';
    								//30秒后自动停止;
    								stopClearTimeout = setTimeout(function(){
    									wx.stopRecord({
    										success: function (res) {
    											voice.localId = res.localId;
    											startRecord.innerHTML = '试听';
    										}
    									});
    								},30000);
    							}
    						});
    					}
    
    					//结束录音
    				if(startRecord.innerHTML =='停止'){
    						wx.stopRecord({
    							success: function (res) {
    								clearTimeout(stopClearTimeout);
    								startRecord.innerHTML = '试听';
    								voice.localId = res.localId;
    							},
    							fail: function (res) {
    								alert(JSON.stringify(res));
    							}
    						});
    					}
    
    					//试听音频
    				if(startRecord.innerHTML =='试听'){
    						if (voice.localId == '') {
    							alert('请先录制一段声音');
    							return;
    						}
    						wx.playVoice({
    							localId: voice.localId
    						});
    					}
    
    				};
    
    				//删除语音,重新录音;
    				document.querySelector('#deleteVoice').onclick = function(){
    					voice.localId = '';
    					startRecord.innerHTML = '开始';
    				};
    
    				//确认上传语音
    				document.querySelector('#uploadVoice').onclick = function () {
    					if (voice.localId == '') {
    						alert('请先录制一段声音');
    						return;
    					}
    					wx.uploadVoice({
    						localId: voice.localId, // 本地微信语音文件标识
    						isShowProgressTips: 1, // 开启上传提示
    						success: function (res) {
    							//上传成功后从微信服务器下保存
    							voice.serverId = res.serverId;
    							$.ajax({
    								url: '/mobile/member/luyin.php?action=save',//后台接收数据地址
    								type: 'post',
    								data: {'id': voice.serverId},
    								success: function (msg) {
    									if(msg == 1){
    										alert('上传成功!');
    									}
    								}
    							});
    
    						},
    						error:function(res){
    
    							alert("上传失败");
    						}
    					});
    				};
    
    			});
    
    
    		wx.error(function (res) {
    			 alert("出现错误请重试:"+res.errMsg);
    		});
    </script>
    

    后台接收数据保存部分,使用到了ffmpeg,将amr格式的文件转换为MP3

    	$id=$_POST['id'];
    		$now=time();
    		$url="http://file.api.weixin.qq.com/cgi-bin/media/get?access_token=$access_token&media_id=$id";
    		$targetName =  DT_ROOT .'/file/upload/123/'.$now.'.amr';   //保存目录,格式为www/wwwroot/http:...../。。.amr;
    		ob_start();
    		readfile($url);
    		$luyin  = ob_get_contents();
    		ob_end_clean();
    		$size = strlen($luyin);
    		$fp = fopen($targetName, 'a');
    		fwrite($fp, $luyin);
    		fclose($fp);
    		
    		// 将 amr 文件格式转换成 mp3 格式  ,不需要转换的在这里就结束了,当然了可以写个语句把MP3的路径保存起来,方便调用,下一篇讲一下ffmpeg的安装使用。
    		$amrFile = DT_ROOT .'/file/upload/123/'.$now.'.amr';
    		$mp3File =  DT_ROOT .'/file/upload/123/'.$now.'.mp3';
    		// 调用PHP命令,将amr格式文件转换为mp3
    		$command = "ffmpeg -i " . $amrFile . " " . $mp3File . " 2>&1";
    		$a1=exec($command, $output1,$return1);
    		$a2=$a1.'|'.$output1.'|'.$return1;
    		//var_dump($al);
    		$videourl=$CFG['url'] .'/file/upload/123/'.$now.'.mp3';//类似http:....../时间戳.mp3
    //		$videourl=$mp3File;
    		$names=$_username;
    		$db->query("INSERT INTO {$DT_PRE}sound_record (userid,username,soundrecord,addtime,status) VALUES ('$_userid','$names','$videourl','$now','1')");
    		echo 1;
    		exit;
    

    转载自:微信 JS-SDK 录音功能开发

    展开全文
  • 看我如何使用Python打造一个溜娃神奇(一玩一天)?

    一、终于为孩子找到了个靠谱的口语老师

    “再穷不能穷教育,再苦不能苦孩子”,作为娃的爸妈,不仅仅要努力工作保证物质支持,更要关注娃的学习状况,而且时刻都怕娃“输在了起跑线上”,可是,现在孩子们的起跑线也太多了点,英语、各种艺术特长,甚至跳绳,忙的不亦乐乎。然而家长也不是全才啊,这不,我的姐姐最近就开始发愁女儿的英语口语问题了,自己发音不准确,报班又不知道哪家靠谱,眼看着孩子就要落后于小伙伴了,了解到这个情况后,我拿出英语课本,想到自己每次都是60飘过的英语成绩,又放了回去,拿起了我的武器——代码。

    在这里插入图片描述

    近些年自然语言处理已经成熟地应用在很多领域,智能语音测评的使用成本早已是大众所能承受。根据给娃纠正读音的需求,我最终选择调用靠谱的大厂,有道智云的API来开发个简易语音评测程序,或者称之为——智能口语老师!

    二、准备工作

    首先,是需要在有道智云的个人页面上创建实例、创建应用、绑定应用和实例,获取到应用的id和密钥。具体个人注册的过程和应用创建过程详见文章分享一次批量文件翻译的开发过程

    在这里插入图片描述

    三、 开发过程详细介绍

    下面介绍具体的代码开发过程。

    首先研究官方文档给出的API输入输出规范。该API采用https方式通信,简单来说,就是将预先录制好的声音文件编码处理,签名后提交给API,解析API返回的json即可得到评分结果。

    接口地址:

    https接口: https://openapi.youdao.com/iseap

    API输入所需参数如下表:

    字段名 类型 含义 必填 备注
    q text 要评测的音频文件的Base64编码字符串 True 必须是Base64编码
    text text 要评测的音频文件对应的文本 True have a good day
    langType text 源语言 True 支持语言
    appKey text 应用ID True 可在 应用管理 查看
    salt text UUID True UUID
    curtime text 时间戳(秒) True TimeStamp
    sign text 签名,通过sha256(应用ID+input+salt+curtime+应用密钥)生成;input的生成规则见表下的备注 True sha256(应用ID+input+salt+curtime+应用密钥)
    signType text 签名类型 True v2
    format text 语音文件的格式,wav true wav
    rate text 采样率,推荐 16000 采用率 true 16000
    channel text 声道数, 仅支持单声道,请填写固定值1 true 1
    type text 上传类型, 仅支持base64上传,请填写固定值1 true 1

    其中签名sign生成方法如下:
    signType=v2; sign=sha256(应用ID+input+salt+curtime+应用密钥)。
    这里需要注意的是input的计算方式为:input=q前10个字符 + q长度 + q后10个字符(当q长度大于20)或 input=q字符串(当q长度小于等于20)。

    接口的输出参数如下:

    字段 含义
    errorCode 识别结果错误码,一定存在。 详细信息可见 错误代码列表
    refText 请求的文本
    start 音频中句子开始时间,单位是秒
    end 音频中句子结束时间,单位是秒
    integrity 句子完整度得分
    fluency 句子流利度得分
    pronunciation 句子准确度得分
    speed 语速,单词/分钟
    overall 句子综合评分
    words 单词评分数组
    -word 单词
    -start 单词开始时间,单位是秒
    -end 单词结束时间,单位是秒
    -pronunciation 单词准确度得分
    -phonemes 音标数组
    –phoneme 音标
    –start 音标开始时间,单位是秒
    –end 音标结束时间,单位是秒
    –judge 判断音素是否错误,true为发音正确,false为发音错误,同时calibration给出提示
    –calibration 如果发音错误,提示用户该发音像什么
    –prominence 重音程度,分数越高,当前音标越可能是重音,分数在[0 100]
    –stress_ref 元音重音参考/标准答案,如果为true,说明参考答案认为该元音应该发重音,辅音时无意义
    –stress_detect 在一个单词中,用户该音标发音为重音

    (一)Demo开发:

    这个demo使用python3开发,包括maindow.py,audioandprocess.py,isebynetease.py 三个文件,分别为demo的界面、录音以及其他逻辑处理和智能语音评测接口调用方法的封装。

    ** 1. 界面部分:**

    UI 部分大体分为三部分,文章处理区域、录音区域和评分展示区域。

    在这里插入图片描述

    其布局代码如下:

    root=tk.Tk()
    root.title("youdao ise test")
    frm = tk.Frame(root)
    frm.grid(padx='50', pady='50')
    
    # 选取文章
    btn_get_file_path=tk.Button(frm,text='选择课文 :',command=get_file)
    btn_get_file_path.grid(row=0,column=0)
    
    text1=tk.Text(frm,width='70', height='2')
    text1.grid(row=0,column=1)
    
    # 文章内容展示
    text2=tk.Text(frm,width='70', height='5')
    text2.grid(row=1,column=1)
    
    # 开始和停止录音
    btn_start_rec=tk.Button(frm,text='录音',command=start_rec,width=10)
    btn_start_rec.grid(row=2,column=0)
    
    lb_Status = tk.Label(frm, text='Ready', anchor='w', fg='green')
    lb_Status.grid(row=2,column=1)
    
    btn_stop_rec=tk.Button(frm,text="结束录音",command=stop_rec)
    btn_stop_rec.grid(row=2,column=2)
    
    # 打分按钮和结果展示
    btn_score=tk.Button(frm,text="评分",command=start_score,width=10)
    btn_score.grid(row=3,column=0)
    
    text3=tk.Text(frm,width='70', height='10')
    text3.grid(row=3,column=1)
    
    root.mainloop()
    

    其中启动按钮btn_score的绑定事件start_score()来收集带所有的文本文件,启动合成,并打印运行结果:

    def start_score():
        result=au_model.get_score(file_dict)
        for r in result:
            text3.insert(tk.END,r)
    

    ** 2、audioandprocess.py**
    这里主要实现了文件处理、录音和处理接口返回的功能。首先定义一个Audio_model

    class Audio_model():
        def __init__(self, audio_path,is_recording):
            self.current_file=''				# 当前录音对应的原文路径
            self.is_recording=is_recording		# 录音状态标识
            self.audio_chunk_size=1600			# 以下均为录音必要参数
            self.audio_channels=1
            self.audio_format=pyaudio.paInt16
            self.audio_rate=16000
    

    record_and_save()方法进行录音并保存到项目的record路径中,录音文件名与原文的文件名相同,便于对应。

        def record_and_save(self):
            self.is_recording = True
            file_name=self.get_file_name(self.current_file)
            self.audio_file_name='./record/'+file_name+'.wav'
            threading.Thread(target=self.record,args=(self.audio_file_name,)).start()
    

    get_score()方法实现了调用isebynetease.py中封装的工具并解析返回值的功能:

        def get_score(self,dict):
            result=[]
            #self.is_recording=False
            for path in dict:
                file_content=self.get_content(path)
                file_name=self.get_file_name(path)
                audio_path='./record/'+file_name+'.wav'
                print(file_content,audio_path)
                score_result=connect(audio_path,file_content)
                #处理结果,添加进结果集
                result.append( score_result)
            return result
    

    3、 isebynetease.py

    isebynetease.py中是和请求有道智云API直接相关的一些方法,最核心的是connect()方法,整合了API所要求的各个参数,并调用执行请求的方法do_request(),而后根据UI的展示需求,处理API的返回结果并拼接字符串。

    def connect(audio_file_path,audio_text):
        recordname=audio_file_path.split("/")[-1]
        audio_file_path = audio_file_path
        lang_type = 'en' # 当前仅支持英文
        extension = audio_file_path[audio_file_path.rindex('.')+1:]
        if extension != 'wav':
            print('不支持的音频类型')
            sys.exit(1)
        wav_info = wave.open(audio_file_path, 'rb')
        sample_rate = wav_info.getframerate()
        nchannels = wav_info.getnchannels()
        wav_info.close()
        with open(audio_file_path, 'rb') as file_wav:
            q = base64.b64encode(file_wav.read()).decode('utf-8')
    
        data = {}
        data['text'] = audio_text
        curtime = str(int(time.time()))
        data['curtime'] = curtime
        salt = str(uuid.uuid1())
        signStr = APP_KEY + truncate(q) + salt + curtime + APP_SECRET
        sign = encrypt(signStr)
        data['appKey'] = APP_KEY
        data['q'] = q
        data['salt'] = salt
        data['sign'] = sign
        data['signType'] = "v2"
        data['langType'] = lang_type
        data['rate'] = sample_rate
        data['format'] = 'wav'
        data['channel'] = nchannels
        data['type'] = 1
    
        # 处理返回值
        response = do_request(data)
        j = json.loads(str(response.content, encoding="utf-8"))
        print(j)
        # 句子完整度
        contextIntegrity="句子完整度:"+str( round(j["integrity"], 2))+"  "
        pronunciation="发音准确度:"+str(round(j["pronunciation"],2))+"  "
        fluency="流利度:"+str(round(j["fluency"],2))+"  "
        speed="语速:" +str(round(j["speed"],2))+" "
        recordAndResult=recordname+" "+contextIntegrity+pronunciation+fluency+speed+"\n"
       
        return recordAndResult
    

    (二)效果展示

    展示一下本人纯正的”chinenglish“ 录音后程序的运行情况(得分多少不重要,重要的是它客观的评价方式 :P )

    首先介绍一下操作方法:

    • 1)点击“选择文章”,选择需要评测的文章;

    • 2)点击“录音”,“结束录音”按钮,进行语音录制;

    • 3)如需对多篇文章进行评测,重复1)、2)步骤即可

    • 4)点击“评分“,进行智能语音评测,并展示评分结果,同时将详细评分结果,存储在本代码路径的result目录下。

    在这里插入图片描述

    效果展示

    界面部分:展示了 句子完整度、发音准确度的、流利度的得分,以及语速:

    在这里插入图片描述

    文档部分:分别对每个语音进行了测评,并将返回的详细结果以json的形式存在了result文件夹下。
    在这里插入图片描述

    输出结果展示:

    {
        ’integrity‘: 100,//句子完整度
        'refText’: "Are you ok? ",//待评测语音对应的文本
        'pronunciation': 67.108101,//句子发音准确度
        'start': 0.030000,//音频开始时间,秒
        	'words': [{ //单词信息列表
    		'pronunciation': 50.640327, //单词准确度分数
    		'start': 0.73, //单词开始时间,秒
    		'end': 0.76,//单词结束时间,秒
    		'word': 'Are', //单词文本
    		'phonemes': [{ //音标信息列表
    			'stress_ref': False, //元音重音参考(即标准重音),如果为true,说明参考答案认为该元音应该发重音,辅音时无意义
    			'pronunciation': 50.640331, //音标准确度评分
    			'stress_detect': False,//在一个单词中,用户该音标发音不为重音
    			'phoneme': 'ɝ', //音标名称
    			'start': 0.73,  //音标开始时间,秒
    			'end': 0.76,    //音标结束时间,秒
    			'judge': True,  //判断音标是否错误,true为发音正确,false为发音错误,同时calibration给出提示
    			'calibration': 'ɝ', //判断音标是否错误,true为发音正确,false为发音错误,同时calibration给出提示
    			'prominence': 1 //重音程度,当前音标越可能是重音,分数区间[0 100]
    		}]
    	}, {
    		'pronunciation': 76.810608,
    		'start': 0.77,
    		'end': 1.08,
    		'word': 'you',
    		'phonemes': [{
    			'stress_ref': False,
    			'pronunciation': 79.084282,
    			'stress_detect': False,
    			'phoneme': 'j',
    			'start': 0.77,
    			'end': 0.86,
    			'judge': True,
    			'calibration': 'j',
    			'prominence': 0.944885
    		}, {
    			'stress_ref': True,
    			'pronunciation': 74.536934,
    			'stress_detect': True,
    			'phoneme': 'u',
    			'start': 0.87,
    			'end': 1.08,
    			'judge': True,
    			'calibration': 'u',
    			'prominence': 1
    		}]
    	}, {
    		'pronunciation': 66.129013,
    		'start': 1.14,
    		'end': 1.8,
    		'word': 'ok',
    		'phonemes': [{
    			'stress_ref': True,
    			'pronunciation': 69.046341,
    			'stress_detect': True,
    			'phoneme': 'o',
    			'start': 1.14,
    			'end': 1.27,
    			'judge': True,
    			'calibration': 'o',
    			'prominence': 1
    		}, {
    			'stress_ref': False,
    			'pronunciation': 65.357841,
    			'stress_detect': False,
    			'phoneme': 'k',
    			'start': 1.28,
    			'end': 1.42,
    			'judge': True,
    			'calibration': 'k',
    			'prominence': 0.838557
    		}, {
    			'stress_ref': True,
    			'pronunciation': 63.982838,
    			'stress_detect': True,
    			'phoneme': 'e',
    			'start': 1.43,
    			'end': 1.8,
    			'judge': True,
    			'calibration': 'e',
    			'prominence': 0.956448
    		}]
    	}],
    	'fluency': 83.554047, //句子流利度
    	'overall': 83.885124,//句子综合评分
    	'errorCode': '0', //识别结果错误码,一定存在
    	'end': 1.8,//句子结束时间,秒
    	'speed': 55.555557 // 句子语速(单词/分钟)
    }
    

    四、总结

    有道智云的智能语音评测API文档清晰,调用过程全程无坑,开发体验非常友好,评分结果客观公正,很具有参考价值,以至于我都想和小侄女一起学习进步去了!

    项目地址:https://github.com/LemonQH/BatchISEDemo

    展开全文
  • 通过系统cron来执行,将每天生成的录音传输到单独的录音服务器上,该脚本是我一直在用的,在局域网内,每天传输几万的录音,个把小时就可以搞定
  • android 录音

    千次阅读 2013-05-28 09:46:28
    原帖:...   直接给上个详细的使用Android MediaRecorder进行手机录音解说代码: package cn.com.chenzheng_java.media; import java.io.IOException; import android.
  • 感冒自然好&推荐个Mini录音

    千次阅读 2004-10-22 16:59:00
    想了想,乖乖,好久没有运动了,嗯,今后要多运动了,苦练今天阿球发了个自己唱的歌给我,8错哦,呵呵,我也去下载了相关软件,呵呵,自己也来录音,过两把自己唱的歌发上来,哈 哈 具体方法如下:第步:...
  • 最近几心血来潮,做了个搜索证据的app-------证据宝,功能如下: :普通录音功能,可以在应用内启动和停止录音,也可以按音量键启动和停止录音,熄屏或者锁屏状态也可以录制,可以在设置页面禁止此功能。 二...
  • MCI 录音程序

    2013-08-11 00:05:16
    下面是录音程序,比较简单,但现实是不怎么实用的。 // 开始录音按钮 void CTest1Dlg::OnBtnrecord() {  char szBuf[256];  m_mciOpenParmsa.lpstrDeviceType = "waveaudio"; // 代表是音频wave数据  m_...
  • 网页上面嵌入录音插件,可以录音,播放

    万次阅读 热门讨论 2017-01-03 18:51:51
    转载至:... 网页在线录音并上传 前段时间接了个外包项目,有一个功能是网页在线录音并上传云服务器的需求,之前没有接触过,想着Google了一下找个demo改改; 找到三个,基本满足需求: ...
  • 标准19寸机架式设计,可以安装在机柜里面节省空间,完全独立无须依赖电脑即可工作的录音设备,采用...录音记录查询,声音回放,即时监听等等功能,大大方便了设备的施工,安装,调试,是台真正的嵌入式录音服务器。
  • 无限制录音时长、识别全部语音文件
  • Android完美实现录音笔记功能、目标二、准备工作回顾三、开发过程1. 增加录音功能2. 请求录音权限3. 整合录音编辑器4. 定义录音数据结构5. 实现录音助手类四、开发过程回顾五、发现的问题六、遗留问题七、接下来八...
  • 人工智能靠人工:标注员1要听1000条录音 燃财经(ID:rancaijing)原创 作者 | 周晶晶 编辑 | 阿伦 如今,智能设备越来越多地出现在每个人的生活中,在享受它们带来的便利时,很多人或许没有意识到,自己说...
  • WebRTC录音(1)-实现通话双向录音

    千次阅读 2014-11-19 09:52:33
    最近公司的iPad项目中个功能点涉及到了VOIP通讯中的录音,需要在已的WebRTC引擎中增加录音功能,录制通话双方的声音 参考了往上位兄弟的博文(链接在此 ...
  • MIUI7 录音实现代码整理

    千次阅读 2016-03-22 01:10:35
    最近项目需要在android上做录音实现,入手了份miui7的录音机代码,虽然不直接安装,但是还是参考着做出了自己的实现。 如果有空了,就将miui录音机实现整理整理发上来,所以这篇文章后面会更新。起个帖子,权作...
  • 今日早间,段疑似“币圈首富”李笑来的谈话录音被曝光,这段谈话内容涉及众多区块链项目以及币圈人物,包括老猫、neo、以太坊、Ripple...“个骗子交易所叫币安,个骗子叫孙宇晨,你怎么落后他们,要加速做事...
  • 微信H5录音实现

    千次阅读 2019-07-11 23:36:55
    前提 用过微信JSSDK的童鞋都应该知道,使用它需要先在公众号上绑定安全域名、并且实现权限验证逻辑,具体细节... 开始录音接口 wx.startRecord(); 停止录音接口 wx.stopRecord({ success: function (r...
  • 关于windowsAPI录音

    2015-10-17 17:25:48
    、须添加mmsystem.h头文件 二、须添加winmm.lib库文件 三、waveInOpen函数提供把录音的消息回传到窗口函数和专用回调函数两种方式 如果要把录音层和UI层分离则最好使用专用回调函数方式,具体做法如下: ...
  • 近几一直郁闷件事情,在自己和同事电脑写的flex 录音程序非常正常,波形反馈,而且正确清晰的听到了录音,也就是说采集到了数据但是在一些客户那里却没有波形而且采集不到数据。(客户系统自带的录音程序可以...
  • Android录音MP3解决方案

    千次阅读 2017-03-21 14:44:56
    这几,接了个政府的项目,其中有一个需求是可以在Android本地录音并且传送到服务器,让服务器的WEB端可以进行播放。然后我使用的是Android自己的MediaRecorder,但是这个录音生成的编码形式非常具有局限性,其...
  • Vue使用微信录音并上传服务端

    千次阅读 2019-10-27 21:12:07
    在微信公众号或者微信h5的网页开发中,会用到录音等功能,在微信里面使用微信录音会比较好一点,不用去设置ios和android的h5录音兼容性,并且h5的其他录音js文件可能不兼容微信浏览器等,所以vue中集成微信录音功能...
  • 李笑来,原新东方名师,自称“中国比特币首富”,著名天使投资人,著《把时间当作朋友》。李笑来私下谈话遭录音,割韭菜录音曝光(附原版语音)7月3日深夜,几个币圈微博号突然曝...
  • Android 实时获取麦克风录音的音量大小

    万次阅读 热门讨论 2013-05-21 14:54:02
    前几个关于录音并获取音量大小的模块,今天写个demo和大家分享。如果各位更好的方法可以留言提醒我,谢谢。  首先录音功能很容易实现,通过audiorecord或者mediarecorder都可以实现,如果要获取录音...
  • 录音效果及Touch事件的分发

    千次阅读 2014-04-12 18:12:14
    最近做个项目,类似于微信和按住录音,松开停止录音的效果,这些类似于录音的功能很容易做,但是由于自己的大意,那个触摸事件的触摸点的采集总是问题,烦躁了好几,今天总算将bug抓了出来,特以此文,祭奠...
  • 我的github repo audio.js是我在微信jssdk上封装的录音接口, 目的是: 兼顾Desktop和微信调试. 绕过微信JSSDK的BUG, 让录音操作更加Robust, 快速连按不易出错. 既支持回调函数, 又支持异步的prom...
  • Android自动接听来电并录音

    千次阅读 2019-01-23 22:32:19
    最近个朋友(产品经理)找我说想我帮忙做个东西,我百般推辞,各种理由,尤其是想起当初一起没少撕逼,更是百般的不愿意,但是最后碍于私人交情,还是应承下来了,大致的要求是自动接听电话,播放预先设置好的语音...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 14,950
精华内容 5,980
关键字:

有什么能录音一天的