Tuesday, May 18, 2010

Voice Processing I - The Doctor's Voice

http://soundcloud.com/credit/docvoice

(
var score=CtkScore.new, note, gamp, fftbuf, centbuf;
var doc, ray, convbuf;

doc = CtkBuffer("/Users/bion/Desktop/Transitions_In-Humanity/Doc1.wav").addTo(score);
ray = CtkBuffer("/Users/bion/Desktop/Transitions_In-Humanity/raysamp1.wav").addTo(score);
fftbuf = CtkBuffer.buffer(2**12).addTo(score);
centbuf = CtkBuffer.buffer(2**12).addTo(score);
convbuf = CtkBuffer.buffer(2**12).addTo(score);

gamp = -30.dbamp;
note = CtkSynthDef(\docvoicing, {
    var chain, env, outS, pdoc, pray, cent, width, yi, er, san, avg, adj, centchain;
    var conv, convchain, resAdj, res, res2, res3, waste;
    env = EnvGen.kr(Env([0,1,1,0], [0.01, 1, 0.01].normalizeSum, [-10, 10]), timeScale: doc.duration);
    pray = PlayBuf.ar(1, ray, BufRateScale.kr(ray));
    pdoc = PlayBuf.ar(1, doc, BufRateScale.kr(doc));
    #pdoc, waste = GVerb.ar(pdoc, 15, 0.14);
    pdoc = Compander.ar(pdoc, pdoc, -3.dbamp, 1, -12.dbamp);
    chain = FFT(fftbuf, pdoc);
    centchain = PV_Copy(chain, centbuf);
    centchain = PV_MagAbove(centchain, 30);
    cent = SpecCentroid.kr(centchain);
    er = DelayC.kr(cent, 0.10, 0.10);
    san = DelayC.kr(cent, 0.06, 0.06);
    avg = (cent+er+san)/3;
    avg = avg.min(1800);
    avg = avg.max(100);
    adj = LinLin.kr(avg, 100, 1300, -48.dbamp, -14.dbamp);
    conv = Convolution.ar(pdoc, pray, 2**12)*2;
    convchain = FFT(convbuf, conv);
    chain = PV_Morph(chain, convchain, adj);
    chain = IFFT(chain);
    resAdj = LinLin.kr(adj, -33.dbamp, 0.5, 0.6, 0.0001);
    res = Mix.ar(Resonz.ar(chain, [1200, 1400, 1800], resAdj*[200/1200, 200/1600, 600/1800]));
    outS = chain+(res*6.dbamp);
    outS = outS*gamp*env*10;
    outS = Limiter.ar(outS, 0.dbamp);
    Out.ar(0, outS);
});

score.add(note.new(0.5, doc.duration/3));
score.play;
//score.write("~/Desktop/docvoice.wav".standardizePath,
//    options: ServerOptions.new.numOutputBusChannels_(1))
)

improvements in final version
  • eliminate need for Limiter
  • find more appropriate Resonz parameters
  • improve clarity of non-convoluted portions
  • improve consonant distortion
for kate (the actress)
  • hold vowels for emphasis in specific phrases
  • vary pacing
  • vary volume

No comments:

Post a Comment