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ä.
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.
Kuten toisessa keskustelussa taisi käydä ilmi, minulla ei ole hajuakaan miten tämä säie tehdään tai mitä se tarkoittaa.
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.
Sekunnin hakemisella löytyi vaikkapa: http://www.wellho.net/solutions/python-python-threads-a-first-example.html
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.
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).
Näytätkö miten Tk:lla tämä onnistuu sitten? (Eli yksinkertaisesti toisessa tulostetaan jotain ja toiseen voi kirjoittaa jotain)
Voit aloittaa opettelun vaikka tästä. Älä pidä turhaa kiirettä. Tutoriaali vaikutti varsin kattavalta, voit oppia siitä paljon.
Kiitos, alan lukea tuota heti huomenna. Sitten kun olen huolella sen lukenut, kysyn uudeleen jos on vielä kysyttävää.
Aihe on jo aika vanha, joten et voi enää vastata siihen.