2020年3月24日 星期二

Kaldi ASR:特征提取

https://www.jianshu.com/p/4ea405ac00f5

在不深究具体过程的前提下理一理语音识别中特征提取的基本过程,并通过kaldi对该过程进行操作,得出相应结果。以梅尔倒普系数MFCC为例,对于语音信号,处理如下:
  • Input is 16kHz sampled audio.
  • Take a 25ms window (shift by 10 ms each time; we will output a sequence of vectors, one every 10ms)
  • Multiply by windowing function e.g. Hamming
  • Do fourier transform FFT
  • Take log energy in each frequency bin
  • Do discrete cosine transform (DCT): (gives us the “cepstrum”)
  • Keep the first 13 coefficients of the cepstrum.
在kaldi工具下,完成上述过程需要一条命令(steps/make_mfcc.sh)
#gen MFCC features
for x in train cv test; do
   #make  mfcc 
   steps/make_mfcc.sh --nj $n --cmd "$train_cmd" data/mfcc/$x exp/make_mfcc/$x mfcc/$x || exit 1;
   #compute cmvn
   steps/compute_cmvn_stats.sh data/mfcc/$x exp/mfcc_cmvn/$x mfcc/$x || exit 1;
done
steps/make_mfcc.sh命令指定参数包括 data-dir、 log-dir、mfcc-dir,分别指定原数据位置、日志输出目录、和提取结果目录。 steps/compute_cmvn_stats.sh 用于对说话人语音的特征取均值和方差。
完成MFCC特征提取后,查看结果:
$ copy-matrix ark:raw_mfcc_train.1.ark ark,t:- | head copy-matrix ark:raw_mfcc_train.1.ark ark,t:- 
speaker001_00001  [
  27.54613 -20.59882 -9.078632 -9.878078 -3.408179 -6.33442 -7.088059 -9.386513 -9.514486 5.714392 3.923563 -0.2056017 -6.208587 
 ...]
语音speaker001_00001被以帧为单位转化为13维向量集,接着为了以后对说话人进行自适应,对每个说话者求倒普均值与方差,这里用到了spk2utt和feats.scp两个映射文件, 查看结果:
$ copy-matrix ark:cmvn_train.ark ark,t:- 
copy-matrix ark:cmvn_train.ark ark,t:- 
speaker001  [
  3153345 -332630 -150518.8 -129893.8 -416410.7 -370985.3 -160386.6 17840.54 -276749.9 -312077.3 -381611.7 -315793.8 -147651.9 46141 
  2.236304e+08 6630422 6846200 7327799 1.325839e+07 1.371075e+07 1.077766e+07 7187704 1.197414e+07 8830369 1.272681e+07 1.092798e+07 5399742 0 ]
speaker002  [
  4278844 -475446.6 -279641.1 -196591.9 -759722.8 -208586.2 117607.6 -258971.1 -547313 -553619.6 -266483.2 40984.47 48301.47 63223 
  2.995394e+08 7515546 8840850 1.154735e+07 3.502638e+07 1.221414e+07 9032753 1.709921e+07 1.77456e+07 1.534125e+07 7840884 7368065 9012588 0 ]

小结

通过上面的过程,可以知道,对于一段语音,首先对其进行分帧(如,每10ms取25ms的窗口作为一帧),对每一帧进行平滑(加窗,如汉明窗),之后进行FFT(快速傅里叶变化)将连续信号转化为数字信号, 再进行离散余弦变换(DCT)得到一个多维向量,最后取前13维作为最后的MFCC。重复该过程,得到一段语音每个帧的特征向量。


作者:zqh_zy
链接:https://www.jianshu.com/p/4ea405ac00f5
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

2020年3月18日 星期三

mobile01的文章 討論三菱電機空調

https://www.mobile01.com/topicdetail.php?f=731&t=6042964

