Policz, ile to jest- wersja audio
Przedstawiamy jeszcze
jedno rozwinięcie zabawy o nazwie „Policz, ile to jest”. Zmiana,
jakiej dokonamy będzie polegała na zamianie komunikatów tekstowych
na słowne. Sprawimy, że program będzie z nami komunikował się
używając ludzkiej mowy. Będzie to z pewnością duże udogodnienie
i atrakcja, zwłaszcza dla osób samotnych, którym brakuje rozmów z
drugim człowiekiem. Przynajmniej komputer będzie do nich mówił...
Wracając do podstawowego
kodu, czyli gry „Policz, ile to jest- wersja prosta”, musimy
dokonać pewnych zmian. Przede wszystkim, z uwagi na to, że teraz
program będzie zadawał nam pytania ludzkim głosem, możemy pozbyć
się etykiety Label6, na której owe zadanie było wyświetlane.
Musimy także umieścić na formie komponent TMediaPlayer, który
będzie odtwarzał odpowiednie pliki dźwiękowe. Oprócz niego
skorzystamy także z prostszego odtwarzacza dźwięków, jakim jest
PlaySound. Poznamy dzięki temu oba sposoby odtwarzania dźwięków w
Delphi, a ponadto, wykorzystamy ich właściwości. Scharakteryzujmy
zatem oba sposoby:
PlaySound
Jest
to prosty odtwarzacz dźwięków, bez możliwości zarządzania tym
dźwiękiem z pozycji programu. Kolejną jego wadą jest ograniczenie
odtwarzanych formatów jedynie do plików wav. Trudno zatem używać
go do bardziej rozbudowanych projektów, z uwagi na duży rozmiar
tych plików w porównaniu z formatem mp3. Zazwyczaj stosuje się go
do odtwarzania krótkich tam, gdzie nie ma potrzeby używania
bardziej rozbudowanego odtwarzacza. Tutaj też jest jego największa
zaleta: jako mniej rozbudowany odtwarzacz, uruchamia się on znacznie
szybciej niż MediaPlayer. Jeżeli tworzymy wypowiedź programu za
pomocą kilku oddzielnych plików (tak, jak w naszym przypadku)
PlaySound szybciej i bardziej płynnie odtworzy je kolejno.
TMediaPlayer
Jako bardziej rozbudowany
odtwarzacz, umożliwia on nie tylko odtwarzanie plików wav, czy mp3,
ale także zarządzanie dźwiękiem z pozycji programu, czyli na
przykład Start, Stop, Pauza, Następny itp. Dużym mankamentem w
przypadku plików mp3 jest brak regulacji siły głosu, stąd też do
odtwarzania plików mp3 stosuje się często inne komponenty, które
nie wchodzą w skład środowiska Delphi, trzeba je sobie osobno
doinstalować.
Wracając do naszego
programu, po umieszczeniu na formie komponentu TMediaPlayer,
kompilator sam umieści odpowiednią informację o tym w sekcji uses
dodając moduł MPlayer. W przypadku korzystania z PlaySound sami
musimy w tej sekcji umieścić informację, że będziemy korzystać
z przeznaczonego do tego modułu. Dopisujemy zatem po przecinku nazwę
MmSystem.
Jako, że program ma
mówić ludzką mową, musimy więc przygotować dla niego
odpowiednie pliki dźwiękowe, z których będzie korzystał. Jakie
pliki będą nam potrzebne? Po pierwsze, musimy posiadać pliki, z
których będą wypowiadane liczby: dwadzieścia jeden oddzielnych
plików, każdy przechowujący jedną liczbę, od zera do dwudziestu.
Po drugie, musimy mieć trzy pliki określające działanie: plus,
minus i razy. Musimy jeszcze mieć początek zdania, czyli formę
zapytania „Ile jest?”, oraz pliki z oceną naszej odpowiedzi:
„Dobrze” i „Źle”.
W
przypadku początku pytania, gdy za każdym razem program będzie
mówił swoje „Ile jest”, prędzej czy później znudzi się nam
ta monotonia. Wprowadzamy zatem założenie, że program będzie miał
przygotowanych kilka różnych wersji tego pytania, nie tylko formę
„Ile jest”, ale także inne, podobne wypowiedzi, na przykład
takie: „Powiedz mi, ile jest”, „Ile to jest”, „Podaj mi
wynik działania”, „Policz, ile to jest”. Przy każdorazowym
uruchomieniu przycisku START program wylosuje jedną z tych form i
odtworzy ją. Nada to większej „żywości” naszemu programowi.
Programista może sobie przygotować znacznie szerszy wybór
wypowiedzi, pamiętając jednak o tym, że w swoim programie musi
podać ile tych plików przygotował, aby program wiedział z jakiego
zakresu ma losować. Podobny zabieg możemy wykonać w przypadku
wypowiedzi oceniającej naszą odpowiedź, a więc nie tylko
„Dobrze”, ale także „Bardzo dobrze”, „Świetnie”,
„Wyśmienicie”; tak samo: nie tylko „Źle”, ale i „Niestety
źle”, „To nie jest dobra odpowiedź”, „Pomyliłeś się”,
itp. Im więcej wariantywnych wypowiedzi, tym zabawa będzie mniej
monotonna i nudna.
Odpowiednie pliki możemy
nagrać za pomocą swojego głosu lub poprosić koleżankę o miłym
głosie, aby użyczyła go na potrzeby programu. Poszczególne
kwestie nagrywamy do osobnych plików dźwiękowych: liczby, znaki i
początek pytania tworzymy w formacie wav, a komunikaty i oceny
możemy stworzyć w formacie mp3, aby zaoszczędzić miejsca na
dysku.
Do przygotowania plików
dźwiękowych możemy wykorzystać także odpowiedni program
komputerowy, zwany syntezatorem mowy (np. Expressivo), który po
wpisaniu w jego oknie tekstu, zamienia go na ludzką mowę, a
następnie umożliwia zapisanie wypowiedzi w formie pliku
dźwiękowego. Obecne syntezatory są już na tyle doskonałe, że
wypowiadane przez nie słowa naprawdę niewiele różnią się od
ludzkiej mowy.
Jeżeli planujemy
wykorzystać możliwość mówienia programu do innych gier i zabaw,
dobrze jest umieścić część plików dźwiękowych we wspólnym
katalogu, na przykład o nazwie właśnie „WSPÓLNE”. Jakie będą
to pliki? Ano wszystkie te, które powtarzają się w innych
zabawach, a więc: liczby, znaki, komunikaty, oceny itp. Specyficzne
wypowiedzi, które występują tylko dla jednej gry, umieszczamy w
katalogu głównym lub jakimś innym konkretnej gry. Nazwy plików
muszą być liczbami (począwszy od zera), ponieważ ułatwią one
programowi losowanie pliku: Wystarczy, że program wylosuje jakąś
liczbę i już wiadomo, jaki plik odtworzyć- oczywiście o tej samej
liczbie w nazwie.
Własna procedura w Delphi
Z
racji tego, że kod obsługujący odtwarzacz dźwięków zawiera
wiele linii kodu, a ponadto za każdym razem linie te będą się
powtarzać, więc, aby zmniejszyć ilość linii i zwiększyć
przejrzystość kodu, utworzymy własną procedurę, którą nazwiemy
„Wylosuj i odtwórz”. Będzie ona pobierała parametry z programu
(ścieżkę dostępu do katalogu z plikami i ilość plików w tym
katalogu) i na ich podstawie będzie odtwarzać określony plik.
Aby nasza procedura mogła
być przez program wykorzystywana, musimy ją zadeklarować w sekcji
„type”. W tym celu dopisujemy naszą deklarację
(procedure) do innych procedur, podając jej nazwę. My, swoją
procedurę nazwaliśmy „Wylosuj i odtwórz”, ale w tej postaci
Delphi nam odrzuci. Wszelkie nazwy procedur muszą mieć postać
jednoczłonową, stąd też deklarujemy naszą procedurę pod nazwą
„Wylosuj_i_odtworz”. Nie trzeba chyba nikomu przypominać, że w
kodzie nie korzystamy z polskich znaków dielektrycznych, możemy to
zrobić jedynie w komentarzu. Opisem tej funkcji zajmiemy się w
dalszej części, teraz, kończąc temat, dopowiemy jeszcze jaki jest
sens stosowania takich własnych procedur.
Wyobraźmy sobie program
podobny do naszego, tylko bardziej rozbudowany, który wszelką
komunikację z użytkownikiem prowadzi za pomocą plików
dźwiękowych. Chcąc odtworzyć taki plik w komponencie MediaPlayer,
musielibyśmy wpisać następujący kod:
MediaPlayer1.FileName:=
'C:\Katalog\Plik.mp3';
MediaPlayer1.Open;
MediaPlayer1.Wait:=True;
MediaPlayer1.Play;
Kod ten musielibyśmy
powtarzać za każdym razem, gdy będziemy generowali wypowiedź
programu. Jest to dosyć czasochłonna praca, bardzo powiększająca
ogólną objętość kodu. Lepiej więc taki kod zawrzeć w
stworzonej przez nas procedurze, a potem odnosić się bezpośrednio
do niej z różnych miejsc kodu. Teraz wystarczy tylko wpisać nazwę
naszej procedury, czyli Wylosuj_i_odtworz, a program wykona
przypisany do niej kod. Zabieg ten odchudzi nasz kod i uczyni go
bardziej przejrzystym.
< Wstecz 2/4 Dalej >
Artykuł pochodzi z mojej książki pt. "Delphi w przykładach dla początkujących". Zapraszam na Stronę książki.
Ciekawe artykuły:
Zapoznaj się z innymi utworami. Przejdź do zakładki Spis artykułów.
- Zagadki logiczne i inne zagadki
- Zabawy matematyczne w Delphi
- Zabawy rozwijające pamięć w Delphi
- Przechwyt klawiatury w Delphi
- Zakładanie hooka w Delphi- metoda Short Cut
Zapoznaj się z innymi utworami. Przejdź do zakładki Spis artykułów.
Brak komentarzy:
Prześlij komentarz