-
【iOS】录音和音频合成
2020-01-14 09:41:13项目中有个分段朗读课文、朗读完成后合成一段音频播放的需求,三下五除二写完发现不少坑,记录一下。 先放录音代码 //录音 -(void)startRecordWithPath:(NSString *)path{ //如果在录音,停止 if (_audioRecord....项目中有个分段朗读课文、朗读完成后合成一段音频播放的需求,三下五除二写完发现不少坑,记录一下。
先放录音代码
//录音 -(void)startRecordWithPath:(NSString *)path{ //如果在录音,停止 if (_audioRecord.isRecording) { [self stopRecord]; } //创建文件保存路径 NSURL *url = [NSURL URLWithString:path]; //创建录音格式 NSDictionary *setting = [self getAudioSetting]; //创建录音机 NSError *error = nil; _audioRecord = [[AVAudioRecorder alloc] initWithURL:url settings:setting error:&error]; if (error) { NSLog(@"创建错误:%@",error); } //删除掉文件 [YWFileManager deleteFileWithPath:path]; //初始化会话,变为使用听筒的录音 AVAudioSession *audioSession = [AVAudioSession sharedInstance]; [audioSession setCategory:AVAudioSessionCategoryPlayAndRecord error:nil]; //开始录制 if (!_audioRecord.isRecording) { [_audioRecord record]; } }
这里有个坑,就是会话。
录音的会话playAndRecord会将声音切换到听筒播放,如果像我们一样有需求录音完之后回放一下的话,要在停止录音之后将会话更改回playback,使用扬声器播放。录音的设置
//录音格式 -(NSDictionary *)getAudioSetting{ NSMutableDictionary *setting = [NSMutableDictionary dictionary]; //录音格式 [setting setValue:@(kAudioFormatLinearPCM) forKey:AVFormatIDKey]; //通道数 [setting setValue:@(2) forKey:AVNumberOfChannelsKey]; //采样率 [setting setValue:@(11025.0) forKey:AVSampleRateKey]; //音频质量 [setting setValue:@(AVAudioQualityMin) forKey:AVEncoderAudioQualityKey]; return setting; }
停止录音
//停止录音 -(void)stopRecord{ //结束录音 [_audioRecord stop]; //将声音变回使用扬声器播放 AVAudioSession *audioSession = [AVAudioSession sharedInstance]; [audioSession setCategory:AVAudioSessionCategoryPlayback error:nil]; }
上面是录音的代码部分,接下来是音频合成。
/** 拼接音频 */ -(void)composedAudioWithAudios:(NSArray *)audios toSavePath:(NSString *)savePath completd:(void (^)(NSError *error))completdBlock{ //如果文件存在,删除 //1 if ([YWFileManager fileIsExistWithPath:savePath]) { [YWFileManager deleteFileWithPath:savePath]; } AVMutableComposition *composition = [[AVMutableComposition alloc] init]; //添加一个音频轨道并返回 AVMutableCompositionTrack *track = [composition addMutableTrackWithMediaType:AVMediaTypeAudio preferredTrackID:0]; //设置开始时间 CMTime beginTime = kCMTimeZero; //错误对象 NSError *error = nil; //循环添加音频资源 for (NSString *filePath in audios) { //2. AVURLAsset *audioAsset = [[AVURLAsset alloc]initWithURL:[NSURL fileURLWithPath:filePath] options:nil]; //需要合并的音频文件播放区间 CMTimeRange audioRange = CMTimeRangeMake(kCMTimeZero, audioAsset.duration); //添加 BOOL success = [track insertTimeRange:audioRange ofTrack:[[audioAsset tracksWithMediaType:AVMediaTypeAudio] objectAtIndex:0] atTime:beginTime error:&error]; if (!success) { NSLog(@"合成失败:%@",error); completdBlock(error); return ; } //记录下次的开始时间(这一段尾部) beginTime = CMTimeAdd(beginTime, audioAsset.duration); } //导出文件 AVAssetExportSession *export = [[AVAssetExportSession alloc] initWithAsset:composition presetName:AVAssetExportPresetAppleM4A]; //设置导出的url //3 export.outputURL = [NSURL fileURLWithPath:savePath]; //4、导出的文件格式 export.outputFileType = @"com.apple.m4a-audio"; //导出 [export exportAsynchronouslyWithCompletionHandler:^{ dispatch_async(dispatch_get_main_queue(), ^{ completdBlock(export.error); }); }]; }
1、如果需求文件可以覆盖,像朗读课文合成音频之后再读一次,文件名不会改变,文件内容发生改变,一定要删除掉原有的文件,再进行合成,音频合成不会直接覆盖源文件,如果储存位置已经有同名文件,error会报这个错误:
Domain=AVFoundationErrorDomain Code=-11823 “无法存储” UserInfo={NSLocalizedRecoverySuggestion=请重试存储。, NSLocalizedDescription=无法存储, NSUnderlyingError=0x282ff4c90 {Error Domain=NSOSStatusErrorDomain Code=-12101 “(null)”}}2、URL创建时一定要用fileUrlWithPath,不可以使用URLWithString,用这个方法会导致[audioAsset tracksWithMediaType:AVMediaTypeAudio]返回数组为nil,后面插入音轨的时候就会因为数组越界而崩溃。
3、导出时的文件地址也需要用fileURLWithPath这个方法才可以,否则报错。错误信息是AVFoundationErrorDomain Code=-11800, An unknown error occurred (-12780)
4、导出的文件格式和presetName需要对应。
-
讯飞录音,把几个pcm合成为wav
2015-11-03 11:13:01由于讯飞录音是不能把一段很长的话录音出来,只能是一段一段的录,所以要把录出来的pcm数据合成wav文件,录音的采样率是8k, 比特率是16bit,双声道,合并的代码如下: public static boolean mergePCMFilesToWAVFile...由于讯飞录音是不能把一段很长的话录音出来,只能是一段一段的录,所以要把录出来的pcm数据合成wav文件,录音的采样率是8k, 比特率是16bit,双声道,合并的代码如下:
<span style="font-size:14px;">public static boolean mergePCMFilesToWAVFile(ArrayList<String> fileList, String DESTINATION_PATH) { File[] file = new File[fileList.size()]; byte buffer[] = null; int TOTAL_SIZE = 0; int FILE_NUMBER = fileList.size(); for (int i = 0; i < FILE_NUMBER; i++) { file[i] = new File(fileList.get(i)); TOTAL_SIZE += file[i].length(); } // 填入参数,比特率等等。这里用的是16位单声道 8000 hz WaveHeader header = new WaveHeader(); // 长度字段 = 内容的大小(TOTAL_SIZE) + // 头部字段的大小(不包括前面4字节的标识符RIFF以及fileLength本身的4字节) header.fileLength = TOTAL_SIZE + (44 - 8); header.FmtHdrLeth = 16; header.BitsPerSample = 16; header.Channels = 2; header.FormatTag = 0x0001; header.SamplesPerSec = 8000; header.BlockAlign = (short) (header.Channels * header.BitsPerSample / 8); header.AvgBytesPerSec = header.BlockAlign * header.SamplesPerSec; header.DataHdrLeth = TOTAL_SIZE; byte[] h = null; try { h = header.getHeader(); } catch (IOException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } if (h.length != 44) // WAV标准,头部应该是44字节,如果不是44个字节则不进行转换文件 return false; //先删除目标文件 File destfile = new File(DESTINATION_PATH); if(destfile.exists()) destfile.delete(); //合成所有的pcm文件的数据,写到目标文件 try { buffer = new byte[1024 * 4]; // Length of All Files, Total Size InputStream inStream = null; OutputStream ouStream = null; ouStream = new BufferedOutputStream(new FileOutputStream( DESTINATION_PATH)); ouStream.write(h, 0, h.length); for (int j = 0; j < FILE_NUMBER; j++) { inStream = new BufferedInputStream(new FileInputStream(file[j])); int size = inStream.read(buffer); while (size != -1) { ouStream.write(buffer); size = inStream.read(buffer); } inStream.close(); } ouStream.close(); } catch (FileNotFoundException e) { System.out.println("File not found " + e); } catch (IOException ioe) { System.out.println("Exception while reading the file " + ioe); } deleteFiles(fileList); System.out.println("Merge was executed successfully.!"); return true; }</span>
-
语音合成工具资源分享
2020-12-08 13:35:47般来说,我们要将一段文字转换为一个 wav 的语音文件主要是 靠录音,就电脑上装一个录音软件,然后人一边念一边录。但这样做 太麻烦了,效率太低。现在一般都是用语音合成软件,直接把文字变 成 wav 格式的语音文件... -
背景音乐合成专家 v1.65.zip
2019-07-08 16:11:16可指定音乐播放一段时间后再进行语音播放,随意调整合成方式 支持在播放语音时,自动降低背景音乐音量 支持背景音乐的“淡入”、“淡出”效果,让制作效果更专业 完美支持 Windows 2000/XP/Vista/7/8 操作系统 ... -
DTW语音合成试验(南大音合成大作业)
2018-10-09 09:12:10每个同学都录了一段持续时间为三秒钟的,语音内容为“我爱南京大学”的语音数据,试验目标是使用一些语音处理的方法把同学们的声音合在一起,实现出大家一起喊出“我爱南京大学”的效果,由于每个人的语速不同,录音...每个同学都录了一段持续时间为三秒钟的,语音内容为“我爱南京大学”的语音数据,试验目标是使用一些语音处理的方法把同学们的声音合在一起,实现出大家一起喊出“我爱南京大学”的效果,由于每个人的语速不同,录音起始点不同,所以需要使用一定的方法将语音对齐,然后叠加在一起。本次试验尝试了动态规划算法和直接线性拉伸两种算法。
其中,DTW算法的匹配结果如下所示:
整个试验的所有代码及报告见https://download.csdn.net/download/qq_22707525/10707532
-
ios 录音播放udp数据包传输过来的pcmData流
2019-03-08 16:59:03把两个包合成一个包来处理即可。 写这篇文章的时候还参考了另外一篇文章的思路 https://www.jianshu.com/p/d903d2c8ffd2 说到了遇到网络卡该怎么处理 一点是要缓冲一段再播放, 另外一点就是加上空的静音包, 来... -
波动性语料个人语音合成分析(TODO)
2020-10-23 15:25:21问题: 3000句 整体录音环境不好 有波动性, 有些句子好, 有些质量差 目的: 目标是合成这个人的音色 ...选一段(类似回声消除算法), 减去白噪声, 至少可以用工具一句一句处理(也可以批处理) 还有问题:
- 3000句
- 整体录音环境不好
- 有波动性, 有些句子好, 有些质量差
目的:
- 目标是合成这个人的音色
- 高质量的合成, 可商用
- 风格, 情感, 韵律不强要求
- 风格, 情感, 韵律能保留更好(比如三年前录制的电销语料)
角度一
通过工具降噪
先处理问题2, 尽量在挑选语料之前, 先做2, 尽量保留语句
是录制的问题, 因此是白噪声
进行"美图", 其实是接着当时准备TTS语料未完成的完成
选一段(类似回声消除算法), 减去白噪声, 至少可以用工具一句一句处理(也可以批处理)
还有类似视觉的降噪
角度二
筛选
- 先挑选, 数据清洗,
- 分层级去挑: 特别好的, 过得去的, 很差的
假设挑出来了300~1000句
角度三
小语料配大语料
大语料训好后风格迁移小语料
大语料小语料multi-speaker同时训
经验上来看, 1000句有, 则可以multi-speaker
角度四
随机拼接扩增
- 音频剪切成片段
- 通过随机片段拼接, 形成新的音频
类似于高质量的波形拼接
分析:
- 缺点一, 破坏了句子的连贯, 韵律等
- 缺点二, 看上去语料变大, 实际上前后还是那样, 没有变多
- 优点, 相当于人为理解的数据, 构造出来, 通过这种方式, (数据增强)来指引网络
因此如何随即拼接, 切到什么粒度, 如何构建虚拟语料, 比如ASR中的VAD
-
蓝光影音Mp3录音机2.54绿色版
2019-07-29 22:40:55蓝光影音Mp3分割器免费版是一款小巧精致的Mp3分割器,Mp3转换器软件,可以很简单的将一段Mp3切割成多个片断,每个片段可以制作淡入淡出效果,而且可以增大Mp3本身的声音。除此之外,Mp3分割器还可以压缩mp3文件... -
怎么合成音乐_干货分享,音频剪辑、合成、转换,制作环绕音效的免费app
2021-01-11 18:11:37想把两段歌曲合并一起,不知道怎么做。关于音乐剪辑呢,许多app都自带的,这里不多说。还有就是音频的格式转换,比如把录音的amr格式转为mp3,许多app不支持这个功能。或者说你把多个音频混合在一起。或者你想自己... -
iOS录音模块实践[AVAudioRecoder]
2018-04-01 09:13:52需求:IM语音聊天,IM采用腾讯的IM,语音录制部分有自己的UI设计,大概是这个样子(弹出一个pop框,先用合成器说一段“现在给xxx留言吧”,马上开始录制音频,5秒后出现可以发送按钮,最大30s发送语音,留言过程中要... -
windows录音机录制系统内的声音
2005-03-11 20:11:00系统自带的录音机还可以把原声录下后插入混合声音文件,还能把两段录音合在一起保存为一个文件。可惜不便的是windows只能录制60秒内的声音,超过60秒就得重新点击。 推荐使用兔子尾巴CD压缩器,可以录制更长的音效... -
语音识别插件_2D动画唇动合成,根据语音自动生成动画人物口型
2020-12-24 00:52:43蕾师师 发自 凹非寺量子位 报道 | 公众号 QbitAI只需要输入一段语音,代码会自动生成与之相对的动画唇形。还是毫无违和感的那种。这是一个在GitHub上拥有501星的开源项目,叫做Rhubarb Lip Sync。它既可以是Windows... -
voiceXML 2.0 第一部分
2011-01-20 01:29:00VoiceXML是为创建语音对话而创建的(最常见的例子:114,前面听起来很生硬的那段自动语音应答就是了),其特点是:会话中综合了人工合成语音、数字音频、语音识别、双音多频(DTMF)输入、电话、录音、会议混音等。... -
pcm混音
2017-08-22 15:16:41近段时间公司做一个电信项目,铃音助手,用户可以从网上下载背景铃音,和自己的录音合成一个性化的铃音后设为自己手机的彩铃 ,开始是其他同事搞的,在其用了多天时间无法解决的情况下,我介入处理,轻松搞定 。... -
微信小程序-音视频剪辑
2020-12-04 14:47:41将一段英语视频中的音轨与视轨分离。 用户进行录音,仿照英文进行朗读,并临时保存录音后的音频数据 将视频分离后的视轨与录音音频进行合成为一个新的视频 正常播放合成后的视频 音视频剪辑 第一步首先创建一个... -
多模态语义分析_百度发布“百度大脑3.0”,业内首提“多模态深度语义理解” | 钛快讯...
2020-12-19 12:16:11钛媒体快讯 | 7月4日消息:Baidu Create 2018 AI开发者大会现场,百度创始人、董事长兼CEO李彦宏播放了一段电话录音,一位即将参加开发者大会的嘉宾与百度AI客服进行了几轮对话之后,提出了这样的问题。随后答案揭晓... -
Visual C++程序开发范例宝典(光盘) 第一部分
2010-04-25 13:13:05实例338 利用语音卡实现电话录音 实例339 利用语音卡实现点歌祝福 12.7 手机程序的开发 实例340 利用短信猫发送短信 实例341 利用短信远程关闭计算机 12.8 其他程序 实例342 利用神龙卡制作练歌房程序 ... -
unity3D学习之音频基础原理-audio菜鸟笔记3
2017-08-07 20:39:002、采样频率-->每隔一段时间在波形上取一个点(采样频率越高,还远度越高)。 3、100Hz-->每秒取样100次。 4、声音的频率-->震动幅度的空间坐标(-1.0f-1.0f),100Hz-->1秒震动了100次(有100个 -
新研究训练小老鼠充当分类器,识别Deepfake假声音,比计算机更靠谱
2019-08-13 15:21:15然而,当要分辨一段录音的真假时,小老鼠才是我们的好帮手。本周,美国网络安全会议Black Hat在拉斯维加斯举行。会上,研究人员提出,小动物们,特别是小老鼠,在识别自然语音元素方面很有天分。这项成果可能会影响... -
android实时声音信号波形_android绘制播放音频的波形图
2020-12-31 05:37:25之后有一段时间没碰过那个项目了,虽然功能是做出来了,但是还不算是完整的,那要是播放的时候呢?播放的时候怎么实时动态的获取音频数据来绘制呢?思考良久,在逛github的时候,发现了这个功能!在这里做个记录,也... -
android绘制播放音频的波形图
2017-11-24 11:57:01之后有一段时间没碰过那个项目了,虽然功能是做出来了,但是还不算是完整的,那要是播放的时候呢?播放的时候怎么实时动态的获取音频数据来绘制呢?思考良久,在逛github的时候,发现了这个功能!在这里做个记录,也... -
人工智能技术在互联网大厂笔试里的应用
2020-10-15 16:20:46个性化语音合成技术,十分钟录音即可模范音色;语音识别技术,机器听写超过专业速记员水平;机器翻译;图文识别。 二、人工技能在大厂考试中的应用 1.普通初次面试。有利于公司节约人事成本,节约考试场地组织成本... -
MAGIX Samplitude 15 破解版
2012-12-11 15:02:10只要一个按键,就能帮录自旧录音带或任何形式的音乐,从庞大的线上资料库中找到该音乐的所有相关资讯。 效果自动化控制 您可利用滑鼠画笔,轻松画出音量、左右声道、 VST 参数转场等效果,让每条音轨都能拥有不同的... -
[SoC2019]Speech algorithm based on AliOS Things
2021-01-09 19:30:55可以根据1段预先录音的PCM格式的录音数据,判断正在录音的声音是否是同一个人的声音。预录的PCM格式的录音时长在10秒左右,要求录音结束后5秒左右可以判断出结果,判断的准确率在80%以上。算法不... -
DBX260中文说明书
2013-04-24 11:07:35DBX260中文说明书,DBX260的使用(一) 1.1 后面板连接(260) IEC电源线插座 260采用电压范围为100V-240V,频率为50-60Hz的国际性电源来供电,它使用的是IEC电缆线。 MIDI输入,MIDI输出和转接接口 这些接口为260 ... -
praat國際音標
2011-09-10 12:01:56然而,Praat本身缺乏自动标注功能,只能对有声段和静默段进行简单的识别,而不能对音节、节拍群等语流单位加以切分。[5] [编辑]其他功能 Praat还具有许多其他功能,包括: 语音实验:嗓音分析、多重强迫选择实验... -
icom_ic-7000_service_manual.pdf
2020-08-01 22:16:54HF、50MHz、144MHz和430/440MHz多频段车载电台,具有先进的高品质中频DSP数字信号处理能力,其技术特性和技术优势甚至超越以往的基站式机型,ICOM通信技术精湛绝伦。 中频数字信号处理-出类拔萃 数字中频滤波器、... -
如何混音处理
2012-04-25 11:41:21有一点必须要注意,男声和女声的处理方法有很大的不同,我前一阵刚完成一首男女声二重唱歌曲,男歌手和女歌手在同一个录音棚录音,用的都是U67话筒,但声音的差别让我大吃一惊。 我对他们分别进行了均衡处理,见图8... -
Visual C++程序开发范例宝典(光盘) 第四部分
2010-04-25 13:32:56实例338 利用语音卡实现电话录音 实例339 利用语音卡实现点歌祝福 12.7 手机程序的开发 实例340 利用短信猫发送短信 实例341 利用短信远程关闭计算机 12.8 其他程序 实例342 利用神龙卡制作练歌房程序 ... -
Visual C++程序开发范例宝典(光盘) 第三部分
2010-04-25 13:26:03实例338 利用语音卡实现电话录音 实例339 利用语音卡实现点歌祝福 12.7 手机程序的开发 实例340 利用短信猫发送短信 实例341 利用短信远程关闭计算机 12.8 其他程序 实例342 利用神龙卡制作练歌房...