function speechaligner
wordCount=648;%substitute number of "words" in source
samplerate=44100;
nanlength=10;
catches=0;
catches1=0;
ratNum=4;
endDuration=10;%number of seconds to extend average after end of final word
[A,B]=uigetfile({'*.csv','Select MULTIPLE csv files'},'Select MULTIPLE csv files.','MultiSelect','on');
A=strcat(B,A);
[C,D]=uigetfile({'*.wav','Select MULTIPLE wav files'},'Select MULTIPLE wav files.','MultiSelect','on');
C=strcat(D,C);
for n=1:size(A,2);
    csvFile=fopen(A{1,n},'r');
    csvData=textscan(csvFile,'%s','Delimiter',',');
    varier=0;
    for i=1:wordCount;
    	p=((i-1)*4)+varier;
    	timeList(i,1,n)=str2double(csvData{1}{p+3});
    	timeList(i,2,n)=str2double(csvData{1}{p+4});
        if(timeList(i,1,n)==0||isnan(timeList(i,1,n)))
            timeList(i,1,n)=0;
            timeList(i,2,n)=0;
            varier=varier-1;
        end;
    end;
end;
timeListTemp=timeList;
timeListTemp(timeListTemp==0)=NaN;
for n=1:size(A,2);
    timeListTemp(:,1,n)=fillmissing(timeListTemp(:,1,n),'linear');
    timeListTemp(:,2,n)=fillmissing(timeListTemp(:,2,n),'linear');
end;
for i=1:wordCount;
    timeListPart=timeListTemp(i,1,:);
    timeAvg(i,1)=nanmean(timeListPart,3);
    timeListPart=timeListTemp(i,2,:);
    timeAvg(i,2)=nanmean(timeListPart,3);
