"ANDROID - Media Framework (Audio,Video), Telephony APIs(SMS/MMS), Speech Synthesis & Recognition" inż. Michal Bulba, Mateusz Kuszczak, Piotr Gudas. Opiekun dr Marek Piasecki
Media Framework Audio/Video Piotr Gudas EMIF EiT rok III
Plan prezentacji Obsługiwane pliki multimedialne Odtwarzanie audio Nagrywanie audio Odtwarzanie video Nagrywanie video Wyświetlanie zdjęć
Obsługiwane formaty (1) Audio 3GPP MPEG-4 FLAC (Android 3.1+) MP3 Ogg kodek MIDI
Obsługiwane formaty (2) Video 3GPP MPEG-4 MPEG-TS WebM (Android 2.3.3+)
Obsługiwane formaty (3) Obrazy JPEG GIF PNG BMP
Zalecenia kodowania video public class CamcorderProfile extends Object
Obsługiwane protokoły sieciowe RTSP (RTP, SDP) HTTP progressive streaming HTTP live streaming draft protocol (Android 3.0 +) Więcej na: http://developer.android.com/guide/appendix/media-formats.html
Odtwarzanie audio/video Aby aplikacja mogła obsługiwać pliki audio/video używamy klasy: public class MediaPlayer extends Object
MediaPlayer: diagram statusu (1) opcja 1 MediaPlayer mp = MediaPlayer.create( context, R.raw.song); mp.start(); opcja 2 MediaPlayer mp; mp = new MediaPlayer(); mp.setdatasource(uri/path); mp.prepare(); mp.start();
MediaPlayer: diagram statusu (2) mp.pause(); mp.stop(); mp.seekto(time); mp.reset(); mp.relese();
Wybrane metody klasy MediaPlayer dla audio (1) public void prepareasync () public int getduration () public int getcurrentposition () public void seekto (int msec) public void setlooping (boolean looping) public boolean islooping ()
Wybrane metody klasy MediaPlayer dla audio (2) public boolean isplaying () public void setvolume (float leftvolume, float rightvolume) public void setwakemode (Context context, int mode) Więcej na: http://developer.android.com/reference/android/media/mediaplayer.html
Nagrywanie audio/video Klasa MediaRecorder posłuży nam do nagrywania plików multimedialnych. public class MediaRecorder extends Object
Nagrywanie audio (1) Utworzenie nowej instancji android.media.mediarecorder mrecorder = new MediaRecorder(); Ustawić ścieżkę za pomocą MediaRecorder.setAudioSource() mrecorder.setaudiosource( ); MediaRecorder.AudioSource.MIC
Nagrywanie audio (2) Ustawić format pliku wyjściowego MediaRecorder.setOutputFormat() mrecorder.setoutputformat( MediaRecorder.OutputFormat.THREE_GPP); Ustawić nazwę utworzonego pliku MediaRecorder.setOutputFile() mrecorder.setoutputfile(srcpath);
Nagrywanie audio (3) Ustawić koder MediaRecorder.setAudioEncoder() mrecorder.setaudioencoder( MediaRecorder.AudioEncoder.AMR_NB); Wywołanie funkcji MediaRecorder.prepare() mrecorder.prepare();
Nagrywanie audio (4) Włączamy nagrywanie MediaRecorder.start() mrecorder.start(); Zatrzymujemy nagrywanie MediaRecorder.stop() mrecorder.stop();
Nagrywanie audio (5) Kończenie pracy MediaRecorder.release() mrecorder.release(); mrecorder = null;
Dostęp do karty pamięci <uses-permission android:name="android.permission.write_external_storage" /> <uses-permission android:name="android.permission.record_audio" /> srcpath = Environment.getExternalStorageDirectory().getAbsolutePath(); scrpath+= "/audio_record.3gp";
Wybrane metody klasy MediaRecorder dla audio (1) public int getmaxamplitude () public void setaudiochannels (int numchannels) public void setaudioencoder (int audio_encoder) public void setaudioencodingbitrate (int bitrate) public void setaudiosamplingrate (int samplingrate)
Wybrane metody klasy MediaRecorder dla audio (2) public void setmaxduration (int max_duration_ms) public void setmaxfilesize (long max_filesize_bytes) Więcej na: http://developer.android.com/reference/android/media/mediarecorder.html
Odtwarzanie video (1) Do odtwarzania wideo służy klasa public class MediaPlayer extends Object Ale
Odtwarzanie video (2) Dlatego użyjemy narzędzi public class VideoView extends SurfaceView implements MediaController.MediaPlayerControl public class MediaController extends FrameLayout
VideoView (1) Dodajemy VideoView do pliku z layout <VideoView android:id="@+id/videov" android:layout_width="fill_parent" android:layout_height="wrap_content" /> Dodajemy do activity setcontentview(r.layout.main); VideoView myvideoview = (VideoView)findViewById(R.id.videov);
VideoView (2) Ustawienie ścieżki do pliku String SrcPath = "/sdcard/test.mp4"; lub myvideoview.setvideopath(srcpath); myvideoview.setvideouri(uri.parse("www")); myvideoview.setvideouri( Uri.parse("\sdcard\video.mp4"));
VideoView (3) Ustawianie ostrości videoview.setfocus(); użycie klasy MediaController myvideoview.setmediacontroller( new MediaController(this)); Odtwarzamy myvideoview.start();
VideoView (4)
Nagrywanie video Do nagrywania wideo używamy klasy MediaRecorder Aby obsługiwać wyświetlanie kamery użyjemy interfejsu SurfaceView oraz SurfaceHolder.Callback Więcej na: http://developer.android.com/reference/android/view/surfaceview.html http://developer.android.com/reference/android/view/surfaceholder.html
Klasa MediaRecorder (1) opis metod, które posłużą nam do konfiguracji nagrywania public void setvideosource (int video_source) Określa źródło wideo (np. kamery lub domyśle) do wykorzystania do nagrywania. Jeśli ta metoda nie jest wywoływana, plik wyjściowy nie może zawierać ścieżki wideo.
Klasa MediaRecorder (2) public void setoutputformat(int output_format) Wywołanie po setaudiosource () / setvideosource (), ale przed prepare (). public void setvideoencoder (int video_encoder) Jeśli ta metoda nie jest wywoływana, plik wyjściowy nie może zawierać ścieżki wideo. Wywołanie po setoutputformat () i przed prepare ().
Klasa MediaRecorder (3) setoutputfile(path_name) Wywołanie po setoutputformat() ale przed prepare(). public void setpreviewdisplay (surface sv) Ustawia powierzchni, aby wyświetlić podgląd zapisanych plików. Używanie przed prepare().
Klasa MediaRecorder (4) public void prepare () Przygotowuje kamery do rozpoczęcia przechwytywania i kodowania danych. Po ustaleniu kodera, ścieżki, formatu itp. Przed start(); public void start () Rozpoczęcie przechwytywanie. Wywołanie po prepare().
Nagrywanie video (1) <uses-permission android:name="android.permission.record_video"/> public Preview(Contect context, MediaRecorder temp_recorder) { super(context); recorder = temp_recorder; holder = getholder(); holder.addcallback(this); holder.settype(surfaceholder.surface_type_push_buffers); }
Nagrywanie video (2) public void surfacecreated(surfaceholder holder){ /.try recorder.setvideosource(mediarecorder.videosource.default); recorder.setoutputformat MediaRecorder.OutputFormat.MPEG_4); recorder.setvideoencoder(mediarecorder.videoencoder.mpeg_4_sp); recorder.setoutputfile("/sdcard/recordvideooutput.3gpp"); recorder.setpreviewdisplay(mholder.getsurface()); recorder.prepare(); // }
Nagrywanie video (3) public void surfacedestroyed(surfaceholder holder) { } // public void surfacechanged( } SurfaceHolder holder, int format, int w, int h) {
Nagrywanie video (4) public void oncreate.{ requestwindowfeature(window.feature_no_title); recorder = new MediaRecorder(); preview = new RecorderPreview(this,recorder); setrequestedorientation(activityinfo.screen_orientation_portrait); setcontentview(preview); }
Wyświetlanie zdjęć <ImageView android:id="@+id/imageview_0 android:layout_width="wrap_content" android:layout_height="wrap_content" /> mgview = (ImageView)findViewById(R.id.ImageView_0); imgview.setimageresource(uri);
Galeria Zdjęć (1) <Gallery xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/example_gallery" android:layout_width="fill_parent" android:layout_height="wrap_content" /> gallery = (Gallery) findviewbyid(r.id.examplegallery); gallery.setadapter(new AddImgAdp(this));
Galeria Zdjęć (1) TypedArray typarray = obtainstyledattributes( R.styleable.GalleryTheme); GalItemBg = typarray.getresourceid( R.styleable.GalleryTheme_android_galleryItemBackground, 0); typarray.recycle();
Galeria Zdjęć (2) ImageView imgview = new ImageView(cont); imgview.setimageresource(img_id[position]); imgview.setlayoutparams(new Gallery.LayoutParams(80, 70)); imgview.setscaletype(imageview.scaletype.fit_xy); imgview.setbackgroundresource(gali_tem_bg);
Wyświetlanie zdjęć
Obsługa karty SD (emulator)
Telephony API s
Contents Introduction(SMS/MMS) Android.telephony Sending and receiving messages
SMS (Short Message Service) 1 Statistics - First sms was sent over the Vodafone GSM network in the United Kingdom on 3 December 1992-2.4 billion active users - SMS traffic reached five trillion by the close of 2010 - Global SMS revenues - US$105.5 billion
SMS (Short Message Service) 2 Technical details - PDU (protocol description unit) contains not only the message, but also a lot of meta-information - Length is limited to precisely 140 octets (140 octets = 140 * 8 bits = 1120 bits) - Messages can be encoded using a variety of alphabets - Concatenated SMS
MMS (Multimedia Messaging Service) 1 Technical details - delivered in a completely different way from SMS
Android.telephony Provides APIs for monitoring the basic phone information. Important classes: - CellLocation - PhoneStateListener - SmsManager - SmsMessage
Sending SMS message 1 <uses-permission android:name= android.permission.send_s MS ></uses-permission>
SmsManager public static SmsManager getdefault () public ArrayList<String> dividemessage (String text) public void sendtextmessage (String destinationaddress, String scaddress, String text, PendingIntent sentintent, PendingIntent deliveryintent) public void sendmultiparttextmessage (String destinationaddress, String scaddress, ArrayList<String> parts, ArrayList<PendingIntent> sentintents, ArrayList<PendingIntent> deliveryintents)
Sending SMS message 2
Sending SMS message 3 But how do we know that the message has been sent correctly or delivered?
Sending SMS message 4
Receiving SMS message 1 Receive incoming SMS by using a BroadcastReceiver object Useful when we want our application to perform an action when a certain SMS message is received BroadcastReceiver can continue to listen even if the application is not running!
Sending SMS message 3 But how do we know that the message has been sent correctly?
Android Speech Synthesis & Recognition inż. Michał Bulba
Plan prezentacji 1. Android TTS 2. Konfiguracja silnika TTS 3. Android mówi: Hello World 4. Mowa to też strumień audio 5. TTS a asynchroniczność 6. Syntezowanie mowy do pliku 7. Rozpoznawanie mowy 8. Stochastyczne modele rozpoznawania 9. Rozpoznawanie mowy parametry
Android TTS TTS Text To Speech czyli w skrócie syntezowanie mowy na podstawie tekstu Języki natywne Języki Angielski, Francuski, Niemiecki, Włoski, Hiszpański Dostępne od wersji 1.6 API Level 4 TTS Nowe możliwości w aplikacjach.
Konfiguracja silnika TTS cz1/3 Konfiguracja Różne urządzenia różne konfiguracje Intent checkintent = new Intent(); checkintent.setaction(texttospeech.engine.action_check_tts_data); startactivityforresult(checkintent, MY_DATA_CHECK_CODE); CHECK_VOICE_DATA_PASS wynik stwierdzający, że obsługa TTS jest zainstalowana
Konfiguracja silnika TTS cz2/3 Intent checkintent = new Intent(); checkintent.setaction(texttospeech.engine.action_check_tts_data); startactivityforresult(checkintent, MY_DATA_CHECK_CODE); private TextToSpeech mtts; protected void onactivityresult(int requestcode, int resultcode, Intent data) { if (requestcode == MY_DATA_CHECK_CODE) { if (resultcode == TextToSpeech.Engine.CHECK_VOICE_DATA_PASS) { mtts = new TextToSpeech(this, this); } else { Intent installintent = new Intent(); installintent.setaction(texttospeech.engine.action_install_tts_data); startactivity(installintent); } } }
Konfiguracja silnika TTS cz3/3 Języki i Locale Ustawianie języka: mtts.setlanguage(locale.us); Sprawdzanie dostepnosci językow: mtts.islanguageavailable(locale.uk)) mtts.islanguageavailable(locale.france)) mtts.islanguageavailable(new Locale("spa", "ESP"))) wynik pozytywny: TextToSpeech.LANG_COUNTRY_AVAILABLE Najprościej: Locale.getDefault()
Android mówi: Hello World Mówione Hello World String mytext1 = Hello World"; mtts.speak(mytext1, TextToSpeech.QUEUE_FLUSH, null); mtts.speak(mytext1, TextToSpeech.QUEUE_ADD, null); Jaka jest różnica pomiędzy powyższymi wywołaniami speak()?
Mowa to też strumień audio Parametry metody speak() przekazujemy w postaci HashMap y Np.: Chcemy użyć strumienia dla muzyki HashMap<String, String> myhash = new HashMap(); myhashput(texttospeech.engine.key_param_stream, String.valueOf(AudioManager.STREAM_MUSIC)); mtts.speak(mytext1, TextToSpeech.QUEUE_FLUSH, myhash);
TTS a asynchroniczność Jak radzić sobie z asynchronicznością: mtts.setonutterancecompletedlistener(this); myhash.put(texttospeech.engine.key_param_stream, String.valueOf(AudioManager.STREAM_MUSIC)); mtts.speak(mytext1, TextToSpeech.QUEUE_FLUSH, myhash); myhash.put(texttospeech.engine.key_param_utterance_id, jakis ID"); mtts.speak(mytext2, TextToSpeech.QUEUE_ADD, myhash); public void onutterancecompleted(string uttid) { if (uttid.equals( jakis ID")) { DoSthElse(); } } Utterance element kolejki słów do syntezowania
Syntezowanie do pliku Syntezowanie do pliku = oszczędność cpu HashMap<String, String> myhashrender = new HashMap(); String Text = "Are there?"; String destfilename = "/sdcard/myappcache/areyou.wav"; myhashrender.put(texttospeech.engine.key_param_utterance_id, Text); mtts.synthesizetofile(text, myhashrender, destfilename); addspeech(string text, String destination) przypisanie do danego stringa jego gotowego brzmienia z karty SD
Rozpoznawanie mowy cz1/2 Model rozpoznawania Nowe możliwości
Stochastyczne modele rozpoznawania
Rozpoznawanie mowy cz2/2 public void onclick(view button) { Intent intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH); // Ustawiamy model intent.putextra(recognizerintent.extra_language_model, RecognizerIntent.LANGUAGE_MODEL_FREE_FORM); // Uruchamiamy intent startactivityforresult(intent, 0); } // po zakonczonym rozpoznawaniu protected void onactivityresult(int requestcode,int resultcode,intent intent) { // pobieramy liste dopasowań ArrayList<String> nbest = intent.getstringarraylistextra(recognizerintent.extra_results); DoSomething(nbest.get(0)) }
Rozpoznawanie mowy - parametry Parametry rozpoznawania Language (EXTRA_LANGUAGE) ustawienie języka innego niż uzyskany z locale metoda getdefault() używamy parametru zgodnego z IETF language tag np. pl-pl, en-us Language(EXTRA_LANGUAGE_MODEL) Modele: Search - podobny do wyszukiwań w google Free form - teksty dyktowane np. sms, e-mails
Materiały dodatkowe Warto zapoznać się z dokumentacją: Syntezowanie mowy: http://developer.android.com/reference/android/speech/tts/package-summary.html Rozpoznawanie mowy: http://developer.android.com/reference/android/speech/package-summary.html Przydatne linki: http://developer.android.com/resources/articles/tts.html http://developer.android.com/resources/articles/speech-input.html http://www.learn-android.com/2009/12/03/half-dozen-hello-worlds-part-4/ http://ebookbrowse.com/tt1-gruenstein-pdf-d120842652
Podsumowanie 1. Sprawdzenie obecności silnika TTS 2. Konfiguracja silnika TTS 3. Synteza i obsługa mowy 4. Rozpoznawanie mowy 5. Language models