2016-10-21 30 views
0

J'essaye de lier ensemble front-end javascript, serveur flask et les services cognitifs de microsoft pour l'identification audio.Fréquence d'échantillonnage audio de l'onde Python

Le serveur de Microsoft demande des données audio avec des paramètres spécifiques, en particulier il demande 16000 framerate \ frequency.

Mais à partir du navigateur sur Windows, je ne peux obtenir 41000. Maintenant, je reçois audio à 41000, puis enregistrez comme ceci:

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() 

audio est reçu par socketio sous forme d'un dict \ données json. Si je l'enregistre directement sans rien changer, ça sonne bien. Mais si je change la fréquence d'échantillonnage à 16000, cela semble évidemment déformé et très lent, donc quelques secondes d'étirement audio dans une minute ou deux. Comment puis-je modifier correctement le débit audio sans affecter son son dans Python 3.4?

Merci.

EDIT: Voici le code de travail:

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() 

L'inconvénient est que, même si j'obtenir des données audio à partir mediaRecorder par Api JSON, donc je l'ai en mémoire ... Et je écrivez-le sur le disque, et ouvrez-le à nouveau pour pouvoir obtenir la fréquence d'échantillonnage en utilisant les fonctions d'onde. Mais comment puis-je le faire sans l'écrire sur le disque? Merci. Si je dois faire une nouvelle question pour cela, bien sûr, je peux le faire.

+0

Oh, d'accord, répondant à ma propre question de suivi - io.BytesIO a fait l'affaire. – Nix

Répondre

0

Jetez un oeil à audioop.ratecv (c'est dans la bibliothèque standard) Laissez agir sur les images brutes de votre échantillon (dans votre cas, audioData). C'est un algorithme simple, alors attendez-vous à une perte de qualité sonore, mais je suppose que le discours est insignifiant.

+0

J'ai été capable de le faire avec ce code, merci: – Nix

+0

avec open ("audioData_original.wav", 'wb') à partir de: 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, 'AUCUN', 'Non compressé')) converti = audioop.ratecv (audioData, 2, 1, originalRate, 16000, Aucun) af.writeframes (converti [0]) af.close() audioFichier.close() – Nix

+0

Mais il y a aussi une question de suivi sur la façon de lire des données audio dans un objet vague de la mémoire? Parce que je reçois de l'audio en json. Dans le code ci-dessus, j'écris des données sur un disque, le lit à partir du disque et le convertis en un nouveau fichier sous-échantillonné. Comment puis-je le faire sans écrire le fichier original sur le disque? – Nix