Cheaptrick算法

news2024/10/1 23:38:06

Cheaptrick,a spectral envelope estimator for high-qualityspeech synthesis

转载请注明出处!

2015年Morise发表在SPEECH COMMUNICATION期刊上的一篇文章。

该算法目的是获得一个准确的、时间稳定的谱包络,采用基频(F0),由F0自适应加窗、功率谱平滑和频率域频谱恢复三部分组成。

引言

一些估计算法,如倒谱(Noll, 1964;Oppenheim, 1969)和线性预测编码(LPC) (Atal和Hanauer, 1969)及许多改进的算法,如离散全极建模(El-Jaroudi和Makhoul,1991),加权最大似然自回归和移动平均建模(Badeau和David, 2009),以及惩罚似然方法(Campedel-Oudot等人,2001)。但是这些算法合成的语音音质比使用PSOLA等基于波形的合成方法要差,很难实现高质量的语音转换。
STRAIGHT (Kawahara et al.1999)被认为是一种有效的高质量语音合成框架。为了在保持音质的同时减少计算成本,提出了TANDEM_STRAIGHT,在庞大的数据库可实现实时应用(Morise et al., 2009)和统计分析。

待解决问题

根据STRAIGHT的思想,浊音包含F0、谱包络和非周期性信息。为了简化讨论,我们只处理固定的F0和谱包络,而忽略非周期性。要求从语音波形中获得精确的频谱包络,而不考虑加窗的时间位置。
在这里插入图片描述
*表示卷积,T0是基音周期,w0是基本角频率(=2Π/T0)。
谱恢复还需要补偿离散化的影响。由于加窗波形的功率谱依赖于窗函数的时间位置,因此也需要去除这种影响(本文中的时变分量)。
传统算法除了STRAIGHT算法和TANDEM-STRAIGHT,在估计性能上不能满足这两个要求,并且不能去除时变分量。本文介绍了一种算法
它在客观上和主观上都优于传统算法。CheapTrick的名字来源于它基于f0自适应窗口和倒谱方法等传统算法的cheap和trick的设计。

Cheaptrick算法

CheapTrick由三个步骤组成:f0自适应窗口,平滑功率谱,以及平滑和频谱恢复的提升处理。

第一步:计算F0自适应功率谱

第一步是在基音同步分析的理想基础上设计窗口函数(Mathews et al., 1961)。

(1)加窗
该算法采用长度为3T0的汉宁窗。

在这里插入图片描述
窗口在ω0 Hz处的功率比主瓣的功率(0 Hz)低30 dB,这表明在30 dB以下谐波结构对邻近结构有影响。由于实际语音包含时间波动、非周期性和噪声,我们假设30 dB足够小。

waveform = GetWindowedWaveform(x, fs, current_f0, current_position);

function waveform = GetWindowedWaveform(x, fs, current_f0, current_position)
%  prepare internal variables
half_window_length = round(1.5 * fs / current_f0);%1169=round(1.5 * 88200 / 113.21)
base_index = (-half_window_length : half_window_length)';%2339*1 = (-1169 : 1169)'
index = round(current_position * fs + 0.001) + 1 + base_index;%2339*1 = round(0*88200+0.001)+1+2339*1(所有值全加1)
safe_index = min(length(x), max(1, round(index)));% 只取2339*1? 

%  wave segments and set of windows preparation
segment = x(safe_index);
time_axis = base_index / fs / 1.5;
window = 0.5 * cos(pi * time_axis * current_f0) + 0.5;
window = window / sqrt(sum(window .^ 2));
waveform = segment .* window - window * mean(segment .* window) / mean(window);

周期信号y(t)经过加窗w(t),计算功率谱:

在这里插入图片描述
T0是基音周期。该方程表明,一个窗内的周期信号的总功率是时间稳定的。

power_spectrum = GetPowerSpectrum(waveform, fs, fft_size, current_f0);

function power_spectrum = GetPowerSpectrum(waveform, fs, fft_size, f0)
power_spectrum = abs(fft(waveform(:), fft_size)) .^ 2;
% DC correction
frequency_axis = (0 : fft_size - 1)' / fft_size * fs;
low_frequency_axis = frequency_axis(frequency_axis <  f0 + fs / fft_size);
low_frequency_replica = interp1(f0 - low_frequency_axis,...
  power_spectrum(frequency_axis < f0 + fs / fft_size),...
  low_frequency_axis(:), 'linear', 'extrap');
