1

私は、javascript フロント エンド、フラスコ サーバー、Microsoft の音声認識サービスを結び付けようとしています。

Microsoft のサーバーは、特定のパラメーターを持つオーディオ データを要求します。特に、16000 フレームレート\周波数を要求します。

しかし、Windows のブラウザーからは 41000 しか取得できません。現在、41000 でオーディオを取得し、次のように保存します。

audioData = message['audio']     
af = wave.open('audioData.wav', 'w')
af.setnchannels(1)
af.setparams((1, 2, 16000, 0, 'NONE', 'Uncompressed'))
af.writeframes(audioData)
af.close()

オーディオは、dict\json データの形式で socketio を介して受信されます。何も変更せずに直接保存すると、問題なく聞こえます。しかし、サンプル レートを 16000 に変更すると、明らかに歪んで非常に遅く聞こえるため、数秒のオーディオが 1 分程度に伸びます。

Python 3.4 でのサウンドに影響を与えずに、オーディオ レートを正しく変更するにはどうすればよいですか?

ありがとう。

編集: これが作業コードです:

with open("audioData_original.wav", 'wb') as of:
of.write(message['audio'])
audioFile = wave.open("audioData_original.wav", 'r')
n_frames = audioFile.getnframes()
audioData = audioFile.readframes(n_frames)
originalRate = audioFile.getframerate()
af = wave.open('audioData.wav', 'w')
af.setnchannels(1)
af.setparams((1, 2, 16000, 0, 'NONE', 'Uncompressed'))
converted = audioop.ratecv(audioData, 2, 1, originalRate, 16000, None)
af.writeframes(converted[0])
af.close()
audioFile.close()

ここでの欠点は、json を介して mediaRecorder Api からオーディオ データを取得しても、メモリ内にあることです...そして、ディスクに書き留めて、再度開き、wave の関数を使用してサンプリング レートを取得できるようにします。しかし、ディスクに書き込まずにどうすればよいでしょうか? ありがとう。そのために新しい質問をしなければならない場合は、確かにそれを行うことができます.

EDIT2: ああ、わかりました、私自身のフォローアップの質問に答えます-io.BytesIOトリックをしました.

4

1 に答える 1

2

(標準ライブラリにあります)を見audioop.ratecvてください。サンプルの生のフレーム (この場合はaudioData) を操作します。これは単純なアルゴリズムなので、音質の低下が予想されますが、音声については取るに足らないものだと思います。

于 2016-10-21T21:43:08.883 に答える