Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: Python, äänen lähettäminen

Sivun loppuun

Macro [13.11.2009 17:31:02]

#

Terve!

Koitin etsiä Googlella, että miten Pythonilla saisin ääntä otettua tietokoneen mikrofonista, ja lähetettyä sitä reaaliaikaisesti serverille. Hakusanani oliviat "Python audio socket", jotka eivät tuottaneet tulosta.

Ohjelma saisi toimia siten, että kummallakin puolella pystytään puhumaan, ja ääni kulkee edestakaisin - kuten puhelinkin. Ohjelmaan tulisi myös toiminto, jolla voidaan kirjoitella toiselle. Jotkut varmaan jo arvaavatkin mitä syntyy näistä. Olen tehnyt ohjelman, jolla voi lähettää yhteen paikkaan jotain, mutta serveripuoli on jumissa koko ajan. Ohjelman tulisi toimia niin, että se ei odota toiselta mitään, vaan toimii normaalisti (Siis ei jää jumiin).

Tästä tulisi jokin messengerin kaltainen viritelmä, jos se siis onnistuu.
Aluksi pitäisi toteuttaa kaikkein oleellisin asia: Että kummatkin osapuolet voivat lähettää viestejä, ja kumpikaan ei olisi jumissa. Tämä täytyy varmaan toteuttaa ns. "kahdessa ikkunassa", eli toinen vastaanottaa ja tulostaa, toinen kysyy ja lähettää. Kuitenkin ne eivät saisi olla "kahdessa ikkunassa", vaan käyttäjälle ne näytettäisiin yhtenä.

jalski [13.11.2009 17:54:27]

#

Macro kirjoitti:

Aluksi pitäisi toteuttaa kaikkein oleellisin asia: Että kummatkin osapuolet voivat lähettää viestejä, ja kumpikaan ei olisi jumissa. Tämä täytyy varmaan toteuttaa ns. "kahdessa ikkunassa", eli toinen vastaanottaa ja tulostaa, toinen kysyy ja lähettää. Kuitenkin ne eivät saisi olla "kahdessa ikkunassa", vaan käyttäjälle ne näytettäisiin yhtenä.

Toteuta viestien lähetys -ja vastaanotto omissa säikeissään.

Macro [13.11.2009 17:59:35]

#

Kuten toisessa keskustelussa taisi käydä ilmi, minulla ei ole hajuakaan miten tämä säie tehdään tai mitä se tarkoittaa.

Metabolix [13.11.2009 18:05:42]

#

Kannattaa jakaa homma palasiin. Äänen lähettäminen ei sinänsä eroa muunkaan datan lähettämisestä, mutta lisäksi tosiaan tarvitset välineet äänen nauhoittamiseen ja soittamiseen sekä pakkaamiseen ja purkamiseen, koska pakkamaton ääni vaatii aika paljon tiedonsiirtokapasiteettia.

"Python record audio" (tai sound) johtaa mm. pyAudio-kirjaston sivuille.

"Python audio codec" tuottaa tulokseksi mm. pySpeex-kirjaston.

Vinkkejä pakkausformaateista voi lueskella myös erilaisten vapaan lähdekoodin keskusteluohjelmien sivuilta, usein siellä kerrotaan selvästi, mitä kyseinen ohjelma käyttää. Toinen juttu onkin sitten, mitä kirjastoja Pythonille löytyy.

Voit asettaa socketille tietyn timeoutin. Jos recv ei saa siinä ajassa dataa, tulee virhe. Tarvitset siis recv-kutsun ympärille try-lohkon.

s.settimeout(0) # Odotetaan enintään 0 sekuntia, eli ei odoteta.
try:
  data = s.recv(4096)
except socket.timeout:
  # Ei saatu dataa.

Säikeet eivät minusta ole paras ratkaisu ainakaan aloittelijalle, koska niiden kanssa tulee helposti synkronointiongelmia.

jalski [13.11.2009 18:06:07]

#

Sekunnin hakemisella löytyi vaikkapa: http://www.wellho.net/solutions/python-python-threads-a-first-example.html

Macro [13.11.2009 18:22:13]

#

Jos tuo metabolixin koodi on while True-silmukan sisällä, niin silloin se tekee sen jokaisella kierroksella oikein. Mutta, jos tuonne except-lohkoon laittaa raw_input-kyselyn, niin se jää tähän kunnes viesti on kirjoitettu. Tästä seuraisi se, että viestejä voitaisiin lähetellä vain vuorotellen.

Metabolix [13.11.2009 18:25:24]

#

Jos käytät yhä raw_inputia tekstin lukemiseen, säikeet ovat ainoa vaihtoehto. Ajattelin, että lukisit syötteet Tk:lla (tai miksei muullakin kirjastolla).

Macro [13.11.2009 19:50:22]

#

Näytätkö miten Tk:lla tämä onnistuu sitten? (Eli yksinkertaisesti toisessa tulostetaan jotain ja toiseen voi kirjoittaa jotain)

Metabolix [13.11.2009 20:03:11]

#

Voit aloittaa opettelun vaikka tästä. Älä pidä turhaa kiirettä. Tutoriaali vaikutti varsin kattavalta, voit oppia siitä paljon.

Macro [13.11.2009 20:07:21]

#

Kiitos, alan lukea tuota heti huomenna. Sitten kun olen huolella sen lukenut, kysyn uudeleen jos on vielä kysyttävää.


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta