BlogDevelopers

Créer un preneur de notes de réunion sans bot

Enregistrez l'ordinateur, pas l'appel. Un guide pratique sur l'architecture, les API audio de chaque système et les étapes qui prennent plus de temps que prévu.

Reline Team12 min de lecture
Dans cet article
  1. Deux architectures : un bot dans l'appel, ou la capture sur l'ordinateur
  2. Comment marche la capture locale : deux flux, gardés séparés
  3. Transcription : streaming, canaux et la limite de la séparation des locuteurs
  4. Résumés : donnez au LLM la transcription entière
  5. Stockage, sécurité et consentement
  6. Le déroulé complet, étape par étape
  7. Ce qui prend plus de temps que prévu
  8. Ou utiliser un outil existant
  9. Sources

En bref : laissez de côté la plateforme de réunion et enregistrez l'ordinateur. Capturez deux flux locaux, le micro et le son système que joue l'appel (ScreenCaptureKit ou Core Audio taps sur macOS, loopback WASAPI sur Windows, un moniteur PulseAudio ou PipeWire sur Linux), envoyez-les à une API de transcription, puis résumez la transcription avec un LLM. Aucun participant ne rejoint l'appel.

Ce guide s'adresse aux développeurs qui veulent en construire un, ou comprendre ce que fait vraiment l'outil qu'ils paient. Il couvre les deux architectures, la capture locale sur chaque système d'exploitation et l'autorisation que chacun demande, puis la transcription, les résumés, le stockage et le consentement. Chaque API citée vient de la documentation de l'éditeur, listée à la fin et vérifiée le 2026-10-21.

Deux architectures : un bot dans l'appel, ou la capture sur l'ordinateur

Il y a deux façons d'obtenir l'audio d'une réunion. Un bot est un client côté serveur qui rejoint l'appel comme participant et reçoit les flux de la plateforme. La capture locale tourne sur l'ordinateur de la personne et enregistre ce que cet ordinateur entend déjà : le micro pour sa voix, la sortie système pour tous les autres. Une option intermédiaire plus récente est l'API média d'une plateforme, qui diffuse une réunion vers votre serveur, mais chacune ne couvre qu'une plateforme.

Bot qui rejoint l'appelAPI média de la plateformeCapture locale
Visible des participantsOui, comme participantSelon la plateforme (Meet affiche une demande de consentement)Non
Couvre Zoom, Meet et TeamsUne intégration par plateformeUne intégration par plateformeOui, on enregistre l'ordinateur, pas la plateforme
Où ça tourneSur vos serveursSur vos serveursSur l'ordinateur de la personne, plus votre backend
Séparation des voixSouvent fournie par la plateformeSouvent fournie par la plateformeVotre micro contre tout le reste, puis séparation des locuteurs
Coût principalUn serveur par réunion simultanée, validations de la plateformeCrédits ou inscription auprès de la plateformeUne app de bureau native par OS, demandes d’autorisation
Réunions en présentiel et appels dans d’autres appsNonNonOui, tout ce que l'ordinateur entend

Ce qu'implique la voie du bot aujourd'hui

  • Zoom : le Meeting SDK rejoint les réunions et donne un accès direct à l'audio et à la vidéo bruts sur les plateformes natives. Selon la doc de Zoom, à partir du 2 mars 2026, les apps qui rejoignent des réunions hors de leur propre compte doivent être autorisées par des jetons ZAK ou OBF, ou passer par RTMS.
  • Zoom RTMS (Realtime Media Streams) envoie l'audio, la vidéo et la transcription en direct à votre app sans bot participant, et fonctionne avec des crédits achetés à Zoom. Il ne couvre que Zoom.
  • Microsoft Teams : l'audio en temps réel exige un application-hosted media bot écrit en C# ou .NET, déployé en production sur Windows Server dans Azure, avec une adresse IP publique par instance de VM. Microsoft décrit encore sa plateforme média temps réel comme une developer preview.
  • Google Meet : la Meet Media API fournit audio, vidéo et données des participants en temps réel, mais elle est en Developer Preview et, selon la doc de Google, n'accepte plus de nouvelles inscriptions. Quelqu'un dans l'appel doit consentir, et les réunions chiffrées ou avec filigrane ne peuvent pas se connecter.

