精华内容
下载资源
问答
  • 项目中有个分段朗读课文、朗读完成后合成一段音频播放的需求,三下五除二写完发现不少坑,记录一下。 先放录音代码 //录音 -(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>


    展开全文
  • 般来说,我们要将一段文字转换为一个 wav 的语音文件主要是 靠录音,就电脑上装一个录音软件,然后人一边念一边录。但这样做 太麻烦了,效率太低。现在一般都是用语音合成软件,直接把文字变 成 wav 格式的语音文件...
  • 可指定音乐播放一段时间后再进行语音播放,随意调整合成方式 支持在播放语音时,自动降低背景音乐音量 支持背景音乐的“淡入”、“淡出”效果,让制作效果更专业 完美支持 Windows 2000/XP/Vista/7/8 操作系统 ...
  • 每个同学都录了一段持续时间为三秒钟的,语音内容为“我爱南京大学”的语音数据,试验目标是使用一些语音处理的方法把同学们的声音合在一起,实现出大家一起喊出“我爱南京大学”的效果,由于每个人的语速不同,录音...

    每个同学都录了一段持续时间为三秒钟的,语音内容为“我爱南京大学”的语音数据,试验目标是使用一些语音处理的方法把同学们的声音合在一起,实现出大家一起喊出“我爱南京大学”的效果,由于每个人的语速不同,录音起始点不同,所以需要使用一定的方法将语音对齐,然后叠加在一起。本次试验尝试了动态规划算法和直接线性拉伸两种算法。

    其中,DTW算法的匹配结果如下所示:

    整个试验的所有代码及报告见https://download.csdn.net/download/qq_22707525/10707532

    展开全文
  • 把两个包合成一个包来处理即可。 写这篇文章的时候还参考了另外一篇文章的思路 https://www.jianshu.com/p/d903d2c8ffd2 说到了遇到网络卡该怎么处理 一点是要缓冲一段再播放, 另外一点就是加上空的静音包, 来...
  • 问题: 3000句 整体录音环境不好 有波动性, 有些句子好, 有些质量差 目的: 目标是合成这个人的音色 ...选一段(类似回声消除算法), 减去白噪声, 至少可以用工具一句一句处理(也可以批处理) 还有

    问题:

    1. 3000句
    2. 整体录音环境不好
    3. 有波动性, 有些句子好, 有些质量差

    目的:

    1. 目标是合成这个人的音色
    2. 高质量的合成, 可商用
    3. 风格, 情感, 韵律不强要求
    4. 风格, 情感, 韵律能保留更好(比如三年前录制的电销语料)

    角度一

    通过工具降噪

    先处理问题2, 尽量在挑选语料之前, 先做2, 尽量保留语句

    是录制的问题, 因此是白噪声

    进行"美图", 其实是接着当时准备TTS语料未完成的完成

    选一段(类似回声消除算法), 减去白噪声, 至少可以用工具一句一句处理(也可以批处理)

    还有类似视觉的降噪

    角度二

    筛选

    1. 先挑选, 数据清洗, 
    2. 分层级去挑: 特别好的, 过得去的, 很差的

    假设挑出来了300~1000句

    角度三

    小语料配大语料

    大语料训好后风格迁移小语料

    大语料小语料multi-speaker同时训

    经验上来看, 1000句有, 则可以multi-speaker

    角度四

    随机拼接扩增

    1. 音频剪切成片段
    2. 通过随机片段拼接, 形成新的音频

    类似于高质量的波形拼接

    分析:

    1. 缺点一, 破坏了句子的连贯, 韵律等
    2. 缺点二, 看上去语料变大, 实际上前后还是那样, 没有变多
    3. 优点, 相当于人为理解的数据, 构造出来, 通过这种方式, (数据增强)来指引网络

    因此如何随即拼接, 切到什么粒度, 如何构建虚拟语料, 比如ASR中的VAD

    展开全文
  • 蓝光影音Mp3分割器免费版是一款小巧精致的Mp3分割器,Mp3转换器软件,可以很简单的将一段Mp3切割成多个片断,每个片段可以制作淡入淡出效果,而且可以增大Mp3本身的声音。除此之外,Mp3分割器还可以压缩mp3文件...
  • 想把两歌曲合并一起,不知道怎么做。关于音乐剪辑呢,许多app都自带的,这里不多说。还有就是音频的格式转换,比如把录音的amr格式转为mp3,许多app不支持这个功能。或者说你把多个音频混合在一起。或者你想自己...
  • 需求:IM语音聊天,IM采用腾讯的IM,语音录制部分有自己的UI设计,大概是这个样子(弹出一个pop框,先用合成器说一段“现在给xxx留言吧”,马上开始录制音频,5秒后出现可以发送按钮,最大30s发送语音,留言过程中要...
  • windows录音机录制系统内的声音

    千次阅读 2005-03-11 20:11:00
    系统自带的录音机还可以把原声录下后插入混合声音文件,还能把两段录音合在一起保存为个文件。可惜不便的是windows只能录制60秒内的声音,超过60秒就得重新点击。 推荐使用兔子尾巴CD压缩器,可以录制更长的音效...
  • 蕾师师 发自 凹非寺量子位 报道 | 公众号 QbitAI只需要输入一段语音,代码会自动生成与之相对的动画唇形。还是毫无违和感的那种。这是一个在GitHub上拥有501星的开源项目,叫做Rhubarb Lip Sync。它既可以是Windows...
  • voiceXML 2.0 第部分

    2011-01-20 01:29:00
    VoiceXML是为创建语音对话而创建的(最常见的例子:114,前面听起来很生硬的那自动语音应答就是了),其特点是:会话中综合了人工合成语音、数字音频、语音识别、双音多频(DTMF)输入、电话、录音、会议混音等。...
  • pcm混音

    2017-08-22 15:16:41
    时间公司做一个电信项目,铃音助手,用户可以从网上下载背景铃音,和自己的录音合成一个性化的铃音后设为自己手机的彩铃 ,开始是其他同事搞的,在其用了多天时间无法解决的情况下,我介入处理,轻松搞定 。...
  • 一段英语视频中的音轨与视轨分离。 用户进行录音,仿照英文进行朗读,并临时保存录音后的音频数据 将视频分离后的视轨与录音音频进行合成为一个新的视频 正常播放合成后的视频 音视频剪辑 第一步首先创建一个...
  • 钛媒体快讯 | 7月4日消息:Baidu Create 2018 AI开发者大会现场,百度创始人、董事长兼CEO李彦宏播放了一段电话录音,一位即将参加开发者大会的嘉宾与百度AI客服进行了几轮对话之后,提出了这样的问题。随后答案揭晓...
  • 实例338 利用语音卡实现电话录音 实例339 利用语音卡实现点歌祝福 12.7 手机程序的开发 实例340 利用短信猫发送短信 实例341 利用短信远程关闭计算机 12.8 其他程序 实例342 利用神龙卡制作练歌房程序 ...
  • 2、采样频率-->每隔一段时间在波形上取一个点(采样频率越高,还远度越高)。 3、100Hz-->每秒取样100次。 4、声音的频率-->震动幅度的空间坐标(-1.0f-1.0f),100Hz-->1秒震动了100次(有100个
  • 然而,当要分辨一段录音的真假时,小老鼠才是我们的好帮手。本周,美国网络安全会议Black Hat在拉斯维加斯举行。会上,研究人员提出,小动物们,特别是小老鼠,在识别自然语音元素方面很有天分。这项成果可能会影响...
  • 之后有一段时间没碰过那个项目了,虽然功能是做出来了,但是还不算是完整的,那要是播放的时候呢?播放的时候怎么实时动态的获取音频数据来绘制呢?思考良久,在逛github的时候,发现了这个功能!在这里做个记录,也...
  • android绘制播放音频的波形图

    万次阅读 多人点赞 2017-11-24 11:57:01
    之后有一段时间没碰过那个项目了,虽然功能是做出来了,但是还不算是完整的,那要是播放的时候呢?播放的时候怎么实时动态的获取音频数据来绘制呢?思考良久,在逛github的时候,发现了这个功能!在这里做个记录,也...
  • 个性化语音合成技术,十分钟录音即可模范音色;语音识别技术,机器听写超过专业速记员水平;机器翻译;图文识别。 二、人工技能在大厂考试中的应用 1.普通初次面试。有利于公司节约人事成本,节约考试场地组织成本...
  • 只要个按键,就能帮录自旧录音带或任何形式的音乐,从庞大的线上资料库中找到该音乐的所有相关资讯。 效果自动化控制 您可利用滑鼠画笔,轻松画出音量、左右声道、 VST 参数转场等效果,让每条音轨都能拥有不同的...
  • 可以根据1预先录音的PCM格式的录音数据,判断正在录音的声音是否是同个人的声音。预录的PCM格式的录音时长在10秒左右,要求录音结束后5秒左右可以判断出结果,判断的准确率在80%以上。算法不...
  • DBX260中文说明书

    2013-04-24 11:07:35
    DBX260中文说明书,DBX260的使用() 1.1 后面板连接(260) IEC电源线插座 260采用电压范围为100V-240V,频率为50-60Hz的国际性电源来供电,它使用的是IEC电缆线。 MIDI输入,MIDI输出和转接接口 这些接口为260 ...
  • praat國際音標

    2011-09-10 12:01:56
    然而,Praat本身缺乏自动标注功能,只能对有声和静默进行简单的识别,而不能对音节、节拍群等语流单位加以切分。[5] [编辑]其他功能 Praat还具有许多其他功能,包括:  语音实验:嗓音分析、多重强迫选择实验...
  • HF、50MHz、144MHz和430/440MHz多频车载电台,具有先进的高品质中频DSP数字信号处理能力,其技术特性和技术优势甚至超越以往的基站式机型,ICOM通信技术精湛绝伦。 中频数字信号处理-出类拔萃 数字中频滤波器、...
  • 如何混音处理

    2012-04-25 11:41:21
    有一点必须要注意,男声和女声的处理方法有很大的不同,我前一阵刚完成首男女声二重唱歌曲,男歌手和女歌手在同录音录音,用的都是U67话筒,但声音的差别让我大吃一惊。 我对他们分别进行了均衡处理,见图8...
  • 实例338 利用语音卡实现电话录音 实例339 利用语音卡实现点歌祝福 12.7 手机程序的开发 实例340 利用短信猫发送短信 实例341 利用短信远程关闭计算机 12.8 其他程序 实例342 利用神龙卡制作练歌房程序 ...
  • 实例338 利用语音卡实现电话录音 实例339 利用语音卡实现点歌祝福 12.7 手机程序的开发 实例340 利用短信猫发送短信 实例341 利用短信远程关闭计算机 12.8 其他程序 实例342 利用神龙卡制作练歌房...

空空如也

空空如也

1 2
收藏数 39
精华内容 15
关键字:

录音合成一段