[PYTHON] LPC avec Scipy

Après avoir acquis le coefficient AR par LPC, j'ai essayé de le piloter avec du bruit blanc. J'ai l'impression que ma voix est devenue comme un robot (?). De plus, si vous modifiez le bruit de conduite, vous devriez obtenir une qualité de voix différente.

lpc.py


#!/usr/bin/env python

import sys
import wave
import urllib2
import getopt
import scipy as sp
import matplotlib.pyplot as plt
from scipy import linalg, signal
from scikits.talkbox.linpred.levinson_lpc import lpc

if __name__ == "__main__":
    optlist, argv = getopt.getopt( sys.argv[1:], 's:l:o:w:')

    frameLength = 512
    stepWidth = 256
    lpcOrder = 32
    chunk = 44100 * 5
    for opt, val in optlist:
        if( opt == '-s' ):
            chunk = int( val )
        elif( opt == '-w' ):
            stepWidth = int( val )
        elif( opt == '-l'):
            frameLength = int( val )
        elif( opt == '-o' ):
            lpcOrder = int( val )

    argc = len( argv )
    if( 0 < argc ):
        if( argc == 2 ):
            inFileName, outFileName = argv
        elif( argc == 1 ):
            inFileName = argv[0]
            outFileName = 'out.wav'
        wo = wave.open( inFileName, 'rb' )
    else:
        outFileName = 'out.wav'
        url = 'http://www.it.ice.uec.ac.jp/SRV-DB/archive/HENSHU00_PF00/HENSHU00_PF00_0951.wav'
        wo = wave.openfp( urllib2.urlopen( url ).fp,  'rb' )

    data = sp.fromstring( wo.readframes( chunk ), sp.int16 )
    blockData = sp.linalg.toeplitz( data[ frameLength:], data[:frameLength] )[::stepWidth, :]

    lpcCoef, lpcError, k = lpc( blockData,  lpcOrder )
    excitationSignal = sp.random.randn( frameLength )

    rows, cols = lpcCoef.shape
    responseSignal = sp.zeros( ( rows,  frameLength ) )
    synthesisSignal = sp.array( [0] * ( rows  * stepWidth + frameLength ) )
    weight = sp.sin( 2 * sp.pi * sp.r_[0:frameLength] / frameLength )
    for i in range( rows ):
        G = sp.sqrt( lpcError[ i ] )
        responseSignal[i, :] = sp.signal.lfilter( [G], lpcCoef[ i, :], excitationSignal )
        synthesisSignal[ i * stepWidth:i * stepWidth + frameLength ] +=  weight * responseSignal[ i, :]

    outputSignal = sp.int16( synthesisSignal ).tostring()
    wo = wave.open( outFileName, 'wb')
    params = ( 1, 2, 44100, len( synthesisSignal),'NONE','none')
    wo.setparams( params )
    wo.writeframes( outputSignal )
    wo.close()

Recommended Posts

LPC avec Scipy
ICA avec Scipy
CORDIC avec Scipy
Créer un filtre avec scipy
Normariser les données avec Scipy
Utilisez OpenBLAS avec numpy, scipy
Extraire la valeur de crête avec scipy
Moyenne harmonique par Python (en utilisant SciPy)
Calculer la distribution de l'échantillon avec Scipy (distribution discrète)
Générer une distribution normale avec SciPy
scipy Voronoi
Installez Scipy
Si scipy est python 2.7.8, l'installation de pip trébuche
Utilisez BLAS / LAPACK multi-thread avec numpy / scipy
Utilisation d'Intel MKL avec NumPy / SciPy (version de novembre 2019)
Une doublure pour créer des images de Lena avec Scipy
Créer un diagramme de dispersion 3D avec SciPy + matplotlib (Python)