HotSummer

  • 首页
  • 分类
  • 归档
  • 标签

Speech相关技术基础

发表于 2018-05-18   |   分类于 Speech

安装librosa

Windows Anaconda环境下安装librosa:

1
conda install -c conda-forge librosa

Ubuntu下报错

1
RuntimeError: Building llvmlite requires LLVM 6.0.x. Be sure to set LLVM_CONFIG to the right executable path.

解决办法,确认ls /usr/bin/ | grep llvm-config后缀版本是否是6.0.x,如果不是则属于版本不对应的问题,方案一是升级或降级llvmlite,方案二是安装对应版本的llvmlite和librosa。比如,当llvmlite版本是0.5,方案二应该安装:

1
pip install llvmlite==0.22 numba==0.36.1 librosa==0.5

Tensorflow-cheatSheet

发表于 2018-04-12   |   分类于 Tools

卷积padding参数

参考stackoverflow上的问答,输入向量长13,卷积核长6,步长5,以此为例:

  • "VALID" = without padding:

    1
    2
    3
    inputs:         1  2  3  4  5  6  7  8  9  10 11 (12 13)
    |________________| dropped
    |_________________|
  • "SAME" = with zero padding:

    1
    2
    3
    4
    5
                pad|                                      |pad
    inputs: 0 |1 2 3 4 5 6 7 8 9 10 11 12 13|0 0
    |________________|
    |_________________|
    |________________|

安装TF旧版本

用pip安装Python2.7 TF0.11,参考stackoverflow回答

1
2
3
4
5
# Ubuntu/Linux 64-bit, CPU only, Python 2.7
export TF_BINARY_URL=https://storage.googleapis.com/tensorflow/linux/cpu/tensorflow-0.11.0-cp27-none-linux_x86_64.whl
# GPU版本
# export TF_BINARY_URL=https://storage.googleapis.com/tensorflow/linux/gpu/tensorflow-0.11.0-cp27-none-linux_x86_64.whl
pip install --ignore-installed --upgrade $TF_BINARY_URL

Speech Cheat Sheet

发表于 2018-04-01   |   分类于 Speech

复数

$$z=a+bi$$

复数的表示

坐标表示,分为实部$a$,虚部$b$:
$$z=a+bi$$
三角形式,$r$表示模,$\theta$为幅角
$$z=r(\cos\theta + i\sin \theta)$$
指数形式
$$z=re^{i\theta}$$
欧拉公式
$$ e^{ix}=\cos x+i\sin x $$

共轭复数

$$z=a-bi$$

四则运算

$$ (a+bi) + (c+di) = (a+c) + (b+d)i $$
$$ (a+bi)(c+di) = (ac-bd) + (bc+ad)i $$
$$ (a+bi) / (c+di) = [(ac + bd) / (c^2 + d^2)] + [(bc - ad) / (c^2 + d^2)]i $$

四则运算的推论

$$ a \cdot (c+di) = ac + adi $$
$$ {(a+bi)}^2 = (a^2 - b^2) + 2abi $$

模

$$ |a + bi| = \sqrt{a^2 + b^2} $$

模的平方
$$ {|a + bi|}^2 = a^2 + b^2 $$

复数乘积的模等于模的乘积
$$ |z_1 z_2| = |z_1| |z_2| $$

复数与幅度、相位

用$R$表示幅度,$φ$表示相位,则有:
$$ a+ib = R e^{jφ} = R\cos φ + iR\sin φ $$
所以有:
$$ a=R\cos φ, \quad b = R\sin φ $$
得到:
$$ R=\sqrt{a^2+b^2}, \quad φ=\arctan \frac{b}{a} $$

时频域变换

为什么要将时域信号转换到频域?因为一些在时域上不显著的特征,在频域上表现很明显。

离散傅里叶变换(DFT)

参考网上课件
$$ F[n] = \sum_{k=0}^{N-1} f[k] e^{-i \frac{2\pi}{N} n k} \quad (n=0:N-1) $$
上式计算了长度为$N$的信号$f(k)$的频域表示$F(n)$。注意$F(n)$的长度也是$N$,这是从连续傅里叶变换推导出DFT确定的。

逆变换:
$$ f[k] = \frac{1}{N} \sum_{n=0}^{N-1} F[n] e^{+i \frac{2\pi}{N} n k} $$
对应的逆矩阵是原始(对称)矩阵的复共轭的$\frac{1}{N}$倍

离散余弦变换(DCT)

参考网上课件1,课件2

