UDP_Client_v1.py 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. # -*-coding:Latin-1 -*
  2. """fonction client du chat vocal"""
  3. import socket
  4. import wave
  5. import audioop
  6. import time
  7. #modules complémentaires
  8. import pyaudio
  9. connecte = False
  10. port = 6660
  11. #host=raw_input("Ip: ")
  12. host="localhost"
  13. #demarrage de pyaudio et parametrage
  14. p = pyaudio.PyAudio()
  15. frequence = 22050
  16. frames = 512
  17. #attention! en 16bits(?), le nombre de bits envoyees vaut le double du
  18. #nombre de frames utilisé pour récupérer les donnees sonores
  19. #amalgame des donnees sonores recues (pour enregistrement sur wav)
  20. framesR=[]
  21. #creation du socket udp
  22. s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
  23. #creation des flux audio
  24. emission = p.open(format=pyaudio.paInt16,
  25. channels=1,
  26. rate=frequence,
  27. input = True,
  28. frames_per_buffer=frames)
  29. reception = p.open(format=p.get_format_from_width(2),
  30. channels=1,
  31. rate=frequence,
  32. output=True,
  33. frames_per_buffer=frames)
  34. #t_debut = time.time() #pour test
  35. while True:
  36. #on attend la connexion au serveur
  37. try:
  38. s.sendto(b"", (host, port))
  39. print(s.recvfrom(frames))
  40. connecte = True
  41. break
  42. except:
  43. pass
  44. while connecte:
  45. #while time.time() - t_debut < 10: #pour test
  46. #print(time.time() - t_debut)
  47. try:
  48. #on recupere le flux audio
  49. for i in range(0, int(frequence/frames*0.5)):
  50. #on recupere la donnee du flux d'emission
  51. data = emission.read(frames)
  52. #on envoie au serveur
  53. s.sendto(data, (host, port))
  54. #print("{}\n".format(len(data)))
  55. #on receptionne la reponse
  56. recu, adresse = s.recvfrom(1024)
  57. #on la transmet au flux audio de reception
  58. reception.write(recu)
  59. #pour enregistrer la reception (deboguage):
  60. framesR.append(recu)
  61. except OSError:
  62. #on attend la connexion au serveur
  63. connecte = False
  64. if raw_input("Connexion au serveur perdue - Tenter de reconnecter? (o/n)") == "o":
  65. while not connecte:
  66. #on attend la connexion au serveur
  67. try:
  68. s.sendto(b"", (host, port))
  69. print(s.recvfrom(frames))
  70. connecte = True
  71. except:
  72. pass
  73. except KeyboardInterrupt:
  74. connecte = False
  75. #on enregistre dans 'reception.wav'
  76. try:
  77. #on enregistre les donnees recues dans un fichier .wav
  78. wf = wave.open("reception.wav", 'wb')
  79. wf.setnchannels(1)
  80. wf.setsampwidth(p.get_sample_size(pyaudio.paInt16))
  81. wf.setframerate(frequence)
  82. wf.writeframes(b''.join(framesR))
  83. wf.close()
  84. except:
  85. print("reception: enregistrement impossible")
  86. print("*Fin de la communication\n")
  87. emission.close()
  88. reception.close()
  89. p.terminate()
  90. s.close()