私は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)
私が言っていたように、デュレーションパラメータは結果に影響を与えるようにしたいです
コードを追加すると、正しく動作しなくても簡単です。 –
ありがとう、私はちょうどでした – AtActionPark