$$ Cx(k) = \sum{n=0}^{N-1} 2x(n) \cos(\frac{\pi}{2N} k (2n+1) ) $$
其中$x$是信号。用$W_{2N}$表示$2N$长度的DFT转换矩阵基本元素,$Y(k)$表示DFT频点,则有:
$$ Cx(k) = W{2N}^{k/2} Y(k) $$

利用DFT计算DCT的过程:

用IDFT计算DCT逆运算(IDCT):

信号处理原理

采样定理

采样是将一个信号(例如时间或空间上连续的函数)转换为数字序列(时间或空间上离散的函数)的过程。定义:为了能由离散信号恢复原来的连续信号,采样频率应该不小于连续信号频谱中最高频率的2倍。可直觉上理解为一个信号周期内,需要由两个点确定波形的走向。

混叠现象

如果采样频率低于模拟信号最高频率的2倍,会产生混叠现象,即高于采样频率一半的频率成分将被重建成低于采样频率一半的信号。在直觉上可以理解,如果采样频率过低,高频信号采样点可能与低频信号重叠,我们无法根据这些采样点分辨是高频或低频信号。

不确定性原理

频率分辨率 是指频谱分析中能够分辨的两个相邻频率点谱线的最小间距。在DFT中,用$Fs$表示采样频率,$N$表示采样点数目,$t$表示序列的时长,则频率分辨率可以表示为:
$$ \Delta f = \frac{F_s}{N} = \frac{F_s}{F_s t} = \frac{1}{t}$$

不确定性原理最初定义在量子力学领域,后来被用于其他领域,包括信号处理。在DFT中,表现为频率分辨率与时间分辨率不能同时无限提升。(参考博文)

信号处理技术

压缩感知

压缩感知(Compressed sensing),也被称为压缩采样(Compressive sampling)或稀疏采样(Sparse sampling),是一种寻找欠定线性系统的稀疏解的技术。这个方法利用讯号稀疏的特性,相较于奈奎斯特理论(采样定理),得以从较少的测量值还原出原来整个欲得知的讯号。(wikipedia)

循环神经网络笔记

发表于 2018-04-01   |   分类于 ML

RNN

$$ h^{(i)} = \sigma{( W^{hx} x^{t} + W^{hh}h^{(t-1)} + b_h )} $$

LSTM

$$ g^{(t)} = \Phi(W^{gx} x^{(t)} + W^{gh}h^{(t-1)} + b_g ) $$
$$ i^{(t)} = \Phi(W^{ix} x^{(t)} + W^{ih}h^{(t-1)} + b_i ) $$
$$ f^{(t)} = \Phi(W^{fx} x^{(t)} + W^{fh}h^{(t-1)} + b_f ) $$
$$ o^{(t)} = \Phi(W^{ox} x^{(t)} + W^{oh}h^{(t-1)} + b_o ) $$
$$ s^{(t)} = g^{(t)} \odot i^{(t)} + s^{(t-1)} \odot f^{(t)} $$
$$ h^{(t)} = \Phi (s^{(t)}) \odot o^{(t)} $$

各个门i, f, o与g近似,都含有$h^{(t-1)}$成分,拥有前面状态的记忆。

GRU

$$ z^{(t)} = \sigma(W^{zx} x^{(t)} + W^{zh}h^{(t-1)} ) $$
$$ r^{(t)} = \sigma(W^{rx} x^{(t)} + W^{rh}h^{(t-1)} ) $$
$$ \tilde{h}^{(t)} = \tanh (W^{hx} x^{(t)} + W^{hh} (r^{(t)} \odot h^{(t-1)})) $$
$$ h^{(t)} = (1-z^{(t)}) \odot h^{(t-1)} + z^{(t)} \odot \tilde{h}^{(t)} $$

Ubuntu下远程控制X2Go

发表于 2017-08-12   |   分类于 Tools

X2Go是一款支持远程控制Ubuntu桌面的开源软件,基于ssh连接,多平台Windows/Mac OS/Linux客户端支持,支持多用户多session同时在线,支持session保持后台运行与恢复(再次登陆同一session)。

Ubuntu16.06服务器端安装

1
2
3
4
5
6
7
8
9
10
11
12
# 安装ssh服务器
sudo apt install openssh-server
# 安装x2go服务器
sudo apt-get install software-properties-common
sudo add-apt-repository ppa:x2go/stable
sudo apt-get update
sudo apt-get install x2goserver x2goserver-xsession
# 安装xfce桌面
sudo apt install xfce4
# 或者可以安装mate桌面,两者也可并存
sudo apt-get install ubuntu-mate-core ubuntu-mate-desktop
sudo apt-get install x2gomatebindings

