Enregistrement du son JS Ă  partir d'un microphone ou des commentaires vocaux

Enregistrement du son JS Ă  partir d'un microphone ou des commentaires vocaux


Il n'y a pas longtemps, lors du dĂ©veloppement d'une application web d'entreprise, le client souhaitait pouvoir laisser des commentaires vocaux. Auparavant, je n'Ă©tais pas venu pour rencontrer la crĂ©ation de contenu mĂ©diatique et j'ai commencĂ© Ă  Ă©tudier ce sujet avec intĂ©rĂȘt.

Le rĂ©seau a fourni suffisamment d'informations gĂ©nĂ©rales sur le sujet de la crĂ©ation et du traitement de ce type de contenu, mais je n'ai pas trouvĂ© d'exemple simple et pleinement fonctionnel. AprĂšs la mise en Ɠuvre de la tĂąche par le client, j'ai dĂ©cidĂ© de publier l'exemple le plus simplifiĂ© d'enregistrement et de sauvegarde des commentaires vocaux et d'Ă©crire un article. Peut-ĂȘtre que ce matĂ©riel sera utile Ă  quelqu'un et aidera dans l'Ă©tude.

ÉnoncĂ© du problĂšme


Nous nous sommes donnĂ© pour tĂąche de dĂ©velopper une mini-application s'exĂ©cutant dans un navigateur qui vous permettra d'enregistrer un commentaire vocal, d'envoyer un enregistrement au serveur, le serveur sauvegardera l'enregistrement, en cas de succĂšs, il renverra une rĂ©ponse avec le nom du fichier crĂ©Ă© et affichera l'objet sur la page afin que l'enregistrement puisse ĂȘtre Ă©coutĂ©.

Enregistrer le son dans le navigateur


L'enregistrement sonore a Ă©tĂ© dĂ©cidĂ© d'ĂȘtre mis en Ɠuvre Ă  l'aide de l'API Web MediaStream Recording. Pour l'enregistrement, nous utilisons l'interface MediaRecorder (). Mais d'abord, crĂ©ez une interface. Ayons index.html contenant uniquement les balises les plus Ă©lĂ©mentaires, et dans le corps de la balise nous inclurons un fichier avec notre futur JavaScript voice.js:

<!DOCTYPE html> <head> <meta charset="UTF-8"> <title>Voice comments</title> </head> <body> <script src="voice.js"></script> </body> </html> 

CrĂ©ez un fichier voice.js, dĂ©finissez-y une constante d'URL qui contiendra un lien vers un script qui reçoit le son enregistrĂ©. Ensuite, crĂ©ez les boutons DĂ©marrer et ArrĂȘter pour dĂ©marrer et arrĂȘter l'enregistrement sonore, ainsi que le bloc div dans lequel les enregistrements sauvegardĂ©s seront affichĂ©s. Sur ce notre interface est prĂȘte, vous pouvez procĂ©der directement Ă  l'enregistrement sonore.

Comme déjà mentionné pour l'enregistrement, nous utiliserons l'interface MediaRecorder () (pour plus d'informations sur l'interface, voir la documentation), pour son fonctionnement, il est nécessaire de déterminer le flux multimédia à partir duquel nous prendrons le son, initialisez-le uniquement car nous n'avons besoin que d'une piste audio.

 navigator.mediaDevices.getUserMedia({ audio: true}) .then(stream => { const mediaRecorder = new MediaRecorder(stream)}); 

Nous avons maintenant la constante mediaRecorder, qui contient une instance de l'interface, et nous continuerons Ă  travailler avec.

Pour dĂ©marrer l'enregistrement, nous devons appeler la mĂ©thode MediaRecorder.start (), pour arrĂȘter l'enregistrement, la mĂ©thode MediaRecorder.stop (). Dans ce cas, MediaRecorder.stop () gĂ©nĂšre un Ă©vĂ©nement disponible pour les donnĂ©es par lequel nous avons accĂšs Ă  l'enregistrement sonore numĂ©risĂ© sous la forme d'un tableau binaire.

Et donc nous allons décrire les événements ci-dessus, déclarer le tableau voice [] et y écrire les données reçues:

 navigator.mediaDevices.getUserMedia({ audio: true}) .then(stream => { const mediaRecorder = new MediaRecorder(stream); let voice = []; document.querySelector('#start').addEventListener('click', function(){ mediaRecorder.start(); }); mediaRecorder.addEventListener("dataavailable",function(event) { voice.push(event.data); }); document.querySelector('#stop').addEventListener('click', function(){ mediaRecorder.stop(); }); }); 