power_spectrum(frequency_axis < f0) =...
  low_frequency_replica(frequency_axis < f0) +...
  power_spectrum(frequency_axis < f0);
power_spectrum(end : -1 : fft_size / 2 + 2) = power_spectrum(2 : fft_size / 2);

第二步:功率谱平滑

log0的值是负无穷,所以需保证log域的功率不能为0。
通过一个矩形窗进行简单滤波来实现平滑:
在这里插入图片描述
P(ω)是加汉宁窗的功率谱。由于矩形窗宽为2ω0/3,这一步确保了与第一步一样相邻结构之间的影响小于30db。

smoothed_spectrum = LinearSmoothing(power_spectrum, current_f0, fs, fft_size);

function smoothed_spectrum = LinearSmoothing(power_spectrum, f0, fs, fft_size)
double_frequency_axis = (0 : 2 * fft_size - 1)' / fft_size * fs - fs;
double_spectrum = [power_spectrum; power_spectrum];

double_segment = cumsum(double_spectrum * (fs / fft_size));
center_frequency = (0 : fft_size / 2)' / fft_size * fs;
low_levels = interp1H(double_frequency_axis + fs / fft_size / 2,...
  double_segment, center_frequency - f0 / 3);
high_levels = interp1H(double_frequency_axis + fs / fft_size / 2,...
  double_segment, center_frequency + f0 / 3);

smoothed_spectrum = (high_levels - low_levels) * 1.5 / f0;
smoothed_spectrum =...
  smoothed_spectrum + abs(randn(length(smoothed_spectrum), 1)) * eps;

第三步:倒频域提升

目的:去除离散化引起的频率波动。同时进行了光谱恢复。
时变分量是由周期脉冲卷积和加窗引起的。

时域:周期为T0的周期脉冲
频域:谱是周期为ω0的周期脉冲
倒谱:也是倒频率域内周期为T0的周期脉冲,如下图
在这里插入图片描述
为了明确计算nT0处的时变分量,信号的采样频率为65536 Hz, F0为128 Hz, FFT长度为65,536,信号长度为1 s,帧移长度为一个样本。
为了去除时变分量和提取低定量分量,采用sinc函数作为提升函数。
谱恢复基于一致采样理论(Unser, 2000)。一致采样理论是采样理论的扩展,要求AD转换后的数字信号必须等于AD/DA/AD转换后的数字信号。这种采样使线性滤波器的设计能够满足这一要求。
在一致性采样的基础上,设计了提升功能作为补偿滤波器。该函数可以补偿nω0 Hz处的误差,这些误差是由第二步和第三步平滑引起的。

TANDEM-STRAIGHT的频域上进行了基于一致采样的谱恢复(Kawahara et al., 2008):
在这里插入图片描述
本文的提升恢复谱计算方法如下:
在这里插入图片描述
频域矩形窗,该窗在图2所示的quefency域的nT0处为零。
试错实验,得到q0=1.18, q1=-0.09。

在这里插入图片描述
每个处理都是在离散时频表示上进行的。Pl(k,n),其中k表示离散频率索引,n表示帧数。

spectral_envelope = SmoothingWithRecovery(...
  [smoothed_spectrum; smoothed_spectrum(end - 1 : -1 : 2)], current_f0, fs,...
  fft_size, q1);


function spectral_envelope =...
  SmoothingWithRecovery(smoothed_spectrum, f0, fs, fft_size, q1)
quefrency_axis = (0 : fft_size - 1)' / fs;
smoothing_lifter = sin(pi * f0 * quefrency_axis) ./ (pi * f0 * quefrency_axis);
smoothing_lifter(fft_size / 2 + 2 : end) =...
  smoothing_lifter(fft_size / 2 : -1 : 2);
smoothing_lifter(1) = 1;

compensation_lifter =...
  (1 - 2 * q1) + 2 * q1 * cos(2 * pi * quefrency_axis * f0);
compensation_lifter(fft_size / 2 + 2 : end) =...
  compensation_lifter(fft_size / 2 : -1 : 2);
tandem_cepstrum = fft(log(smoothed_spectrum));
tmp_spectral_envelope =...
  exp(real(ifft(tandem_cepstrum .* smoothing_lifter .* compensation_lifter)));