客户端配置

安装好客户端后启动,在Session选项卡创建新的session,在弹出Session preferences框中,设置Host(主机地址), Login(ssh用户名),session Type(远程桌面环境xfce或mate)。在Media选项卡,可选择禁用“Client side printing support”。

Ubuntu下SoX音频处理工具

发表于 2017-07-21   |   分类于 Tools

SoX是Ubuntu下一个音频处理工具,运行于命令行,安装如下。SoX包含三条主要命令
sox、play和rec,用前者可实现SoX所有功能,而后两者只是为了简化“播放”和“录音”操作。另一条命令soxi可输出音频信息。SoX支持一些常见的音频格式,如wav/mp3/ogg等,参见手册。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
sudo apt-get install sox # 安装
# 以下安装是为了支持mp3格式,可选
sudo apt-get install lame
sudo apt-get install libsox-fmt-mp3

# 使用示例
sox sample.wav -n stat # 打印sample.wav详细信息
soxi sample.wav # 同样打印信息
play sample.wav # 播放,前提是你的终端支持音频播放
# 将orign.wav从0s开始剪切出10s输出到trimed.wav
sox origin.wav trimed.wav trim 0 10
# 对origin.wav重采样,输出16000Hz的音频到out.wav
sox origin.wav -r 16000 out.wav
# 混合music.wav和voice.wav,输出到mixed.wav
sox -m music.wav voice.wav mixed.wav
# 拼接short.wav和long.wav,输出到longer.wav
sox short.wav long.wav longer.wav
# 将sample.mp3转换成wav格式
sox sample.mp3 sample.wav

记PyInstaller在win10下使用

发表于 2017-07-20   |   分类于 Tools

PyInstaller是一款将python脚本打包成exe可运行文件的工具,支持linux/Windows/MacOS等多个系统。

版本

PyInstaller 3.2.1 + Python 3.5.2 + Windows10 64bit,用 pyinstaller -v 查看版本

PyInstaller 安装

pip install pyinstaller

hello world

尝试打包 hello_world.py,文件内容:

1
print('Hello World!')

用命令

1
2
cd path\to\hello_world.py
pyinstaller hello_world.py

生成dist\hello_world目录,其中包含可执行文件hello_world.exe。可用--onefile参数:pyinstaller --onefile hello_world.py,将所有文件压缩在exe中。

注:如果报错UnicodeDecodeError,根据这篇blog的建议,在cmd中执行命令chcp 65001

PyInstaller打包数据,记soundflie库

PyInstaller会自动打包import语句引用的包,其实只包括包下的python脚本。但如果脚本依赖于数据文件或dll链接库等,PyInstaller无法自动分析出这些依赖,需要配置参数。

用tmp.py生成exe。tmp.py内容:

1
2
3
import soundfile # version: 0.9.0.post1
sample, sr = soundfile.read('sample.wav') # 读当前目录下的音频sample.wav
print(sample.shape)

生成exe后运行,报错找不到libsndfile64bit.dll,因为soundfile依赖这个库,而PyInstaller并没有打包。

  • 那么,首先告诉PyInstaller打包:
    参考PyInstaller手册关于使用spec文件,执行命令pyi-makespec tmp.py(同样可加上--onefile参数),生成tmp.spec配置文件;
  • 在spec文件中,向Analysis构造器传入参数datas列表,添加二元组('X:\\path\\to\\site-packages\\_soundfile_data\\libsndfile64bit.dll', '_soundfile_data'),元组第一个元素指示dll文件路径,后者指示运行时存放的目录。在上一步如果指定了--onefile,dll文件会在运行时被解压到一个临时目录(以_MEI开头,见下个步骤)的_soundfile_data目录下,如果未指定,会被复制到exe同目录的_soundfile_data目录下;
  • 修改soundfile.py源码如下,最后执行命令pyinstaller tmp.spec
    1
    2
    3
    4
    5
    6
    7
    8
    9
    # 原始代码
    _snd = _ffi.dlopen(_os.path.join(_os.path.dirname(_os.path.abspath(__file__)), '_soundfile_data', _libname))
    # 修改
    try:
    # with --onefile, PyInstaller creates a temp folder and stores path in _MEIPASS
    base_path = sys._MEIPASS
    except Exception:
    base_path = _os.path.dirname(_os.path.abspath(__file__))
    _snd = _ffi.dlopen(_os.path.join(base_path, '_soundfile_data', _libname))

记librosa库