三菱電機裝到一對三以上的室外機絕對是日本原裝的,你說的那是除濕機或冰箱,才會用國際牌新加坡製造的小型壓縮機,廣州應該不太可能,除非新加坡缺貨才有可能跟中國拿壓縮機應急吧。空調用的壓縮機跟除濕機冰箱那種小型壓縮機技術規模是不一樣的,所以三菱空調只會用自己家的壓縮機。

三菱電機在日本靜岡、中國廣州和泰國都有壓縮機工廠,日本靜岡廠的年產量不超過百萬顆,扣掉被台灣日立買去的十幾萬顆所剩已經不多。

據了解靜岡廠的壓縮機主要是供應日本空調市場,廣州廠是供應中國市場,泰國廠則是應付其他國家的需求。

靜岡廠的壓縮機在供給日本空調市場的需求量之餘,如果真的還能騰出量來分配給台灣市場的空調機,那就太棒了。

是的,只有一對三以上的多聯才是用日本原裝壓縮機。


2020年3月11日 星期三

[轉載] 傅立葉轉換到底在轉換什麼?

https://www.eebreakdown.com/2015/05/blog-post_30.html

一陣子沒寫文章,原本週五晚上想寫一下的。一方面是因為手邊還有東西在做,二來是有點懶.... 今天想說,不行!就算瞎扯淡也好,反正就是得寫點東西~

  之前在社群中有看到一篇嘗試不用數學來說明傅立葉轉換的文章(很長....),雖然我是覺得加上數學會更好說明,不過,我也試著不要使用數學好了。我接下來想說的,其實比較帶有哲學意味,而不是什麼理論哦....  有些看法是純個人的見解,認不認同在各位囉~

前提

這裡,我先假設大家都已經接受了以下的觀念:
1. 世界上所有的訊號,都是由不同頻率的弦波所組成
2. 弦波是訊號的基本組成元素,不管它是正弦或餘弦

註:這裡的「訊號」指的是隨時間變化且可定量的東西,例如聲音、電磁波。而不是感性上「暗示」的那種訊號....例如:「她的眼神含情脈脈!這是一種暗示嗎?那個妹是不是在剛剛跟我對上眼的瞬間,就愛上我了!」為了簡單起見,我們可以把這裡的訊號,都當成「電訊號」來看待。


傅立葉轉換

學過傅立葉轉換之後,我們心中大概就知道一件事:「哦!傅立葉轉換就是要將一個時域訊號,轉換到頻域上去。不管這個訊號是以時域的方式表現(波形, waveform),還是以頻域的方式表現出來(頻譜, spectrum),指的都是同一個訊號!」

某生A:「老師!~~~~~~~  我知道了!」
我:「你知道什麼?!」
某生A:「轉換嘛!就好像食物被我吃進去,經過我身體把它"轉換"之後,變成坨屎!這意思就是,食物就是屎,屎就是食物!一樣的東西!

我:「那你吃屎嗎?」
某生A:「恩!我吃!」
我:「哇~靠!!!真的假的!」
某生A:「吃過啊!鼻屎....」

我:「喂..... 這裡講的不是那種"轉換"啦!」 (身體是一個系統,對訊號有轉移、轉變的作用)


傅立葉轉換到底轉換了什麼?

它轉換了你看待它的觀點,而訊號本身並沒有被改變。因此,傅立葉轉換,是在轉換我們對訊號的「度量觀點」。

某生A:「哦!我知道啊!時域轉成頻域嘛.... 反轉換,就是頻域轉回時域....」
某生B:「恩.... 所以到底是轉換了什麼?」

度量觀點轉換,讓我們更了解訊號的內涵

歐姆曾說過:「人的耳朵就是最好的傅立葉分析器。」 是的,這個歐姆,就是 V=IR 的那個歐姆。
註:這句話我不曉得從哪裡讀到的,剛剛上網查沒找到。還是從哪本書看來的,我也忘了。

  我認為歐姆講的實在太好了!

  聲音是一個大家討論傅立葉轉換時,很常用的例子。假設,聞男生尖叫跟女生尖叫,通常我們可以很容易判斷哪個是男聲、哪個是女聲。因為男生都叫「啊~~」,女生都叫「伊呀~」..... 喂~~不是好嘛!是因為男生的音調低,女生的音調高。更精確地說,女聲帶有的高頻成分比男生較多(也大)啦!

  假設我們用麥克風把男聲跟女聲轉成電訊號來觀察。如果我像下面丟給你兩張聲音的時域波形,然後請你說出哪一張是男聲、哪一張是女聲,你大概只能瞎猜一通:
註:波形上振幅的大小代表聲音的音量大小。(迷之音:「你是在大聲什麼啦~~」


  可是經過你的耳朵分析後,你可以很容易辨別哪個是女聲、哪個是男聲。以下是傅立葉轉換,聲音波形在頻譜上看到的結果。男聲低頻成分比較大,女聲高頻成分比男聲豐富:(男生聲音檔 / 女生聲音檔)




傅立葉分析是一種哲學

什麼哲學呢?「格物致知」嗎.... 傅立葉分析,比王陽明用眼神想格斃竹子厲害啊....(開玩笑啦~),以下來說說我的看法:

  我們雖然藉由傅立葉轉換,將觀點切換到了頻域上面去,但傅立葉分析的本質是時間的流動。用比較哲學的說法是,傅立葉分析讓我們找出一個在時間上流動的訊號,它的內涵是什麼。這裡說的內涵,同時包括了「內容」,以及該內容的「意義」。所以,傅立葉分析讓我們找出內容的意義。
註:這裡並不是說單從時域訊號,就不能得到"意義",因為意義其實是人賦予的。旨在說明,凡事不能只看一面。

  這樣的分析,在生活中很常見。我假設一個很爛的例子,例如我這中老年人代謝不佳的身體,我的體重起伏大概是這樣的:
1. 約每一個禮拜,體重都會出現一個小 peak,都發生在週末
2. 夏季的體重比冬季體重低,而且這數十年來都這樣

  • 上面第一點,經分析,因為我到周末就比較放肆,喝啤酒、吃雞排,所以體重都會稍微增加一點,到了禮拜一,把屎全拉光,體重就下降下來!哈哈~
  • 上面第二點,經分析,因為冬天一到我就準備冬眠.... 脂肪增加是自然驅動的!不能怪我!

註:數據分析並不總是在找週期性,也可能是在找某些事件跟某些變數的關係,或更有甚深者。此處的例子僅是為了要凸顯找尋「意義」這件事情而已。

你發現什麼
  • 第一點,如果你的量測不足一個禮拜,你根本不可能知道「以每個禮拜為周期」的特徵
  • 第二點,如果你的量測不足一年,你根本不可能知道「以每年為週期」的特徵

  用 E. E. 的立場來說,如果今天我拿到一段時域波形,我想要知道這段波形是否帶有頻率 1kHz 的成分存在:
  • 1 kHz 的弦波,週期為 1 ms
  • 如果你今天拿到的那段波形,時間總長度不足 1ms,你根本度量不到 1 kHz 的弦波波形(不完整)
  • 反過來說,如果已知某個隨時間流動的訊號,可能帶有 1 kHz 的頻率成分,那麼我們的觀測時間長度就至少需要 1 ms (註: 如果可以觀測 2 倍的時間長 = 2 ms 就能更加確定波形的重複性) 

傅立葉分析 - 形而上的觀點

  • 假如時間靜止了,甚麼東西都不活動,那生活的意義是否還存在?
  • 假如現在的我,不是由過去的我所造成的,那麼我是什麼?
  • 這瞬間,就在這一秒當下的我,是完整的我嗎?
  • 回顧過去的某段時期,對我的影響?
  • 如果一句話,我只聽一個字,我怎麼會知道那句話是什麼意思。
  • 數據不流動,就無法傳遞。
  • 數據經過特定的排序,就有機會找出它的內涵。排序正是一種流動。
  • 傅立葉分析就是一種自省、認識自我的過程
  • ....  歡迎補充....

傅立葉分析的應用

  • 濾波
    • 某一受干擾的訊號波形,我想濾波,把干擾拿掉。沒有傅立葉分析,多數情況你幾乎不知道應該要濾掉什麼(頻率成分),因此濾波器設計連起頭都有困難
  • 混頻
    • 將某訊號頻率成分移動到某個頻率,例如男聲經過混頻處理後,變成女聲
  • 等化器
    • 不管是多媒體還是訊號,透過等化器就能調整訊號的內容。內容就是不同頻率成分的大小、相位等等,不同頻率也可以想成色彩的紅綠藍 R, G, B 通道
    • 調整相位也就是調整訊號延遲或超前,我們可讓一段頻寬內的頻率成分都具有相同延遲(相位隨頻率的變化是線性的),我們就會說那段頻寬內的"群延遲"固定
    • 有些系統的群延遲隨頻率變化可能不固定,因此訊號經過此系統會造成失真,就可透過等化器來校正(設計某種頻率響應來補正,用濾波器也行)
  • 線性度、失真度的定量
    • 這個有機會再說,不然還要扯一堆....
  • 等等等.... 但總體來說,調整頻率成分就是等化器的功能,端視你的"應用"到底需要什麼而已... 但等化器通常比較 generic,為你的特定應用所設計的頻率成分調整器,就是濾波器(濾波器其實也是很廣義呢!)

小叮嚀

  有些人會在談「頻譜」或「頻率響應」的時候說:「這上面的波形,如何如何....」
在此提醒,波形這兩個字還是留給時域使用吧!因為在 E. E. 領域講的"波"形,通常都是指隨時間流動的東西。例如:示波器上顯示的波形....

  在談頻域時,還是用「譜」或「響應」來描述比較恰當,例如:這張譜上某某頻率的成分過大、從它的頻率響應可以看到低通的效果不好。

後記

  在 E. E. 領域打滾多年,凡事無不與"訊號"與"系統"有關,而傅立葉分析的觀念是根。每次只要遇到要處理訊號的問題時,我就發現傅立葉的靈,一直在我背後。(有鬼啊~塊陶~)

  我很喜歡傅立葉分析,我不是因為計算上的關係而喜歡它;我喜歡它是因為,多年來,不管是工作上、還是人生上,它帶給了我很多很多的啟發....。至今,它仍一直持續影響著我。

2020年3月4日 星期三

如何查詢 Linux 的發行版名稱與版本資訊。

https://blog.gtwang.org/linux/find-linux-distribution-name-version-number/

這裡介紹如何查詢 Linux 的發行版名稱與版本資訊。
在 Linux 系統之下若想要查詢發行版名稱與版本的資訊有許多種方法,而不同的 Linux 發行版適用的方式也不同,以下整理了一些常見的方法。

查詢 Linux 發行版與版本

Linux 發行版(distribution)與版本就是指大家常聽到的 Ubuntu 16.04、Fedora 24、CentOS 7 這些名字,而要查詢 Linux 的發行版有以下幾中方式。

查看 /etc/*-release

通常在 /etc 目錄中會有一些檔名為 *-release 的系統版本資訊檔,通常從這些檔案的內容就可以看出 Linux 的發行版名稱與版本號碼。首先可以使用 ls 列出所有的 /etc/*-release 檔案:
ls -l /etc/*-release
-rw-r--r-- 1 root root 467  4月 15  2015 /etc/os-release
-rw-r--r-- 1 root root  40  4月 15  2015 /etc/redhat-release
lrwxrwxrwx 1 root root  14 10月 20  2015 /etc/sl-release -> redhat-release
lrwxrwxrwx 1 root root  14 10月 20  2015 /etc/system-release -> redhat-release
雖然檔案名稱有 redhat 的字樣,但是實際的 Linux 發行版名稱還是要看裡面的內容才知道:
cat /etc/redhat-release
Scientific Linux release 7.1 (Nitrogen)
os-release 裡面還有更詳細的資訊:
cat /etc/os-release
NAME="Scientific Linux"
VERSION="7.1 (Nitrogen)"
ID="rhel"
ID_LIKE="fedora"
VERSION_ID="7.1"
PRETTY_NAME="Scientific Linux 7.1 (Nitrogen)"
ANSI_COLOR="0;31"
CPE_NAME="cpe:/o:redhat:enterprise_linux:7.1:GA"
HOME_URL="http://www.scientificlinux.org//"
BUG_REPORT_URL="scientific-linux-devel@listserv.fnal.gov"

REDHAT_BUGZILLA_PRODUCT="Scientific Linux 7"
REDHAT_BUGZILLA_PRODUCT_VERSION=7.1
REDHAT_SUPPORT_PRODUCT="Scientific Linux"
REDHAT_SUPPORT_PRODUCT_VERSION=7.1
從上面這些資料看起來這個 Linux 系統是 Scientific Linux release 7.1。以下則是 Ubuntu Linux 16.04 的狀況:
cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=16.04
DISTRIB_CODENAME=xenial
DISTRIB_DESCRIPTION="Ubuntu 16.04 LTS"
cat /etc/os-release
NAME="Ubuntu"
VERSION="16.04 LTS (Xenial Xerus)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 16.04 LTS"
VERSION_ID="16.04"
HOME_URL="http://www.ubuntu.com/"
SUPPORT_URL="http://help.ubuntu.com/"
BUG_REPORT_URL="http://bugs.launchpad.net/ubuntu/"

使用 lsb_release 指令查詢

lsb_release 是一個用來查詢 Linux 發行版資訊的指令,但是並不是每一種 Linux 發行版預設都會安裝這個指令,使用時要碰運氣:
lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 16.04 LTS
Release: 16.04
Codename: xenial
像在 Scientific Linux 中就沒有這個指令可以用:
lsb_release -a
bash: lsb_release: 找不到指令...

查詢 Linux 核心版本

Linux 核心版本跟發行版的版本是不一樣的東西,Linux 核心版本通常是比較進階的系統開發者或管理者才會需要用到,它看起來會類似 Linux 4.4.0-24-generic,以下是幾種 Linux 核心版本的查詢方式。

使用 uname 指令查詢

uname 是一個用來查詢 Linux 系統核心資訊的指令:
uname -a
Linux my-server 3.10.0-229.el7.x86_64 #1 SMP Mon Mar 9 16:14:50 CDT 2015 x86_64 x86_64 x86_64 GNU/Linux
這是 Ubuntu Linux 16.04 的狀況:
uname -a
Linux ubuntu-pc 4.4.0-24-generic #43-Ubuntu SMP Wed Jun 8 19:27:37 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux

查看 /proc/version

在 /proc/version 中也會紀錄一些 Linux 的核心版本資訊:
cat /proc/version
Linux version 3.10.0-229.el7.x86_64 (mockbuild@sl7-uefisign.fnal.gov) (gcc version 4.8.3 20140911 (Red Hat 4.8.3-9) (GCC) ) #1 SMP Mon Mar 9 16:14:50 CDT 2015
這是 Ubuntu Linux 16.04 的狀況:
cat /proc/version
Linux version 4.4.0-24-generic (buildd@lgw01-12) (gcc version 5.3.1 20160413 (Ubuntu 5.3.1-14ubuntu2.1) ) #43-Ubuntu SMP Wed Jun 8 19:27:37 UTC 2016
參考資料:nixCraftlinux.com