2016-04-27 6 views
3

私はjavascriptプログラムを作っています。Javascript - ピッチとデュレーションコントロール付きのテキスト読み上げ

私は最初にWeb音声のapiを見ましたが、ピッチコントロールは非常に限られているようですので、結果をWebオーディオノードに送信し、そこからエフェクトを適用する方法があると思われましたが、可能。

私はmespeak.jsライブラリを見つけました:http://www.masswerk.at/mespeak/

それはより多くの制御を可能に、私は私のオーディオ・ノードのソースとして扱いますオーディオバッファを返すことができます。

私の入力は音符のシーケンスで、周波数と継続時間があります。ような何か:

var seq = [[440hz,1000ms],[880hz,500ms],...]; 

私は、異なる周波数とリズムでそれらの単語を言って私のプログラムには、このシーケンスと一連の単語から

を得ることができた。しかし、私はいくつかの問題を抱えています。

  • ウェブオーディオのデチューンはplaybackRateにリンクされています。そのため、ピッチングは単語の期間を変更します。
  • 私は、detuneまたはplaybackRateの値で再生できるように見えますが、周波数を入力してその周波数で結果を得ることはできません。私ができる唯一のことは、私のスピーチの基本周波数に近似し、それに応じて予想される音符とピッチの差を計算しますが、その結果はあまり良くありません。
  • 期間をどのように処理するかについては私には分かりません。 playbackRateは単語の期間を人為的に変更する唯一の方法ですか?私の言葉を特定の期間に強制的に広げることができますか?

あなたのいずれかがこの種のものについて何か経験を持っていれば、私は入力を感謝します。

どうもありがとう

EDIT:私のシーケンサーが動作しているいくつかのコード

function sing(text,note,duration){ 
    var buffer = meSpeak.speak(text,{rawdata:'default'}); 
    playSound(buffer,freqToCents(note),duration) 
} 

function freqToCents(freq){ 
    var root = 440 //no idea what is the base frequency of the speech generator 
    return 3986*Math.log10(freq/440) 
} 

function playSound(streamBuffer, cents, duration, callback) { 
    var source = context.createBufferSource(); 
    source.connect(compressor); 

    context.decodeAudioData(streamBuffer, function(audioData) { 
    var duration = audioData.duration; 
    var delay = (duration)? Math.ceil(duration * 1000) : 1000; 
    setTimeout(callback, delay); 
    source.buffer = audioData; 
    source.detune.value = cents; 

    source.start(0); 
    }, function(error) { }); 
} 

を追加し、各段階で、このような例のために、必要に応じて機能を歌う呼び出します。

sing('test', 440, 1000) 

私が言っていたように、デュレーションパラメータは結果に影響を与えるようにしたいです

+1

コードを追加すると、正しく動作しなくても簡単です。 –

+1

ありがとう、私はちょうどでした – AtActionPark

答えて

1

Espeak supports SSML modeの場合、結果を後処理するのではなく、パラメータを変更するために使用する必要があります。

まず、espeakで遊んでから、javascriptポートで同じ結果を再現する必要があります。それはまだサポートされていませんが、mespeak.js

'-w', 'wav.wav', 
     '-a', (typeof args.amplitude !== 'undefined')? String(args.amplitude) : (typeof args.a !== 'undefined')? String(args.a) : '1 
     '-g', (typeof args.wordgap !== 'undefined')? String(args.wordgap) : (typeof args.g !== 'undefined')? String(args.g) : '0', 
     '-p', (typeof args.pitch !== 'undefined')? String(args.pitch) : (typeof args.p !== 'undefined')? String(args.p) : '50', 
     '-s', (typeof args.speed !== 'undefined')? String(args.speed) : (typeof args.s !== 'undefined')? String(args.s) : '175', 

で、この部分では、SSMLを有効にするには -mオプションを追加する必要があります。

+0

ありがとう。私は今それで遊んでいる。ピッチはかなり限られているようですが、私が推測するボコーダーを使用しない限り、それはしなければならないでしょう。 – AtActionPark

+0

espeakは内部でボコーダーなので、任意のピッチを許可する必要があります。 –

関連する問題