librosa依赖的resampy库需要打包site-packages\resampy\data下的两个数据文件,与对soundfile的处理一样,向datas添加元组('X:\\path\\to\\site-packages\\resampy\\data', 'data'),然后修改resampy包下filters.py源码:

1
2
3
4
5
6
7
8
9
10
11
12
13
# librosa version: 0.5.1
# resampy version: 0.1.5
# 原始代码
fname = os.path.join('data',.path.extsep.join([filter_name, 'npz']))
data = np.load(pkg_resources.resource_filename(__name__, fname))

# 修改:
try:
base_path = sys._MEIPASS
except Exception:
base_path = '.'
fname = os.path.join(base_path,'data', os.path.extsep.join([filter_name, 'npz']))
data = np.load(pkg_resources.resource_filename(__name__, fname))

此外,有几个包或模块没有被PyInstaller打包,向spec文件Analysis构造器传入参数 hiddenimports=['cython', 'sklearn.neighbors.typedefs']

Python脚本:向服务器报告IP

发表于 2017-06-16   |   分类于 Tools

服务器端脚本,监听某个端口。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
# -*- coding: utf-8 -*-

import logging
import socket

BUFF_SIZE = 2048

LOG_FILENAME = "record_ip.log" # 日志文件名
MSG = b'Hello World'
ADDRESS = ('127.0.0.1', 2134) # 这里的IP应该填外网的

# 配置日志输出文件及级别
FORMAT = '%(asctime)s::%(levelname)s::%(message)s'
logging.basicConfig(filename=LOG_FILENAME, level=logging.INFO, format=FORMAT, filemode='a')

# 日志同时输出到控制台
console = logging.StreamHandler()
console.setLevel(logging.INFO)
console.setFormatter(logging.Formatter(FORMAT))
logging.getLogger('').addHandler(console)

s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.bind(ADDRESS)

while True:
data, addr = s.recvfrom(BUFF_SIZE)
if data == MSG:
logging.info('IP: %s' % addr[0])

客户端每隔一段时间向服务器发送消息。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# -*- coding: utf-8 -*-

import socket
import time

TIME_DELAY = 24 * 3600 # 每天报告一次
MSG = b'Hello World'
SERV_ADDR = ('127.0.0.1', 2134) # 这里IP填服务器的

while True:
time.sleep(TIME_DELAY)
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.sendto(MSG, SERV_ADDR)
s.close()

卷积神经网络笔记

发表于 2017-01-23   |   分类于 ML

学习 UFLDL教程 “处理大型图像”部分的笔记。

参考

  • 建立分类用深度网络
  • 神经网络之反向传播与自编码器
  • 深度网络笔记

卷积特征

把大型原始图像作为输入直接训练神经网络难以实现,因为数据向量维度太大。一种解决办法是用原始图像的小块来训练神经网络模型,再用这个模型提取整个图像的特征。特征提取用卷积,参见《卷积特征提取》。将图像分成小块输入模型得到输出,将所有小块的输出组合成一个向量,作为整个图像的特征向量。

池化

卷积特征提取解决了神经网络模型训练的问题,提取出有效的特征,但当训练分类器时,特征向量维度也太大,解决方法是计算图像每个区域上的每个特定特征的平均值 (或最大值,或其他统计量)作为新的特征向量,这被称为池化。

深度网络笔记

发表于 2017-01-23   |   分类于 ML

学习 UFLDL教程 “建立分类用深度网络”部分的笔记。

参考

  • 建立分类用深度网络
  • 神经网络之反向传播与自编码器

自编码器+分类器

深度网络用大量未标注数据训练自编码器(常被称为预训练),自编码器的激活单元(即隐藏神经元)可表示数据的某种特征。然后将有标注数据输入自编码器,得到特征向量,以新的特征向量为输入训练分类器(例如softmax分类器)。训练完成后,可将自编码器和分类器结合成一个神经网络,利用有标注数据做微调。

深度网络的优势与困难

优势在于其强大的特征表示能力。

困难有梯度弥散问题,利用梯度下降法训练时,梯度随深度增加而减小,导致深层网络得不到有效训练。

栈式自编码算法

栈式自编码算法基于“逐层贪婪训练方法”,为解决梯度弥散等问题。在预训练自编码器时,采用逐层训练而非步到位。用原始数据作为训练数据训练第一层,之后从第一层得到原始数据的特征向量,以之作为训练数据训练第二层,又可得到新的特征向量以训练第三层…..

123…8
Blunt

Blunt

email:summer15y@163.com

72 日志
7 分类
37 标签
© 2019 Blunt
由 Hexo 强力驱动
主题 - NexT.Muse