Nous allons maintenant prĂ©parer les donnĂ©es reçues pour l'envoi. Pour ce faire, par l'Ă©vĂ©nement d'arrĂȘt, crĂ©ez une instance BLOB, placez-y les donnĂ©es reçues et spĂ©cifiez le type de donnĂ©es MIME. Dans notre cas, ce sera audio / wav.

 mediaRecorder.addEventListener("stop", function() { const voiceBlob = new Blob(voice, { type: 'audio/wav' }); 

En conséquence, nous avons la constante voiceBlob dans laquelle se trouve le contenu de notre futur fichier wav avec l'enregistrement d'un message vocal.

Envoi d'un enregistrement au serveur


Pour envoyer un enregistrement au serveur, j'ai dĂ©cidĂ© d'utiliser la mĂ©thode fetch (). Étant donnĂ© que cette mĂ©thode est la plus moderne et fournit une interface amĂ©liorĂ©e pour faire des requĂȘtes au serveur. Dans le cadre de notre tĂąche, nous devons lancer une requĂȘte POST dans le corps de laquelle envoyer le contenu de notre futur fichier pour sauvegarde sur le serveur (comment fonctionne la mĂ©thode fetch () et quelles fonctionnalitĂ©s peuvent ĂȘtre trouvĂ©es dans la documentation en dĂ©tail). CrĂ©ez un nouveau formulaire avec le champ vocal et mettez-y le contenu de notre dossier.

 let fd = new FormData(); fd.append('voice', voiceBlob); 

Nous créons une fonction asynchrone pour envoyer un message au serveur pour recevoir une réponse et afficher un objet audio pour lire un fichier déjà enregistré. En argument, la fonction prendra la forme créée ci-dessus.

Nous initions une demande de serveur:

 let promise = await fetch(URL, { method: 'POST', body: form}); 

Si la réponse HTTP du serveur ne contient pas de code d'erreur (le code de réponse est compris entre 200 et 299), il nous reste à décoder la réponse, à créer un nouvel objet audio sur la page, à déterminer ses propriétés et à l'afficher. La façon dont la réponse est formée sera discutée ci-dessous.

Enregistrement d'un fichier sur le serveur


CrĂ©ons un script sur le serveur qui recevra notre requĂȘte POST avec un message vocal. Étant donnĂ© que l'enregistrement sonore que nous avons envoyĂ© est essentiellement dĂ©jĂ  un fichier dans le formulaire, nous le recevrons sur le serveur en consĂ©quence:

 $uploadDir = 'voice/'; $typeFile = explode('/', $_FILES['voice']['type']); $uploadFile = $uploadDir . basename(md5($_FILES['voice']['tmp_name'].time()).'.'.$typeFile[1]); if (move_uploaded_file($_FILES['voice']['tmp_name'], $uploadFile)) { $response = ['result'=>'OK', 'data'=>'../'.$uploadFile]; } else { $response = ['result'=>'ERROR', 'data'=>'']; } echo json_encode($response); 

Vous pouvez trouver de nombreux exemples similaires de code PHP, traitant des fichiers reçus sur le réseau. Tout d'abord, initialisez les variables, $ uploadDir - le répertoire dans lequel le fichier reçu sera enregistré, le type de fichier & typeFile dans notre cas sera égal à wav et le nom de fichier complet, y compris le répertoire. Le nom de fichier dans ce cas est formé en combinant le nom de fichier "temporaire" et la valeur de chaßne de l'heure actuelle chiffrée à l'aide de la méthode md5. Si vous enregistrez avec succÚs le fichier avec un message vocal dans le répertoire spécifié, nous formons une réponse sous la forme d'un tableau contenant le champ de résultat égal à "OK" ou "ERREUR" selon le résultat et le champ "données" qui, en cas de traitement réussi, contient un lien vers le fichier enregistré.

Pour plus de commodité, nous transformons le tableau en objet JSON et l'envoyons comme réponse.

L'exemple de code complet est disponible sur GitHub .

PS Le navigateur vous permet d'enregistrer du contenu multimédia uniquement avec une connexion HTTPS sécurisée.

Source: https://habr.com/ru/post/fr484196/


All Articles