Si vous souhaitez utiliser uniquement HTML5, vous aurez besoin d'un navigateur implémentant le brouillon de Capture de média HTML (disponible ici) pour accéder aux données brutes du microphone.
Une fois que vous avez ces données en main, vous devez les envoyer via le réseau. Les Websockets seraient l'option HTML5 pour avoir des allers-retours suffisamment rapides avec le serveur (envoyer des données audio locales et recevoir des données audio distantes en même temps).
Comme vous mentionnez python, je vous recommanderais de jeter un œil à l'implémentation de websockets de twisted.
Vous pouvez faire en sorte que tous vos clients se "registrent" sur le serveur websocket avec un callerID, afin que le serveur sache où trouver un callerID donné.
Ensuite, votre serveur aura besoin d'une API "invite" où le caller1 "invite" le caller2.
Une fois l'appel mis en place et que chaque client commence à envoyer ses données audio, le serveur pourra envoyer ces données audio à l'autre partie.
À la réception des données audio, le navigateur devra jouer ces données audio sur les haut-parleurs, probablement en utilisant la balise audiotag HTML5.
Pour ce faire, vous pourriez être obligé d'utiliser une "astuce" : au lieu d'avoir le serveur websocket transmettre les données audio brutes au client, vous pourriez avoir besoin de simuler 2 fichiers "infinis" :
- caller1.wav : son capturé sur le microphone de caller1
- caller2.wav : son capturé sur le microphone de caller2
Le navigateur de caller1 ajouterait caller2.wav dans l'attribut audio.src une fois l'appel mis en place (caller1 serait informé de cet événement via websocket) et espérons que si le serveur python ajoute les données audio brutes au fichier caller2.wav au fur et à mesure de leur réception, cela commencerait à jouer.
Cela semble être un prototype cool que vous allez mettre en place !
Bonne chance dans votre aventure,
Jérôme Wagner