人工知性を作りたい

私が日々、挑戦したことや学んだことなどを紹介していく雑記ブログです。 (新しいAI技術HTM, 専門の音声信号処理, 趣味のアニメ等も書いてます。)

global navigation menu page top

音の合成と正規化【Pythonで音声信号処理】

f:id:hiro-htm877:20190614212321j:plain





 

f:id:hiro-htm877:20190601202549p:plain

Python・音声信号処理 初心者】

 「音を足し合わせたい」

「音を正規化しろって言われたけど、どういうこと?」

「音をいじって遊びたい」

 

 

 

そんな方の疑問に答えます

 

コードが知りたい方は目次のソースコードへ飛んでください!

本記事のテーマ

【完全初心者向け】

・音の合成

・音の正規化 

音の合成と正規化

アルゴリズム

・音の合成

1. 合成したい音声をList化

2. 合成したい音声の中で一番長い音声を探す

3. 全ての音声の長さを一番長い音声に合わせる(0埋め)

4. 合成する

 

・音の正規化

1. 音声の最大値・最小値を取得

2. 最大値1で正規化する

音の合成と正規化プログラム実装!

・音の合成

def synthesis(sigList):
    maxLength = 0
    tmpLength = 0
    tmpArray = []
    #最大長の音声を探索する
    for i, data in enumerate(sigList):
        if len(data) > tmpLength:
            maxLength = len(data)
            tmpLength = len(data)
            index = i
    #最大長の音声の長さの0埋め配列を定義
    sig = np.zeros(maxLength)

    for i in sigList:
        tmp = i.tolist()    #numpy→list
        #全ての音声を最大長の音声に合わせて0埋めする
        for data in range(maxLength - len(i)):
            tmp.append(0)
        tmpArray.append(tmp)
    #配列3つを合成する
    sig = np.array(tmpArray[0]) + np.array(tmpArray[1]) + np.array(tmpArray[2])
    return sig

 

・音の正規化

def nomalize(x, xmax, xmin, a):
    min = 1 / 32768.0
    try:
        z = a * (x - xmin) / (xmax - xmin)
    except ZeroDivisionError:
        z = a * (x - xmin) / min
    return z

 

 

出力 

・sig1の波形

f:id:hiro-htm877:20190617213838p:plain

・sig2の波形

f:id:hiro-htm877:20190617213851p:plain

・sig1+sig2+sig3の波形

f:id:hiro-htm877:20190617213904p:plain

・sig1+sig2+sig3を正規化した波形

f:id:hiro-htm877:20190617213920p:plain

 

 

 

完成です!

音の合成と正規化を実装しました。

 

音を合成すると、1を超える値になったりするので正規化が必要です。

また、音声を比較するときに条件を揃えるために音声を正規化して比較することが多いので、一度実装して覚えておきましょう!

 

main文を含むソースコードは以下に示します。 

加えて、音声ファイルのopenやsaveの関数を書いた共通ソースコードは以下の記事に書いておりますので、実行ディレクトリ(ファイル名:sorce)の一つ上にフォルダ(ファイル名:common)を作成し、その中において下さい。

f:id:hiro-htm877:20190615130219p:plain

f:id:hiro-htm877:20190615130241p:plain

 

www.hiro877.com

 

ソースコード

import sys
sys.path.append('../common')  # 親ディレクトリのファイルをインポートするための設定
#sys.path.append('..')
import os
import glob
from sound import *
import numpy as np
from pylab import *
import matplotlib.pyplot as plt

def synthesis(sigList):
    maxLength = 0
    tmpLength = 0
    tmpArray = []

    for i, data in enumerate(sigList):
        if len(data) > tmpLength:
            maxLength = len(data)
            tmpLength = len(data)
            index = i

    sig = np.zeros(maxLength)

    for i in sigList:
        tmp = i.tolist()
        for data in range(maxLength - len(i)):
            tmp.append(0)

        tmpArray.append(tmp)

    sig = np.array(tmpArray[0]) + np.array(tmpArray[1]) + np.array(tmpArray[2])
    return sig


if __name__ == "__main__" :
    argvs = sys.argv
    curDirPath = os.path.dirname(os.path.abspath(__file__))
    wavDataPath = parentpath(__file__,1) + "/wav"
    wavPathList = glob.glob(wavDataPath + "/*.wav")
    print (curDirPath)
    print (wavDataPath)
    print(wavPathList)

    filedata = openFile(wavPathList[0])
    sig1 = filedata[0]
    fs1 = filedata[1]
    L1 = filedata[2]

    filedata = openFile(wavPathList[1])
    sig2 = filedata[0]
    fs2 = filedata[1]
    L2 = filedata[2]


    plt.plot(sig1)
    plt.show()

    plt.plot(sig2)
    plt.show()



    sigList = []
    for i in wavPathList:
        sigList.append(openFile(i)[0])
    sigSyn = synthesis(sigList)
    sigSyn = np.array(sigSyn)

    plt.plot(sigSyn)
    plt.show()

    sigmin = min(sigSyn)
    sigmax = max(sigSyn)
    sigSyn = nomalize(sigSyn, sigmax, sigmin, 1)
    plt.plot(sigSyn)
    plt.show()
    sys.exit()