spectral_envelope = tmp_spectral_envelope(1 : fft_size / 2 + 1);

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/428722.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【效率神器】idea使用技巧

IntelliJ IDEA&#xff08;以下简称IDEA&#xff09;的主题、字体、背景色等都是可以根据自己的喜好进行设置的&#xff0c;本小节就教大家一些常用的IDEA设置。 1. IDEA 中设置主题、字体 1.1 设置主题 点击菜单栏上的【File】–>【Settings…】–>【Appearance】–&…

Spark SQL 数据的加载和保存

目录 通用的加载和保存方式 1.1 加载数据 1.2保存数据 1.3 Parquet 1. 加载数据 2.保存数据 1.4 JSON 1.导入隐式转换 2.加载 JSON 文件 3.创建临时表 4.数据查询 1.5 CSV 通用的加载和保存方式 SparkSQL 提供了通用的保存数据和数据加载的方式。这里的通用指的是使用…

JS的防抖与节流

在进行窗口的resize、scroll&#xff0c;输入框内容校验等操作时&#xff0c;如果事件处理函数调用的频率无限制&#xff0c;会加重浏览器的负担&#xff0c;导致用户体验非常糟糕。此时我们可以采用debounce&#xff08;防抖&#xff09;和throttle&#xff08;节流&#xff0…

PP-KANBAN-看板概述

PP-KANBAN-看板概述看板概述-OverviewPUSH-PULL 原则看板的补充策略看板的系统配置看板概述-Overview 看板是1953年由Mr. Taiichi Ohno在丰田汽车公司发明的。当时&#xff0c;整个汽车行业正在通过实施丰田的“丰田生产系统”来提升管理。这个系统基于基于物料的卡片实现物资…

《2023游戏行业热点趋势报告》|Party Game游戏成为新趋势,备受消费者瞩目

过去的2022年&#xff0c;在各路重拳下&#xff0c;我们目睹了游戏行业的“焦虑”&#xff1a; 版号停发&#xff0c;版号数量缩减&#xff1b; 整个行业8年内首次下滑&#xff0c;玩家数量减少&#xff1b; 市场空间被挤压&#xff0c;买量成本激增&#xff1b; ...... 游…

【安全防御】防火墙

目录 1.什么是防火墙&#xff1f; 2.状态防火墙的工作原理&#xff1f; 3.防火墙实验 1.什么是防火墙&#xff1f; 防火墙&#xff08;英语&#xff1a;Firewall&#xff09;&#xff0c;也称防护墙&#xff0c;是由Check Point 创立者Gil Shwed于1993 年发明并引入国际互联…

“AIGC+影像”成势,美图出头?

配图来自Canva可画 众所周知&#xff0c;美图公司是业界出了名的多边形玩家&#xff0c;从牙科、区块链、盲盒到炒币等等&#xff0c;美图似乎总出现在意想不到的地方&#xff0c;而正因此它也被盖上了“不务正业”的标签。 所幸的是&#xff0c;经由去年AIGC爆火&#xff0c;…

【1026. 节点与其祖先之间的最大差值】

来源&#xff1a;力扣&#xff08;LeetCode&#xff09; 描述&#xff1a; 给定二叉树的根节点 root&#xff0c;找出存在于 不同 节点 A 和 B 之间的最大值 V&#xff0c;其中 V |A.val - B.val|&#xff0c;且 A 是 B 的祖先。 &#xff08;如果 A 的任何子节点之一为 B&…

大小端字节序存储

每个数据类型在内存中都会被分配若干个字节&#xff0c;而这些字节在内存中的存储顺序就是字节序。在计算机底层存储中&#xff0c;有两种常见的字节序&#xff1a;大端字节序和小端字节序。 大端字节序&#xff1a;高位字节在前&#xff0c;低位字节在后&#xff1b;小端字节…

藏经阁(七)有源蜂鸣器和无源蜂鸣器 解析

文章目录特征区别场景选型实战应用特征 有源蜂鸣器特征&#xff1a; 又被称为直流蜂鸣器包含了一个多谐振荡器只要额定直流电压可以在两端发出声音具有驱动控制简单价格略高 无源蜂鸣器特征&#xff1a; 又被称为交流蜂鸣器内部没有振荡器需要在两端施加特定频率的方波电压…

