% Talkie library % Copyright 2011 Peter Knight % This code is released under GPLv2 license. % % Main LPC mapping code. % Converts WAV file into LPC model parameters. clear params = []; % LPC10 encoder % Read source file [a,sampleRate, bitDepth] = wavread('TomsDiner8.wav'); b=a.*0; % Output buffer, matching size % LPC10 frame is 25ms at 8000Hz frameTime = 0.025; frameSamples = sampleRate * frameTime; W = 2*frameSamples; % Window is twice as long as frame, to allow for windowing overlaps % Precalculate hanning window, length 2 frames hannWindow = transpose(0.5*(1-cos(2*pi*(0:(W-1))/(W-1)))); % Precalculate phases for 1Hz phase = (1:W)*2*pi/sampleRate; lpcOrder=10; lena = length(a); for frameStart = 1:W/2:(lena-W) % Window chunk of input frameChunk = a(frameStart:(frameStart+W-1),1); frameWindowed = (frameChunk .* hannWindow); % Measure energy frameEnergy = sqrt(mean(frameWindowed.*frameWindowed)); % Measure pitch pitch = 235; % Mid point of Suzanne Vega's pitch range [pitch,pitchScore] = pitchRefine(frameWindowed,pitch,100,sampleRate); [pitch,pitchScore] = pitchRefine(frameWindowed,pitch,30,sampleRate); [pitch,pitchScore] = pitchRefine(frameWindowed,pitch,10,sampleRate); [pitch,pitchScore] = pitchRefine(frameWindowed,pitch,3,sampleRate); % Consonant detection if (pitchScore/frameEnergy > 0.1) isVoiced = 1; else isVoiced = 0; pitch = 0; end % Calculate LPC coefficients r = autocorrelate(frameWindowed,lpcOrder+1); [k,g] = levinsonDurbin(r,lpcOrder); if isVoiced==0 g = 0.1*g; end [frameStart/lena,g] % Show status % Quantise to match bit coding [pitch,g,k,frameBits] = lpcQuantise(pitch,g,k); params = vertcat(params,frameBits); % Synthesise from parameters d = lpcSynth(pitch,g,k,W,lpcOrder,sampleRate); d = d .* hannWindow; % Write back pitch to output wav b(frameStart:(frameStart+2*frameSamples-1)) = b(frameStart:(frameStart+2*frameSamples-1)) + d; end b = transpose(b); wavwrite(b,8000,16,'TomsDinerPitch.wav'); csvwrite('tomsDinerStream.csv',params);