end;
randomwidth=floor(samplerate/30);
targetSampleNum=ceil((timeAvg(wordCount,2)+endDuration)*samplerate)+randomwidth;
outCombo=zeros(targetSampleNum,1);
for n=1:size(A,2)
    stagger=randi(randomwidth)-1;
    outAudio=zeros(targetSampleNum,1);
    x=0;
    skipover=0;
    i=0;
    for j=1:wordCount
        i=i+1;
        if(i>wordCount)
            break
        end;
        progReport=strcat(num2str(n),'_',num2str(i))%To display progress
        while(timeList(i,1,n)==0)
            skipover=1;
            i=i+1;
        end;
        if(skipover==1)
            startWord=x;
            endWord=i;
            if(startWord==0)
                startSourceSample=1;
                startTargetSample=1+stagger;
                origLength=(timeList(endWord,1,n));
                targetLength=(timeAvg(endWord,1));
            else
                startSourceSample=round(timeList(startWord,2,n)*samplerate);
                startTargetSample=round(timeAvg(startWord,2)*samplerate)+stagger;
                origLength=((timeList(endWord,1,n)-timeList(startWord,2,n)));
                targetLength=((timeAvg(endWord,1)-timeAvg(startWord,2)));
            end;
            endSourceSample=round(timeList(endWord,1,n)*samplerate);
            ratioCheck=targetLength/origLength;
            if(ratioCheck>(1/ratNum)&&ratioCheck<ratNum)
                inClip=audioread(C{1,n},[startSourceSample,endSourceSample]);
                	try
                        outClip=pvoc(inClip,(origLength/targetLength));
                        [num,den]=rat(((targetLength*samplerate)/size(outClip,1)));
                        outClip=resample(outClip,num,den);
                    catch
                        catches=catches+1;
                        outClip=inClip;
                    end;
               try
                    outAudio(startTargetSample:startTargetSample+size(outClip,1)-1)=outClip;
                    if(startTargetSample>nanlength)
                        outAudio(startTargetSample-nanlength:startTargetSample+nanlength)=NaN;
                    else
                        outAudio(startTargetSample:startTargetSample+nanlength)=NaN;
                    end;
               end;
               outClip=[];
            end;
            skipover=0;
        elseif(i==1||timeList(i,1,n)~=timeList(i-1,2,n));
            if(x==0)
                startSourceSample=1;
                startTargetSample=1+stagger;
                origLength=(timeList(i,1,n));
                targetLength=(timeAvg(i,1));
            else
                startSourceSample=round(timeList(i-1,2,n)*samplerate);
                startTargetSample=round(timeAvg(i-1,2)*samplerate)+stagger;
                origLength=((timeList(i,1,n)-timeList(i-1,2,n)));
                targetLength=((timeAvg(i,1)-timeAvg(i-1,2)));
            end;
            endSourceSample=round(timeList(i,1,n)*samplerate);
            ratioCheck=targetLength/origLength;
            if((ratioCheck>(1/ratNum)&&ratioCheck<ratNum)&&endSourceSample>startSourceSample)
                inClip=audioread(C{1,n},[startSourceSample,endSourceSample]);
                try
                    outClip=pvoc(inClip,(origLength/targetLength));
                    [num,den]=rat(((targetLength*samplerate)/size(outClip,1)));
                    outClip=resample(outClip,num,den);
                catch
                	catches=catches+1;
                    outClip=inClip;
                 end;
                 try
                    outAudio(startTargetSample:startTargetSample+size(outClip,1)-1)=outClip;
                    if(startTargetSample>nanlength)
                        outAudio(startTargetSample-nanlength:startTargetSample+nanlength)=NaN;
                    else
                        outAudio(startTargetSample:startTargetSample+nanlength)=NaN;
                    end;
                 end;
                 outClip=[];
            end;
        end;
        origLength=((timeList(i,2,n)-timeList(i,1,n)));
        targetLength=((timeAvg(i,2)-timeAvg(i,1)));
        startSourceSample=round(timeList(i,1,n)*samplerate);
        endSourceSample=round(timeList(i,2,n)*samplerate);
        ratioCheck=targetLength/origLength;
        if(ratioCheck>(1/ratNum)&&ratioCheck<ratNum)
        	inClip=audioread(C{1,n},[startSourceSample,endSourceSample]);
        	try
            	outClip=pvoc(inClip,(origLength/targetLength));
                [num,den]=rat(((targetLength*samplerate)/size(outClip,1)));
                outClip=resample(outClip,num,den);
            catch
            	catches=catches+1;
                outClip=inClip;
             end;
             startTargetSample=round(timeAvg(i,1)*samplerate)+stagger;
             try
             	outAudio(startTargetSample:startTargetSample+size(outClip,1)-1)=outClip;
                outAudio(startTargetSample-nanlength:startTargetSample+nanlength)=NaN;
             end;
             outClip=[];
        end;
        x=i;
    end;
    info=audioinfo(C{1,n});
    origLength=(info.TotalSamples-(timeList(i-1,2,n)));
    targetLength=((targetSampleNum-timeAvg(i-1,2)));
    startSourceSample=round(timeList(i-1,2,n)*samplerate);
    endSourceSample=info.TotalSamples;
    inClip=audioread(C{1,n},[startSourceSample,endSourceSample]);
    try
        outClip=pvoc(inClip,(origLength/targetLength));
        [num,den]=rat(((targetLength*samplerate)/size(outClip,1)));
        outClip=resample(outClip,num,den);
    catch
        catches=catches+1;
        outClip=inClip;
    end;
    startTargetSample=round(timeAvg(i-1,2)*samplerate)+stagger;
    try
        outAudio(startTargetSample:startTargetSample+size(outClip,1)-1)=outClip;
        outAudio(startTargetSample-nanlength:startTargetSample+nanlength)=NaN;
    end;
    outAudio=fillmissing(outAudio,'linear');
    audiowrite(strcat('out',num2str(n),'.wav'),outAudio,samplerate);
    outCombo=outCombo+outAudio;
end;
outCombo=outCombo/max(abs(outCombo));
audiowrite(strcat('outcombo4.wav'),outCombo,samplerate);
fclose('all');
catches%reports quantity of unsuccessfully phase-vocoded segments