1

Objective-C を使用して、録音したオーディオ ファイルにエコー効果を追加するアプリケーションを開発しています。

私は DIRAC を使用して、男性から女性へ、遅い、速いなど、他の効果を追加しています。

今度は録音した声でロボットの声を作らなければなりません。ロボットの声の場合、エコー効果を追加する必要があります

これを行うのを手伝ってください

4

1 に答える 1

2

エコーはとてもシンプルです。遅延線と少しの乗算が必要です。1 つのチャンネルとオーディオが既に浮動小数点で表現されていると仮定すると、遅延線は次のようになります (C に似た疑似コード):

int LENGTH = samplerate * seconds; //seconds is the desired length of the delay in seconds
float buffer[ LENGTH ];
int readIndex = 0, writeIndex = LENGTH - 1;

float delayLine.readNext( float x ) {
    float ret = buffer[readIndex];
    ++readIndex;
    if( readIndex >= LENGTH )
        readIndex = 0;
    return ret;
}
void delayLine.writeNext( float x ) {
    buffer[ writeIndex ] = x;
    ++writeIndex;
    if( writeIndex >= LENGTH )
        writeIndex = 0;
}

バッファをすべてゼロに初期化することを忘れないでください。

それがあなたの遅延線です。基本的な使用法は次のとおりです。

float singleDelay( float x ) {
    delayLine.writeNext(x);
    return delayLine.readNext( x );
}

しかし、大きな違いは聞こえません。後で出てくるだけです。単一のエコーを聞きたい場合は、次のようなものが必要です。

float singleEcho( float x, float g ) {
    delayLine.writeNext(x);
    return x + g * delayLine.readNext( x );
}

ここで、g は定数で、通常は 0 から 1 の間です。

ここで、エコーのストリームが必要だとします。「HELLO... Hello... hello... h...」のように。もう少し作業を行う必要があります。

float echo( float x, float g ) {
   float ret = x + g * delayLine.readNext( x );
   delayLine.writeNext( ret );
   return ret;
}

今回は、入力ではなく、全体の出力が遅延ラインにフィードバックされていることに注意してください。この場合、|g| が非常に重要です。< 1.

ここで非正規化の問題が発生する可能性があります。それが iOS の問題かどうかは思い出せませんが、そうは思いません。

于 2012-08-03T22:59:43.833 に答える