Rien de tout cela n'est faux. Ce sont trois intégrations avec trois circuits de validation, et les participants voient un bot ou une demande de consentement. Pour un seul chemin de capture identique sur toutes les plateformes, et valable aussi en présentiel ou pour un appel téléphonique sur ordinateur portable, on capture en local.

Comment marche la capture locale : deux flux, gardés séparés

Un preneur de notes local enregistre deux entrées à la fois : le micro (la personne) et un loopback de la sortie système (les autres, tels que l'app de réunion les joue). Gardez-les sur deux canaux le plus longtemps possible. Cette séparation donne gratuitement la distinction des voix, puisque tout ce qui passe par le micro est la personne. Elle compte aussi pour l'écho : selon la doc de Microsoft, le loopback WASAPI existe d'abord pour l'annulation d'écho acoustique. Si la personne écoute sur les haut-parleurs du portable, le micro entend aussi les voix distantes : appliquez une annulation d'écho au micro (dans un navigateur, la contrainte echoCancellation de getUserMedia), sinon chaque phrase distante apparaît deux fois dans la transcription.

macOS : ScreenCaptureKit ou Core Audio taps

  • ScreenCaptureKit diffuse le contenu de l'écran et l'audio. Passez capturesAudio à true dans SCStreamConfiguration (macOS 13 et plus) ; captureMicrophone ajoute le micro au même flux à partir de macOS 15. Il faut l'autorisation d'enregistrement de l'écran et une clé NSScreenCaptureUsageDescription dans Info.plist.
  • Les Core Audio taps (macOS 14.2 et plus) capturent l'audio sortant d'un processus, d'un groupe de processus ou de tout le système. Décrivez le tap avec CATapDescription, créez-le avec AudioHardwareCreateProcessTap, ajoutez-le à un périphérique agrégé créé avec AudioHardwareCreateAggregateDevice, puis lisez ce périphérique comme un micro.
  • Les taps exigent une clé NSAudioCaptureUsageDescription. La première fois que vous enregistrez depuis un périphérique agrégé contenant un tap, macOS demande l'autorisation d'enregistrer l'audio système. Elle se gère dans Réglages Système, Confidentialité et sécurité, Enregistrement de l'écran et de l'audio du système, où une app peut être autorisée pour l'audio seulement.
  • Le micro est une autorisation distincte, avec son propre texte d'explication. Prévoyez l'onboarding pour les deux demandes, et pour la personne qui a refusé une fois et n'entend plus rien.

Windows : loopback WASAPI

  • Ouvrez le point de terminaison de rendu (eRender au lieu de eCapture dans GetDefaultAudioEndpoint) et initialisez un flux de capture en mode partagé avec AUDCLNT_STREAMFLAGS_LOOPBACK. Les flux en mode exclusif ne peuvent pas fonctionner en loopback.
  • Le loopback contient tout le mixage joué sur ce point de terminaison, pas seulement l'app de réunion : sons de notification et musique se retrouvent aussi dans l'enregistrement.
  • Le loopback piloté par événements fonctionne à partir de Windows 10 version 1703 ; les versions antérieures demandent un contournement par flux de rendu que Microsoft documente.
  • Le process loopback (AUDIOCLIENT_ACTIVATION_TYPE_PROCESS_LOOPBACK via ActivateAudioInterfaceAsync) inclut ou exclut l'audio d'un processus et de ses enfants, par exemple pour écarter les sons de votre propre app. Il exige au minimum Windows 10 build 20348 : détectez la fonction et repliez-vous sinon sur le loopback du point de terminaison.
  • Un pilote audio de confiance ne laisse pas le loopback capturer les flux protégés par DRM. La doc loopback de Microsoft ne décrit aucune demande à l'utilisateur comparable à celle de macOS, ce qui rend votre propre indicateur d'enregistrement et votre parcours de consentement d'autant plus importants.

Linux : sources moniteur PulseAudio et PipeWire

  • Dans PulseAudio, chaque sortie (sink) possède une source moniteur qui porte ce que joue le sink. Enregistrez le moniteur du sink par défaut pour l'audio de l'appel, et la source par défaut pour le micro.
  • La plupart des distributions actuelles utilisent PipeWire avec pipewire-pulse, que la doc de PipeWire présente comme un remplaçant direct du démon PulseAudio : le code écrit pour l'API PulseAudio continue de fonctionner.
  • En natif dans PipeWire, un flux de capture lit les ports moniteur d'un sink quand vous définissez stream.capture.sink = true et pointez target.object vers le nom du sink, comme le montre la configuration d'exemple du module loopback.
  • Deux problèmes fréquents sur le terrain : une machine en ALSA pur sans serveur de son n'a aucun moniteur, et une sortie coupée peut livrer un moniteur plein de silence. Mesurez le niveau et prévenez la personne au lieu de transcrire du vide.

Dans le navigateur : getDisplayMedia, et l'audio seulement sous Chromium

  • navigator.mediaDevices.getDisplayMedia({ video: true, audio: true }) demande à la personne de choisir un écran, une fenêtre ou un onglet à partager. Il faut un contexte sécurisé et un geste de l'utilisateur, la demande revient à chaque appel, et l'autorisation ne peut pas être mémorisée.
  • Le piège, c'est l'audio. Les données de compatibilité de MDN indiquent la capture audio dans Chrome et Edge seulement ; Firefox et Safari ne capturent pas l'audio de cette façon. Dans Chrome, tout l'audio système peut être capturé en partageant l'écran entier sous Windows et ChromeOS, alors que sous macOS et Linux seul l'audio d'un onglet peut l'être.
  • Sur Mac, un preneur de notes dans le navigateur n'entend donc une réunion que si elle tourne dans un onglet Chrome ou Edge et que la personne partage cet onglet avec le son. Les apps de bureau Zoom ou Teams restent hors de portée.
  • Enregistrez le micro avec getUserMedia comme seconde piste. La demande de partage doit inclure la vidéo : ne gardez que la piste audio pour la transcription.

Transcription : streaming, canaux et la limite de la séparation des locuteurs

Envoyez l'audio à une API de transcription en streaming via un WebSocket pendant la réunion, pour que la transcription soit prête à la fin. Les API par lots sont plus simples et suffisent si personne n'a besoin du texte en direct. Ces choix comptent plus que le fournisseur :

  • Deux canaux en entrée, deux transcriptions en sortie. Transcrivez le micro et l'audio système séparément (ou en un seul flux multicanal si votre API le permet) et fusionnez-les par horodatage. C'est la séparation des voix la moins chère que vous trouverez.
  • La séparation des locuteurs donne des numéros, pas des noms. La doc de Deepgram, par exemple, renvoie un locuteur numéroté par mot (locuteur 0, locuteur 1) et laisse à votre app le soin de les relier à des personnes ; en streaming, il n'y a pas d'indice de confiance par mot. Pour les noms, il faut un second signal : le canal micro est la personne, l'invitation d'agenda liste les participants, et l'interface de l'app de réunion sait qui parle.
  • La séparation des locuteurs tourne sur le canal système, un signal mixé de toutes les voix distantes après le codec de la réunion. Attendez-vous à des locuteurs fusionnés quand deux personnes ont des voix proches ou parlent en même temps.
  • Langues : vérifiez la liste des langues et si la détection automatique fonctionne en cours de réunion. Une mauvaise indication de langue abîme plus une transcription qu'un modèle un peu moins bon.
  • Reconnexions : le réseau tombe. Gardez l'audio en tampon local et renvoyez-le à la reconnexion, sinon vous perdez la minute où la décision a été prise.

Résumés : donnez au LLM la transcription entière

  • Envoyez la transcription complète avec horodatages et étiquettes de locuteurs, pas un extrait raccourci. Les modèles actuels ont de grandes fenêtres de contexte ; ne découpez que si la réunion dépasse la fenêtre.
  • Demandez une structure vérifiable : décisions, actions avec responsable et date, questions ouvertes. Chaque point doit pouvoir être relié à un horodatage.
  • Gardez la transcription et l'audio à côté du résumé. Un résumé de LLM peut affirmer une chose que personne n'a dite ; la solution est une vérification rapide, pas la confiance dans le modèle.
  • Générez le résumé après la réunion, et marquez-le comme périmé quand quelqu'un modifie la transcription.

Stockage, sécurité et consentement

  • L'audio et les transcriptions sont des données personnelles. Chiffrez-les au repos, rendez les notes privées par défaut et fixez la durée de conservation avant le lancement, y compris la façon dont une personne supprime un enregistrement.
  • Si vous avez des utilisateurs dans l'UE, sachez où sont stockés l'audio et les transcriptions et quels sous-traitants (transcription, LLM) y accèdent, et indiquez-le dans votre politique de confidentialité.
  • Sans bot, personne n'est annoncé. Affichez un indicateur d'enregistrement clair, rappelez à la personne de prévenir les participants, et proposez une phrase d'information à coller dans le chat de la réunion. Plusieurs États américains exigent le consentement de toutes les parties et beaucoup de pays ont leurs propres règles. Ceci n'est pas un conseil juridique.
  • Ne présentez pas la capture locale comme un traitement local. Si l'audio part vers une API de transcription dans le cloud, dites-le.

Le déroulé complet, étape par étape

  1. Détectez une réunion (un événement d'agenda qui commence, ou une app de réunion qui utilise le micro), ou laissez la personne lancer l'enregistrement.
  2. Demandez la première fois l'autorisation pour le micro et l'audio système, en expliquant pourquoi en une phrase.
  3. Lancez deux captures : micro et loopback système. Mesurez les deux niveaux et prévenez si l'un reste muet plus de quelques secondes.
  4. Convertissez l'audio au format attendu par votre fournisseur de transcription (fréquence d'échantillonnage et encodage sont dans sa doc) et diffusez-le, avec un tampon local pour les reconnexions.
  5. Affichez la transcription en direct : fusionnez les deux canaux par horodatage et étiquetez le canal micro comme la personne elle-même.
  6. À l'arrêt, videz les tampons, fermez le flux et stockez l'audio avec la transcription finale.
  7. Envoyez toute la transcription au LLM pour le résumé et les actions, et stockez-les avec des renvois vers les horodatages.
  8. Exposez le résultat : une interface, une API, des webhooks ou un serveur MCP pour que les assistants IA puissent le lire.

Ce qui prend plus de temps que prévu

  • Le parcours d'autorisations sur macOS, et les personnes qui ont refusé une fois.
  • Les changements de périphérique en plein appel : casque branché, Bluetooth qui bascule en profil casque-micro, sortie par défaut qui change.
  • La signature de code et la notarisation des installateurs macOS et Windows, plus les mises à jour automatiques.
  • La mise en veille, l'écran rabattu et les réunions de deux heures, plus la consommation de disque et de mémoire sur un long appel.
  • L'écho sur les haut-parleurs du portable, et le silence quand la sortie est coupée.

Ou utiliser un outil existant

Si vous avez besoin de notes de réunion plutôt que d'un projet de preneur de notes, Reline (reline.so) applique déjà cette architecture. Son app de bureau pour macOS, Windows et Linux (bêta) enregistre le micro et l'audio système en local, sans bot dans l'appel, et l'app web capture l'audio de l'appel dans Chrome ou Edge sur ordinateur via l'audio du partage d'écran. La transcription (plus de 60 langues), les résumés IA et le stockage tournent dans le cloud : sans bot, mais pas sur l'appareil.

Pour les développeurs qui veulent les données plutôt que l'app : Reline fait tourner un serveur MCP à l'adresse https://mcp.reline.so/mcp, qui permet à Claude, ChatGPT, Cursor et d'autres clients de chercher dans les notes, lire transcriptions et actions, et créer des notes, avec une connexion OAuth ou une clé API de l'espace de travail. Des webhooks signés se déclenchent sur six événements, comme note.created, note.summarized et action_items.extracted, avec une signature HMAC-SHA256 calculée sur l'horodatage et le corps brut.

Sources

  • Apple, Capturing system audio with Core Audio taps: https://developer.apple.com/documentation/coreaudio/capturing-system-audio-with-core-audio-taps
  • Apple, ScreenCaptureKit: https://developer.apple.com/documentation/screencapturekit
  • Apple Support, Control access to screen and system audio recording on Mac: https://support.apple.com/guide/mac-help/mchld6aa7d23/mac
  • Microsoft, Loopback Recording (WASAPI): https://learn.microsoft.com/windows/win32/coreaudio/loopback-recording
  • Microsoft, AUDIOCLIENT_ACTIVATION_TYPE: https://learn.microsoft.com/windows/win32/api/audioclientactivationparams/ne-audioclientactivationparams-audioclient_activation_type
  • Microsoft, Build application-hosted media bots (Teams): https://learn.microsoft.com/microsoftteams/platform/bots/calls-and-meetings/requirements-considerations-application-hosted-media-bots
  • MDN, MediaDevices.getDisplayMedia(): https://developer.mozilla.org/docs/Web/API/MediaDevices/getDisplayMedia
  • PulseAudio, pa_sink_info (monitor_source): https://freedesktop.org/software/pulseaudio/doxygen/structpa__sink__info.html
  • PipeWire, pipewire-pulse: https://docs.pipewire.org/page_man_pipewire-pulse_1.html
  • PipeWire, Loopback module: https://docs.pipewire.org/page_module_loopback.html
  • Zoom, Meeting SDK: https://developers.zoom.us/docs/meeting-sdk/
  • Zoom, Realtime Media Streams (RTMS): https://developers.zoom.us/docs/rtms/
  • Google, Meet Media API overview: https://developers.google.com/workspace/meet/media-api/guides/overview
  • Deepgram documentation (speaker labels per word): https://developers.deepgram.com/docs
FAQ

Questions fréquentes

Peut-on enregistrer une réunion sans qu'un bot la rejoigne ?
Oui. Capturez en local : enregistrez le micro et l'audio système sur l'ordinateur de la personne, puis transcrivez. Aucun participant ne rejoint l'appel, quelle que soit la plateforme. Les personnes présentes doivent tout de même savoir que vous enregistrez.
Comment capturer l'audio système sur Mac pour un preneur de notes ?
Avec les Core Audio taps à partir de macOS 14.2 (CATapDescription, AudioHardwareCreateProcessTap, un périphérique agrégé et une clé NSAudioCaptureUsageDescription), ou avec ScreenCaptureKit et capturesAudio à partir de macOS 13. Les deux s'autorisent dans Confidentialité et sécurité, Enregistrement de l'écran et de l'audio du système.
Une app web ou une extension de navigateur peut-elle enregistrer l'audio d'une réunion ?
Seulement dans les navigateurs Chromium. getDisplayMedia renvoie de l'audio dans Chrome et Edge : sous macOS et Linux seulement celui d'un onglet, sous Windows et ChromeOS tout l'audio système quand on partage l'écran entier. Firefox et Safari ne capturent pas l'audio de cette façon.
Comment obtenir le nom des intervenants sans bot ?
La séparation des locuteurs renvoie des locuteurs numérotés, pas des noms. Combinez les signaux : le canal micro est la personne, l'invitation d'agenda liste les participants, et l'interface de la réunion montre qui parle. Sans eux, vous obtenez Locuteur 1 et Locuteur 2.
Est-il légal d’enregistrer une réunion sans bot ?
La question juridique n'est pas le bot mais le consentement. Prévenez les participants et respectez le droit applicable : plusieurs États américains exigent le consentement de toutes les parties et d'autres pays ont leurs propres règles. Ceci n'est pas un conseil juridique.
Faut-il construire son preneur de notes ou en utiliser un existant ?
Construisez-le si la capture est votre produit. Si vous avez seulement besoin des notes dans vos propres outils, prenez un preneur de notes sans bot existant avec une API : Reline, par exemple, expose notes et transcriptions via un serveur MCP et des webhooks signés.
Prêt quand vous l'êtes

Arrêtez de prendre des notes.Commencez à livrer des résultats.

Gratuit à vie pour les particuliers. Cinq minutes pour installer. Votre prochaine réunion rédige ses propres notes.