如何借助无线通讯终端实现组态王与PLC之间通信?

本方案是基于Modbus RTU协议下实现的1主多从自组网无线通信形式&#xff0c;主站为组态王&#xff0c;从站为两台三菱FX5U PLC。在工厂里&#xff0c;组态王和plc所处位置距离较为分散&#xff0c;重新铺设电缆线工期长&#xff0c;成本高&#xff0c;故采用日系PLC专用无线通讯…

LDMUI-001 61320946C模拟量模件的40端即直流24伏的负端接至逻辑地汇流排上

LDMUI-001 61320946C模拟量模件的40端即直流24伏的负端接至逻辑地汇流排上 ​ 八、现场接地常用注意事项 1.现场控制站 接地螺丝因机柜本体与底座间有胶皮形成绝缘&#xff0c;屏蔽地汇流排与底座间绝缘&#xff0c;现场控制站必须按规定做好接地处理。即分别接至现场控制站接…

tmall.item.sizemapping.template.update( 更新天猫商品尺码表模板 )

&#xffe5;开放平台免费API必须用户授权 更新天猫商品尺码表模板 公共参数 请求地址: 公共请求参数: 公共响应参数: ![在这里插入图片描述](https://img-blog.csdnimg.cn/d28890c8804c4a50bdd0877f0d2a9659.png请求参数 响应参数 点击获取key和secret 请求示例 响应示例 异…

PHP的垃圾回收机制(全网详解)

概念&#xff1a; PHP的垃圾回收机制是自动的&#xff0c;它通过内置的垃圾回收器(Garbage Collector)来实现。当一个PHP对象不再被引用时&#xff0c;它就成为垃圾。垃圾回收器会定期扫描内存中的所有对象&#xff0c;将没有引用的对象标记为垃圾&#xff0c;并释放它们占用的…

MDK编译过程及文件类型

编译过程 .c和.s文件通过armcc编译器转为.o 其中的code、RO、RW、ZI-data 程序运行时rom中的rw-data复制到SRAM中&#xff0c;SRAM中一般存储可读写的变量&#xff0c;所以ZI-data和RW-data的数据存储在这 经典问题 C语言的全局变量存放在哪里? C语言的全局变量存放在…

HTB-Magic

HTB-Magic信息收集80端口立足www-data -> theseustheseus -> root信息收集 80端口 主页如下。 左下角有一个Login。 抓包后尝试sql注入。 上传一个图片并保存请求。 上传的文件会在/uploads/上传文件名后缀。 只允许我们上传jpg&#xff0c;jpeg&#xff0c;png文…

C/C++每日一练(20230418)

目录 1. 搜索插入位置 &#x1f31f; 2. 最长有效括号 &#x1f31f;&#x1f31f;&#x1f31f; 3. 子集 &#x1f31f;&#x1f31f; &#x1f31f; 每日一练刷题专栏 &#x1f31f; Golang每日一练 专栏 Python每日一练 专栏 C/C每日一练 专栏 Java每日一练 专栏…

2023软件测试银四如何逆势涨薪,开头30秒给你想要的答案

引言 2023软件测试银四逆势涨薪&#xff0c;这是一个让人兴奋的话题。毕竟&#xff0c;在当前就业市场的背景下&#xff0c;很多人正在面临着困境&#xff0c;而能够在逆势中实现薪资上涨的机会&#xff0c;显然是非常值得我们去关注的。 那么&#xff0c;到底是什么让这些软…

C语言实现惯导更新算法(机械编排)

四元数 四元数可用于描述刚体转动或姿态变换,与方向余弦阵相比,表达简洁。四元数是一个包含四个元素的列向量,列向量的第一个元素表示刚体围绕旋转轴转过的角度大小,其余3个元素代表了旋转轴的方向。 姿态更新算法 本程序姿态的递推计算采用四元数来实现,姿态的变化采…

coinex02// 撮合引擎 RingBuffer Disruptor的构建与使用

目录 0. 课程视频地址 0.1 撮合引擎课程 0.1 RocketMQ安装 0.3 RocketMQ搭建成功后登录 1. docker 配置rocketmq 2 逻辑树 : 构建RingBuffer -> 使用RingBuffer 2.1 生产者往RingBuffer中放数据 Disruptor把数据推给消费者cpu 2.2 RingBuffer, Disruptor的创建 ->…