Lời nói đầu
Thời đại thông tin đang mang lại cho chúng ta nhiều thành tựu to lớn. Sự bùng nổ thông tin đã và đang diễn ra mạnh mẽ ở tất cả các nước trên thế giới. Từ khi ra đời cho đến nay Công nghệ thông tin là một khoa học tuy mới mẽ song đã có ảnh hưởng rất lớn và chiếm vị trí quan trọng trong mọi lĩnh vực của cuộc sống: kinh tế, giáo dục, y tế, viễn thông,
Một trong số đó phải kể đến lĩnh vực viễn thông. Bên cạnh công nghệ điện thoại truyền thống PSTN (Public Switch Telephone Network) đã tồn tại và phát triển từ lâu, thì công nghệ điện thoại IP cũng đã được thương mại hoá từ năm 1995. Với lợi thế giá cước thấp, chất lượng dịch vụ có thể chấp nhận được đã làm nhiều nhà kinh doanh viễn thông quan tâm. Tại Việt Nam, dịch vụ này cũng vừa mới được đưa vào sử dụng nhưng còn mang tính chất thử nghiệm.
Hiện nay, cũng đã có nhiều phần mềm xây dựng dịch vụ trả lời điện thoại tự động IP và đã mang lại nhiều lợi ích không nhỏ. Nhận thấy được khả năng phát triển của dịch vụ này và những ứng dụng vô cùng to lớn của nó trong tương lai. Em đã lựa chọn đề tài “Tìm hiểu về TAPI và xây dựng mô hình thử nghiệm trả lời điện thoại tự động bằng máy tính”. Đây không phải là một đề tài mới mẽ, đã có nhiều cá nhân và tổ chức nghiên cứu, tìm hiểu và xây dựng. Song, nó là một đề tài rất thú vị, và chắc hẳn còn nhiều điều cần phải đề cập đến.
Với phạm vi của đề tài, em đã đề cập tới một số vấn đề liên quan đến: Giao tiếp lập trình hệ thống điện thoại TAPI; Công nghệ điện thoại IP và các ứng dụng cùng với những ưu nhược điểm của nó. Từ đó xây dựng được mô hình ứng dụng TAPI, mô hình lập trình hệ thống điện thoại, Có sơ lược một số vấn đền liên quan đến file tiếng nói (Wave), cách thu và phát file tiếng nói, Trên cơ sở lý thuyết đã nghiên cứu và tìm hiểu đi đến xây dựng một ứng dụng “Trả lời điện thoại tự động bằng máy tính”.
62 trang |
Chia sẻ: lvcdongnoi | Lượt xem: 2491 | Lượt tải: 0
Bạn đang xem trước 20 trang tài liệu Tìm hiểu về TAPI và xây dựng mô hình thử nghiệm trả lời điện thoại tự động bằng máy tính, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
ation)
+ Khëi t¹o m«i trêng truyÒn th«ng trªn m¸y tÝnh
+ ViÖc khëi t¹o lµ ®ång bé vµ kh«ng quay trë l¹i cho tíi khi thao t¸c hoµn tÊt hoÆc bÞ lçi.
+ NÕu TAPISVR cha ®îc gäi th× TAPI sÏ gäi nã.
+ TAPI thiÕt lËp mét kÕt nèi cho tiÕn tr×nh TAPISVR.
+ TAPISVR n¹p vµo c¸c bé phËn cung cÊp dÞch vô ®îc chØ ®Þnh trong Registry vµ buéc chóng khëi t¹o nh÷ng thiÕt bÞ mµ chóng hç trî.
+ LÊy sè phiªn b¶n thÝch hîp cho øng dông TAPI, TAPI vµ bé cung cÊp dÞch vô ®iÖn tho¹i. C«ng viÖc nµy ph¶i lµm ë TAPI 2.
+ KiÓm tra vµ thu nhËn th«ng tin liªn quan ®Õn c¸c thiÕt bÞ kh¶ dông cho øng dông TAPI.
+ §¨ng ký th«ng ®iÖp ®Ó nhËn ®îc c¸c sù kiÖn liªn quan tíi nh÷ng thay ®æi tr¹ng th¸i cña ®êng truyÒn.
2. §iÒu khiÓn phiªn lµm viÖc (Session Control)
Mét phiªn lµm viÖc nãi chung hay mét cuéc gäi nãi riªng lµ mét kÕt nèi gi÷a hai hay nhiÒu ®Þa chØ. KÕt nèi nµy lµ ®éng vµ c¸c ®èi t¬ng liªn quan ph¶i ®îc t¹o, qu¶n lý vµ huû bá khi kh«ng cßn dïng. Trong trêng hîp ®¬n gi¶n nhÊt th× ®©y lµ qu¸ tr×nh tõ lóc t¹o ®Õn lóc ng¾t kÕt nèi mét cuéc gäi.
Giai ®o¹n nµy gåm hai c«ng viÖc chÝnh:
+ §iÒu khiÓn ho¹t ®éng cña phiªn lµm viÖc: khëi t¹o, duy tr× vµ kÕt thóc phiªn lµm viÖc.
+ LÊy th«ng tin cña phiªn lµm viÖc: lÊy nh÷ng th«ng tin chi tiÕt trong phiªn lµm viÖc.
3. §iÒu khiÓn thiÕt bÞ (Device Control)
ThiÕt kÕ vµ lÊy th«ng tin cña c¸c thiÕt bÞ:
+ Network: lµ líp giao vËn cho viÖc truyÒn th«ng
+ Line: lµ mét kÕt nèi tíi mét Network. §ã lµ mét thiÕt bÞ vËt lý nh b¶ng m¹ch Fax, Modem, hay c¹c ISDN. ThiÕt bÞ cã thÓ kh«ng cÇn kÕt nèi th¼ng vµo m¸y tÝnh mµ cßn øng dông TAPI ®ang ch¹y.
+ Channel: lµ sù chia nhá cña mét Line
+ Address: mét Address ®¹i diÖn cho mét sù ®Þnh vÞ trªn Network. Mçi Line hay Channel ®Òu cã mét hay nhiÒu ®Þa chØ liªn kÕt víi nhau.
+ Terminal: mét nguån hoµn tr¶ l¹i cho mét ®Þa chØ ®Æc trng vµ mét kiÓu ph¬ng tiÖn.
4. §iÒu khiÓn ph¬ng tiÖn (Media Control)
Ph¬ng tiÖn cña phiªn lµm viÖc truyÒn th«ng ®îc thiÕt kÕ cho d÷ liÖu truyÒn qua. Nã cho phÐp mét øng dông nhËn biÕt sù thay ®æi cña c¸c kiÓu ph¬ng tiÖn vµ ®iÒu chØnh c¸c luång trªn ph¬ng tiÖn nh ©m lîng cña tiÕng nãi ®îc truyÒn. §ã còng cã thÓ lµ viÖc nhËn vµ göi c¸c tÝn hiÖu DTMF tõ ®iÖn tho¹i.
5. KÕt thóc TAPI (TAPI Shutdown)
+ KÕt thóc c¸c phiªn lµm viÖc
+ Gi¶i phãng c¸c tµi nguyªn hÖ thèng ®ang chiÕm gi÷
C¸c phiªn b¶n TAPI
BÊt kú mét vÊn ®Ò nµo liªn quan ®Õn TAPI còng gåm cã 3 thµnh phÇn: ch¬ng tr×nh øng dông, TSP vµ chÝnh b¶n th©n cña TAPI. Mçi mét thµnh phÇn trong ba thµnh phÇn nµy ®Òu cã hç trî ®Õn mét phiªn b¶n TAPI tèi ®a. §©y lµ c«ng viÖc cña øng dông ph¶i kiÓm tra vµ chän lùa phiªn b¶n cao nhÊt cña TAPI mµ c¶ ba thµnh phÇn nµy ®Òu hç trî. C¸c con sè phiªn b¶n nµy ®îc duy tr× sù t¬ng thÝch khi Microsoft më réng c¸c kh¶ n¨ng cña TAPI. C¸c phiªn b¶n Windows kh¸c nhau th× kh¶ n¨ng t¬ng thÝch vµ hç trî c¸c phiªn b¶n TAPI còng kh¸c nhau:
HÖ ®iÒu hµnh Windows
Phiªn b¶n TAPI ban ®Çu
Phiªn b¶n TAPI tèi ®a cã thÓ n©ng cÊp
Windows 95
1.4
2.2
Windows 98
2.0
2.2
Windows ME
2.2
2.2
Windows NT 4
2.2 * SP5
2.2
Windows 2000
3.0
3.3
Windows XP
3.3
3.3
H×nh 1.6. C¸c phiªn b¶n TAPI
Víi phiªn b¶n TAPI 1.4 cã thÓ ho¹t ®éng b×nh thêng mµ kh«ng gÆp vÊn ®Ò g× khi ch¹y trªn c¸c hÖ ®iÒu hµnh Windows kh¸c nhau. Cßn ®èi víi øng dông TAPI 2.0 sÏ tù ®éng lo¹i bá mét sè chøc n¨ng cña nã khi ch¹y cïng víi mét TSP 1.4. Díi ®©y lµ c¸c chøc n¨ng ®îc hç trî thªm ®èi víi mçi phiªn b¶n TAPI:
Phiªn b¶n TAPI
C¸c chøc n¨ng chÝnh ®îc hç trî
1.4
C¸c chøc n¨ng c¬ b¶n cho Windows 32 bit
2.0
§Çy ®ñ c¸c chøc n¨ng cho Windows 32 bit; hç trî Unicode
2.1
Hç trî Client/ Server
2.2
Qu¶n lý cuéc gäi chuyªn dông
3.0
Giao tiÕp kiÓu COM (Computer Object Model); hç trî Media Stream Providers; TSP 2.1 vÉn ®îc dïng
3.1
Mét sè ®iÒu khiÓn thiÕt bÞ ®iÖn tho¹i vµ mét sè giao tiÕp tr¹m chuyªn dông
H×nh 1.7. C¸c chøc n¨ng hç trî cho tõng phiªn b¶n TAPI
Cã hai thay ®æi lín trong c¸c phiªn b¶n cña TAPI:
+ Phiªn b¶n TAPI 2.1 khi chøc n¨ng hç trî Client/ Server ®îc thªm vµo. Nã ®· t¹o kh¶ n¨ng cho thiÕt bÞ hÖ thèng ®iÖn tho¹i cã thÓ ®îc cµi ®Æt trªn mét m¸y Server mµ c¸c m¸y Client trong m¹ng cã thÓ truy cËp ®îc.
+ Phiªn b¶n TAPI 3.0 khi nã ®îc hç trî nh mét bé c¸c ®èi tîng kiÓu COM, sÏ tèt h¬n kiÓu cÊu tróc ng«n ng÷ C++ cho Windows. Nã t¹o ®iÒu kiÖn dÔ dµng cho viÖc viÕt c¸c øng dông b»ng bÊt cø ng«n ng÷ nµo: C++, Visual Basic hay Java.
Ngoµi ra, chøc n¨ng kh¸c biÖt chÝnh lµ kh¶ n¨ng hç trî MSP (Media Service Providers) nh»m cung cÊp c¸ch thøc truy cËp c¸c luång ph¬ng tiÖn trong mét cuéc gäi vµ cã thÓ hç trî hÖ thèng ®iÖn tho¹i theo giao thøc Internet (IP).
Kü thuËt göi sè b»ng xung lìng ®a ©m tÇn DTMF (Dual Tone MultiFrequency)
1. HÖ thèng DTMF lµ g×?
§Ó thùc hiÖn quay sè vÒ tæng ®µi cã hai ph¬ng thøc quay lµ DTMF vµ PULSE. Trong ®ã, DTMF lµ viÕt t¾t cña côm tõ “Dual Tone MultiFrequency” (cÆp tÝn hiÖu ®a tÇn). HÖ thèng nµy ®îc h×nh thµnh vµo n¨m 1960 nhng m·i tíi n¨m 1970 míi ®îc ph¸t triÓn. Ngµy nay, DTMF ®· trë thµnh chuÈn thay thÕ cho hÖ thèng xung kiÓu cò. Do ®ã, mçi khi ta Ên phÝm ®Ó gäi ®iÖn tho¹i, c¸c ©m thanh mµ ta nghe ®îc chÝnh lµ c¸c tÝn hiÖu DTMF ®îc göi tíi tæng ®µi.
DTMF lµ tæng hîp cña hai tÝn hiÖu ©m thanh; mét tÝn hiÖu cã tÇn sè thÊp vµ mét tÝn hiÖu cã tÇn sè cao. §iÒu nµy ®· t¹o nªn lîi thÕ cho DTMF lµ chèng ®îc nhiÔu. Do ®ã, tæng ®µi cã thÓ biÕt chÝnh x¸c phÝm nµo ®· ®îc nhÊn vµ nã cßn gióp cho ngêi ta sö dông ®iÖn tho¹i thuËn tiÖn h¬n.
HÇu hÕt c¸c hÖ thèng ®iÖn tho¹i hiÖn giê ®Òu sö dông tÝn hiÖu DTMF. Bµn phÝm chuÈn cña ®iÖn tho¹i nµy cã d¹ng ma trËn ch÷ nhËt gåm cã 3 cét vµ 4 hµng t¹o nªn tæng céng lµ 12 phÝm nhÊn. Trong ®ã, cã 10 phÝm cho c¸c ch÷ sè tõ 0 --> 9 vµ hai phÝm ®Æc biÖt lµ * vµ #. Mçi mét hµng trªn bµn phÝm ®îc g¸n cho mét tÇn sè Tone thÊp vµ mçi cét ®îc g¸n cho mét tÇn sè tone cao. Do ®ã, mçi mét phÝm sÏ cã mét tÝn hiÖu DTMF riªng ®îc tæng hîp tõ hai tÇn sè t¬ng øng víi hµng vµ cét m· phÝm ®ã ®ang ®øng.
1209 Hz
1336 Hz
1477 Hz
697 Hz
[ 1 ]
[ 2 ]
[ 3 ]
770 Hz
[ 4 ]
[ 5 ]
[ 6 ]
852 Hz
[ 7 ]
[ 8 ]
[ 9 ]
941 Hz
[ * ]
[ 0 ]
[ # ]
H×nh 1.8. Bµn phÝm chuÈn 12 phÝm DTMF
Ngµy nay, ®Ó t¨ng kh¶ n¨ng sö dông cña ®iÖn tho¹i ngêi ta ph¸t triÓn thªm mét cét n÷a cho bµn phÝm ®iÖn tho¹i chuÈn t¹o nªn bµn phÝm ma trËn gåm 4 cét vµ 4 hµng.
1209 Hz
1336 Hz
1477 Hz
1633 Hz
697 Hz
[ 1 ]
[ 2 ]
[ 3 ]
A
770 Hz
[ 4 ]
[ 5 ]
[ 6 ]
B
852 Hz
[ 7 ]
[ 8 ]
[ 9 ]
C
941 Hz
[ * ]
[ 0 ]
[ # ]
D
H×nh 1.9. Bµn phÝm chuÈn 16 phÝm DTMF
C¸c tÝn hiÖu DTMF nµy thêng ®îc sö dông trong dÞch vô hép th tho¹i hoÆc trong hÖ thèng m¸y ®iÖn tho¹i tr¶ lêi tù ®éng. Khi mét ngêi gäi tíi m¸y sÏ x¸c nhËn yªu cÇu cña ngêi ®ã th«ng qua tÝn hiÖu nµy.
2. So s¸nh thêi gian göi sè
Göi sè b»ng lìng ©m ®a tÇn DTMF nhanh h¬n c¸ch quay sè rÊt nhiÒu vÒ mÆt nguyªn t¾c còng nh trªn thùc tÕ. Víi DTMF thêi gian nhËn ®îc mét ch÷ lµ 50 ms vµ thêi gian nghÜ gi÷a hai sè lµ 50 ms, tæng céng lµ 100 ms cho mçi sè. Gi¶ s÷ ta göi ®i 10 sè:
Víi DTMF mÊt 100 ms * 10 = 1 s
Víi ®Üa quay sè mÊt 5 * 10 * 100 ms + 9 * 700ms = 11,3 s
Nh vËy, ngoµi u ®iÓm sö dông dÔ dµng, nhÑ, DTMF gi¶m thêi gian chiÕm dông bé thu rÊt nhiÒu, gi¶m gi¸ thµnh tæng ®µi. §ã còng lµ lý do t¹i sao DTMF ®îc ph¸t triÓn réng r·i vµ phæ biÕn.
3. Ph¬ng thøc lµm viÖc cña thuª bao
+ Thuª bao gäi nhÊc m¸y:
Tæng ®µi sÏ nhËn biÕt tr¹ng th¸i thuª bao chñ gäi nhÊc m¸y th«ng qua sù thay ®æi ®iÖn trë vßng cña ®êng d©y thuª bao. B×nh thêng khi thuª bao ë tr¹ng th¸i nghÜ ®iÖn trë vßng rÊt lín, ta cã thÓ coi nh hë m¹ch.
Khi thuª bao nhÊc m¸y ®iÖn trë vßng gi¶m ®i nhiÒu, tæng ®µi cã thÓ nhËn biÕt sù thay ®æi ®iÖn trë cña thuª bao tøc lµ thay ®æi cña tr¹ng th¸i thuª bao th«ng qua bé c¶m biÕn tr¹ng th¸i.
+ CÊp ©m hiÖu mêi quay sè cho thuª bao:
Khi tæng ®µi ph¸t hiÖn tr¹ng th¸i nhÊc m¸y (off-hook), xung mêi quay sè ®îc ph¸t ®Õn vßng thuª bao; ®ã lµ ©m hiÖu b¸o cho ngêi gäi biÕt cuéc gäi ®· s½n sµng quay sè. TÝn hiÖu nµy cã d¹ng h×nh sin cã tÇn sè 425Hz vµ ph¸t liªn tôc cho tíi khi b¾t ®Çu quay sè thø nhÊt.
Trong trêng hîp ngêi gäi nhÊc m¸y nhng kh«ng quay sè, sau mét thêi gian kho¶ng 15s tæng ®µi sÏ ng¾t Dial tone vµ ph¸t busy tone vÒ phÝa ngêi quay sè.
TÝn hiÖu Dial tone
+ TÝn hiÖu b¸o bËn Busy tone:
Khi thuª bao bÞ gäi ®ang th«ng tho¹i tríc ®ã hoÆc c¸c ®êng kÕt nèi th«ng tho¹i ®Òu bÞ bËn th× tæng ®µi sÏ cÊp busy tone cho thuª bao gäi. ¢m hiÖu nµy còng lµ tÝn hiÖu h×nh Sin cã tÇn sè 425Hz nhng ®îc ng¾t qu·ng 0,5s lµm viÖc 0,5s nghØ.
TÝn hiÖu Busy tone:
NÕu c¸c ®êng d©y th«ng tho¹i kh«ng bËn th× tæng ®µi ph¶i nhËn biÕt c¸c thuª bao gäi vµ xem xÐt:
* NÕu sè ®Çu n»m trong tËp thuª bao cña tæng ®µi th× tæng ®µi sÏ phôc vô nh cuéc gäi néi ®µi.
* NÕu sè ®Çu kh«ng n»m trong tËp thuª bao cña tæng ®µi th× tæng ®µi sÏ phôc vô nh 1 cuéc gäi liªn ®µi qua trung kÕ vµ gi÷ toµn bé phÇn ®Þnh vÞ sè quay sang tæng ®µi ®èi ph¬ng ®Ó gi¶i m·.
* NÕu sè ®Çu lµ m· gäi chøc n¨ng ®Æc biÖt th× tæng ®µi sÏ thùc hiÖn c¸c chøc n¨ng ®ã ®Ó phôc vô cho thuª bao.
NÕu thuª bao ®îc gäi r¶nh th× tæng ®µi sÏ göi sè nhËn diÖn sè chñ gäi nÕu cã cµi dÞch vô sau ®ã cÊp chu«ng cho thuª bao ®îc gäi víi ®iÖn ¸p AC 70 – 110V, tÇn sè f = 16 – 25Hz (thêng lµ 90VAC/ 25Hz) víi chu k× 2s cã tÝn hiÖu vµ 3s kh«ng cã tÝn hiÖu.
TÝn hiÖu chu«ng
§ång thêi tæng ®µi sÏ cÊp tÝn hiÖu håi ©m chu«ng cho thuª bao gäi, ®ã lµ tÝn hiÖu Ring Back Tone cã tÇn sè f = 425Hz víi chu k× 3s lµm viÖc vµ 2s nghØ.
TÝn hiÖu Ring Back Tone:
Khi thuª bao ®îc gäi nhÊc m¸y th× tæng ®µi sÏ nhËn biÕt tr¹ng th¸i nhÊc m¸y nµy, tiÕn hµnh c¾t dßng chu«ng cho thuª bao bÞ gäi mét c¸ch kÞp thêi ®Ó tr¸nh h háng cho thuª bao. §ång thêi tæng ®µi còng t¾t ©m hiÖu håi chu«ng cho thuª bao chñ gäi vµ tiÕn hµnh kÕt nèi th«ng tho¹i cho c¶ hai thuª bao.
Tæng ®µi sÏ gi¶i táa mét sè thiÕt bÞ kh«ng cÇn thiÕt ®Ó tiÕp tôc phôc vô cho c¸c cuéc ®µm tho¹i kh¸c (m¹ch gi¶i m· DTMF).
Khi hai thuª bao ®ang ®µm tho¹i mµ cã mét thuª bao g¸c m¸y. Tæng ®µi nhËn biÕt tr¹ng th¸i g¸c m¸y nµy, c¾t c¸c th«ng tho¹i cho c¶ hai thuª bao, ®ång thêi cÊp Busy tone cho thuª bao cßn l¹i, gi¶i to¶ ®êng d©y ®· kÕt nèi ®Ó phôc vô cuéc ®µm tho¹i kh¸c. Khi thuª bao cßn l¹i g¸c m¸y, tæng ®µi x¸c ®Þnh tr¹ng th¸i g¸c m¸y nµy vµ kÕt thóc ch¬ng tr×nh phôc vô cho thuª bao. TÊt c¶ c¸c ho¹t ®éng trªn ®îc ®iÒu khiÓn b»ng c¸c ch¬ng tr×nh, ngêi vËn hµnh tæng ®µi cã thÓ theo dâi ho¹t ®éng cña tæng ®µi th«ng qua mµn h×nh m¸y tÝnh cña tæng ®µi.
Ch¬ng 2: t×m hiÓu vÒ tiÕng nãi
§Æc tÝnh chung cña tiÕng nãi
TiÕng nãi lµ c«ng cô ®Ó diÔn ®¹t th«ng tin rÊt uyÓn chuyÓn vµ ®Æc biÖt. Khi ngêi nãi ph¸t ra mét tiÕng th× cã rÊt nhiÒu bé phËn nh lìi, thanh m«n, m«i, häng, thanh qu¶n,… kÕt hîp víi nhau ®Ó t¹o thµnh ©m thanh. ¢m thanh ph¸t ra la truyÒn trong m«i trêng kh«ng khÝ ®Õn tai ngêi nhËn. Do ©m thanh ph¸t ra ®îc t¹o nªn nhê sù kÕt hîp cña nhiÒu bé phËn nªn mçi lÇn ph¸t ra hÇu nh lµ kh¸c nhau. V× vËy, viÖc ph©n chia tiÕng nãi thµnh nh÷ng lo¹i cã ®Æc tÝnh riªng lµ rÊt khã vµ nã chØ mang tÝnh t¬ng ®èi. Tuy nhiªn, qua qu¸ tr×nh ph©n tÝch, tæng hîp ta cã thÓ t¹m chia thµnh ba lo¹i:
Voiced sound:
Khi chóng ta nãi ch÷ “a” hay ch÷ “o” thanh m«n cña ta rung vµ gi·n ra, ¸p suÊt kh«ng khÝ ban ®Çu lín vµ tõ tõ gi¶m xuèng, lóc nµy ©m ph¸t ra cã d¹ng sãng Wave ®Æc trng nh h×nh vÏ sau:
H×nh 2.1. D¹ng sãng Wave cña Voice sound
Unvoiced sound:
Lµ ©m khi ph¸t ra mét tiÕng mµ thanh m«n kh«ng rung. Cã hai lo¹i c¬ b¶n: phô ©m s¸t (Fricative) vµ ©m thanh bËt h¬i (Aspirate). §èi víi phô ©m s¸t (khi ph¸t ©m vÇn “s”), ®iÓm co th¾t ®îc t¹o ra t¹i vµi ®iÓm trªn bé m¸y ph¸t ©m, vµ kh«ng khÝ ®îc ®Èy qua nã. V× ®iÓm co th¾t cã khuynh híng x¶y ra gÇn miÖng, tiÕng déi cña bé m¸y ph¸t ©m cã ¶nh hëng nhá trong viÖc t¹o nªn ©m phô s¸t. §èi víi ©m bËt h¬i (khi ph¸t ©m vÇn “h”) sù dao ®éng kh«ng khÝ x¶y ra t¹i thanh m«n bëi v× d©y thanh ©m ®îc gi÷ l¹i mét phÇn. Trong trêng hîp nµy, tiÕng déi cña bé m¸y ©m ®iÒu chØnh phæ cña tiÕng ån. §iÒu nµy ®îc thÊy râ nhÊt khi ta nghe nh÷ng ©m nhá, x× xµo.
Plosive sound:
Trong trêng hîp nµy, bé m¸y ph¸t ©m ®îc ®ãng kÝn, ¸p suÊt kh«ng khÝ nÐn vµ ®îc gi¶i tho¸t bÊt ngê. Sù gi¶i tho¸t nhanh chãng ¸p suÊt t¹o nªn mét sù kÝch thÝch ng¾n cho bé m¸y ph¸t ©m. Sù kÝch cã thÓ x¶y ra víi sù cã rung/ kh«ng rung c¶ d©y thanh m«n ®Ó t¹o nªn ©m thanh Voice/ Unvoice Plosive. §îc minh ho¹ ë h×nh sau:
H×nh 2.2. D¹ng sãng Wave cña Plosive sound
C«ng nghÖ tæng hîp tiÕng nãi Text – to – Speech
Text – to – Speech lµ mét c«ng nghÖ dïng ®Ó chuyÓn d¹ng v¨n b¶n (Text) sang d¹ng tiÕng nãi (Speech). Nã ®îc ph©n lo¹i dùa vµo c¸ch thøc tiÕn hµnh chuyÓn v¨n b¶n sang tiÕng nãi:
Concatenated word:
Víi ph¬ng ph¸p nµy, nh÷ng tõ vµ ng÷ ph¶i ®îc thu ©m tríc. Khi nhËn ®îc mét chuçi cÇn ®äc, m¸y tÝnh sÏ t¸ch ra thµnh tõng tõ mét. Sau ®ã, m¸y sÏ t×m c¸c tõ ®· ®îc thu ©m t¬ng øng vµ ghÐp l¹i víi nhau, t¹o ra mét chuçi tiÕng nãi liªn tôc.
Tæng hîp:
Ph¬ng ph¸p nµy phøc t¹p h¬n nhiÒu v× sÏ tæng hîp t¹o ©m gièng nh÷ng g× ®îc t¹o bëi giäng nãi cña con ngêi ph¸t ra. Ph¬ng ph¸p nµy cÇn cung cÊp nhiÒu bé läc m« pháng chiÒu dµi, cæ häng, khoang miÖng, h×nh d¹ng m«i vµ vÞ trÝ lìi. Tuy nhiªn, tiÕng nãi ®îc t¹o bëi kü thuËt nµy thêng Ýt gièng giäng con ngêi, nhng cã thÓ ®¹t ®îc nh÷ng chÊt lîng kh¸c nhau cña giäng b»ng c¸ch thay ®æi mét vµi th«ng sè.
Hai ©m tè (Diphone Concatanation):
Ph¬ng ph¸p nµy nèi nh÷ng ®o¹n ng¾n ©m thanh ®îc sè ho¸ l¹i víi nhau vµ t¹o ra ©m thanh liªn tôc. Mçi Diphone bao gåm hai ©m vÞ (Phonemes), mét ©m vÞ b¾t ®Çu ©m, mét ©m vÞ kÕt thóc ©m. Ch¼ng h¹n, tõ “hello” bao gåm nh÷ng ©m vÞ sau “h eh l oe”. Nh÷ng Diphone t¬ng øng lµ “silence – hh – eh – ll – oe oe – silence”.
Diphone ®îc t¹o b»ng thu giäng vµ x¸c ®Þnh mét c¸ch cÈn thËn, tØ mØ vµ chÝnh x¸c vÞ trÝ b¾t ®Çu vµ kÕt thóc cña nh÷ng ©m vÞ. MÆc dï kü thuËt kh«ng cè ®Þnh do nh÷ng ©m vÞ chØ ®Æc trng bëi ng«n ng÷ cña ngêi ph¸t ©m.
øng dông c«ng nghÖ Text – to – Speech
Text – to – Speech ®îc øng dông ®Ó chuyÓn c¸c File v¨n b¶n (Texts) sang c¸c File ©m thanh (tiÕng nãi). C¸c File Text nµy mang tÝnh chÊt ®éng, nghÜa lµ nã cã thÓ thay ®æi linh ho¹t thêng xuyªn, kh«ng cè ®Þnh. Kh¸c víi c¸c ph¬ng ph¸p ghi ©m truyÒn thèng, sö dông c«ng nghÖ Text – to – Speech sÏ tiÕt kiÖm ®îc dung l¬ng nhí ®Ó lu tr÷ vµ linh ho¹t trong thùc hiÖn viÖc chuyÓn File. V× nÕu ta sö dông ph¬ng ph¸p ghi ©m truyÒn thèng díi d¹ng c¸c File Waves th× sè lîng File sÏ lín; ®Æc biÖt khi ®é dµi, sè lîng File v¨n b¶n t¨ng lªn. H¬n n÷a, khi ta thay ®æi v¨n b¶n kh¸c th× cÇn ph¶i ghi ©m l¹i.
Tãm l¹i, øng dông c«ng nghÖ Text – to – Speech mang l¹i cho ngêi sö dông rÊt nhiÒu lîi Ých. Ch¼ng h¹n:
+ §äc v¨n b¶n ®éng: Text – to – Speech h÷u dông cho nh÷ng v¨n b¶n thay ®æi thêng xuyªn. VÝ dô sau khi nhËn ®îc Email cã thÓ sö dông c«ng nghÖ nµy ®Ó m¸y tÝnh ®äc cho m×nh nghe.
+ KiÓm tra v¨n b¶n: víi nh÷ng v¨n b¶n chi chÝt ch÷, ta cã thÓ yªu cÇu m¸y ®äc ®Ó ph¸t hiÖn nh÷ng lçi sai.
+ TiÕt kiÖm kh«ng gian lu tr÷
+ Th«ng b¸o b»ng giäng nãi thay cho chuçi th«ng b¸o trªn mµn h×nh
+ øng dông truyÒn th«ng: Text – to – Speech ®îc øng dông trong hép th tho¹i hay hÖ thèng tr¶ lêi tù ®éng.
Nh vËy, c«ng nghÖ Text – to – Speech ngµy cµng ®îc sö dông réng r·i vµ phæ biÕn ®Ó x©y dùng c¸c øng dông thuéc mäi lÜnh vùc cña cuéc sèng.
Giíi thiÖu vÒ File Wave (*.wav)
1. Kh¸i niÖm vÒ file Wave vµ file RIFF
File Wave lµ mét d¹ng file theo chuÈn cña Microsoft cho phÐp lu tr÷ d÷ liÖu sãng ©m ®îc sè ho¸. Nã hç trî rÊt ®a d¹ng c¸c th«ng sè cña ©m thanh nh sè bit lîng tö ho¸, tèc ®é lÊy mÉu, sè kªnh. D¹ng file nµy rÊt phæ biÕn trªn c¸c m¸y tÝnh thÕ hÖ IBM vµ ®îc sö dông réng r·i trong c¸c ch¬ng tr×nh chuyªn nghiÖp ®Ó xö lÝ c¸c sãng ©m ®îc sè ho¸.
File Wave lµ mét trong sè c¸c file thuéc chuÈn cña file RIFF (Resource Interchange File Format – d¹ng file trao ®æi tµi nguyªn). File RIFF sö dông ph¬ng ph¸p lu tr÷ d÷ liÖu trong c¸c chunk. Mçi chunk sÏ gåm 3 trêng:
Tªn nhËn d¹ng cña chunk (ID): gåm 4 byte kiÓu Char
KÝch thíc cña chunk (Size): kiÓu DoubleWord. Gi¸ trÞ nµy kh«ng bao gåm 4 byte cña ID vµ 4 byte cña Size.
D÷ liÖu cña chunk ®ã (Data)
§Æc biÖt, chunk RIFF cã thÓ chøa c¸c chunk kh¸c trong trêng d÷ liÖu. C¸c chunk nµy ®îc gäi lµ Subchunk vµ chunk RIFF lóc nµy ®îc gäi lµ Parent chunk.
Mét file RIFF lu«n b¾t ®Çu b»ng mét chunk RIFF. KÝch thíc cña chunk RIFF lµ kÝch thíc tæng sè byte mµ trêng d÷ liÖu cña nã chiÕm, nãi c¸ch kh¸c chÝnh lµ kÝch thíc cña file RIFF – 8.
Trêng d÷ liÖu (Data) cña chunk RIFF
TÊt c¶ c¸c chunk kh¸c trong file RIFF ®Òu lµ Subchunk cña chunk RIFF. Chunk RIFF cã thªm mét trêng bæ sung n»m ë 4 byte ®Çu tiªn trong trêng d÷ liÖu cña nã. Trêng bæ sung nµy ®îc gäi lµ kiÓu ®Þnh d¹ng (form type), gåm 4 byte kiÓu Char. Nã cho biÕt d¹ng d÷ liÖu ®îc lu tr÷ bªn trong file RIFF lµ g×. VÝ dô, ®èi víi c¸c file Wave trêng nµy sÏ cã tªn lµ “WAVE”, ®èi víi c¸c file Avi trêng nµy sÏ cã tªn lµ “AVI”.
H×nh 2.3. M« h×nh Subchunk trong chunk RIFF cña file RIFF
2. CÊu tróc file Wave
Mét file Wave lµ mét tËp hîp c¸c lo¹i chunk kh¸c nhau. V× file Wave chÝnh lµ file RIFF nªn chunk ®Çu tiªn sÏ lµ chunk RIFF. Ngoµi ra, cã hai chunk quan träng kh«ng thÓ thiÕu lµ chunk Format m« t¶ c¸c th«ng sè cña sãng ©m nh tèc ®é lÊy mÉu, sè bit lîng tö ho¸, …vµ chunk Data ®Ó chøa d÷ liÖu ©m thanh ®· ®îc sè ho¸. C¸c chunk kh¸c tuú trêng hîp cã thÓ cã hoÆc cã thÓ kh«ng.
2.1. Chunk Format
CÊu tróc chunk Format ®îc ®Þnh nghÜa nh h×nh 2.4:
typedef struct {
WORD wFormatTag;
WORD nChannels;
DWORD nSamplesPerSec;
DWORD nAvgBytesPerSec;
WORD nBlockAlign;
WORD wBitsPerSample;
WORD cbSize;
} WAVEFORMATEX;
H×nh2.4. CÊu tróc cña chunk Format
Chunk Format lu«n cã tªn nhËn d¹ng lµ “fmt”. KÝch thíc cña chunk Format cã thÓ thay ®æi tïy theo gi¸ trÞ cña wFormatTag. Gi¸ trÞ nµy cho biÕt chuÈn nÐn ©m thanh. Cã h¬n 50 chuÈn cña Microsoft vµ c¸c h·ng kh¸c ®îc ®Þnh nghÜa trong file mmreg.h. Th«ng thêng chuÈn PCM (Pulse Code Modulation) cña Microsoft lµ chuÈn phæ biÕn nhÊt. Víi chuÈn nµy, c¸c mÉu ©m thanh lu tr÷ sÏ kh«ng ®îc nÐn vµ cã gi¸ trÞ ®îc ®Þnh nghÜa lµ 1.
wChannels lµ sè kªnh ©m thanh. Gi¸ trÞ 1 cho ©m thanh mono, 2 cho ©m thanh stereo, vµ 4 cho ©m thanh 4 kªnh, …
dwSamplesPerSec lµ tèc ®é lÊy mÉu, nghÜa lµ sè mÉu ®îc ph¸t trong mét gi©y, ®¬n vÞ lµ Hertz. Cã 3 gi¸ trÞ th«ng dông lµ: 11025, 22050, vµ 44100 Hz mÆc dï c¸c tèc ®é kh¸c vÉn ®îc dïng.
dwAvgBytesPerSec sÏ chØ ra cã bao nhiªu byte ®îc ph¸t mçi gi©y. NÕu lµ chuÈn PCM th× gi¸ trÞ nµy chÝnh lµ dwSamplesPerSec * wBlockAlign. Ngîc l¹i, gi¸ trÞ nµy ph¶i ®îc tÝnh to¸n phï hîp víi chuÈn t¬ng øng.
wBlockAlign lµ kÝch thíc cña mét khung mÉu ©m thanh, tÝnh theo byte. VÝ dô, mét khung mÉu ©m thanh 16 - bit mono lµ 2 byte, 16-bit stereo lµ 4 byte. NÕu chuÈn lµ PCM th× gi¸ trÞ nµy b»ng wChannels * (wBitsPerSample/8)
wBitsPerSample cho biÕt sè bit dïng ®Ó lîng tö ho¸ mçi ®iÓm lÊy mÉu. NÕu chuÈn lµ PCM th× gi¸ trÞ nµy lµ 8 hoÆc 16. V× c¸c mÉu ph¶i ®îc lu d¹ng BYTE hoÆc WORD nªn khi khi lu tr÷ vÉn ph¶i lu h¼n 1 BYTE hoÆc 1 WORD. VÝ dô, nÕu sè bit lîng tö ho¸ lµ 12 th× sÏ cã 4 bit kh«ng dïng tíi.
cbSize lµ kÝch thíc cña nh÷ng th«ng tin më réng ®îc thªm vµo cuèi cÊu tróc WAVEFORMATEX. Th«ng tin nµy ®îc dïng víi nh÷ng chuÈn kh¸c PCM, cßn víi PCM th× gi¸ trÞ nµy b»ng 0.
2.2. Chunk Data
Sau chunk Format lµ chunk Data. Chunk nµy chØ ®¬n gi¶n chøa c¸c mÉu ©m thanh ®· ®îc sè ho¸. Tuú theo sè kªnh ®îc chän vµ sè bit dïng ®Ó lîng tö ho¸ mµ c¸c mÉu ©m thanh nµy ®îc s¾p xÕp kh¸c nhau trong chunk Data. Cã 2 kh¸i niÖm vÒ ®iÓm mÉu vµ khung mÉu
Mét ®iÓm mÉu chÝnh lµ mét gi¸ trÞ ®¹i diÖn cho mét mÉu ©m thanh ®îc lÊy t¹i mét thêi ®iÓm nµo ®ã. NÕu sè bit dïng ®Ó lîng tö ho¸ lµ 8 th× gi¸ trÞ cña mét ®iÓm mÉu dao ®éng tõ 0 ®Õn 255. NÕu sè bit dïng ®Ó lîng tö ho¸ lµ 16 th× gi¸ trÞ cña mét ®iÓm mÉu dao ®éng tõ –32768 ®Õn 32767. §èi víi ©m thanh cã nhiÒu kªnh, c¸c ®iÓm mÉu tõ mçi kªnh sÏ ®îc xÕp xen kÏ. VÝ dô, víi ©m thanh stereo, c¸c ®iÓm mÉu sÏ ®îc lu tr÷ nh sau: mÉu ®Çu tiªn cña kªnh tr¸i råi ®Õn mÉu ®Çu tiªn cña kªnh ph¶i, tiÕp ®ã lµ mÉu thø hai cña kªnh tr¸i råi mÉu thø hai cña kªnh ph¶i, … vµ cø nh thÕ.
Mét khung mÉu bao gåm nhiÒu ®iÓm mÉu ®îc ph¸t ®ång thêi. VÝ dô, víi ©m thanh stereo, 2 ®iÓm mÉu thuéc 2 kªnh sÏ t¹o thµnh mét khung mÉu.
Khung mÉu 1
Khung mÉu 2
Khung mÉu N
Kªnh 1
Kªnh 2
Kªnh 1
Kªnh 2
...
Kªnh 1
Kªnh 2
= 1 ®iÓm mÉu
Víi ©m thanh mono th× mçi khung mÉu chØ cã 1 ®iÓm mÉu. §èi víi ©m thanh cã nhiÒu kªnh th× tuú theo sè lîng kªnh mµ c¸c thø tù cña ®iÓm mÉu trong mét khung mÉu sÏ kh¸c nhau:
1
2
Stereo
Tr¸i
Ph¶i
1
2
3
3 kªnh
Tr¸i
Ph¶i
Gi÷a
1
2
3
4
Quad
Tr¸i – Tríc
Ph¶i – Tríc
Tr¸i -Sau
Ph¶i -Sau
1
2
3
4
4 kªnh
Tr¸i
Gi÷a
Ph¶i
Surround
1
2
3
4
5
6
6 kªnh
Gi÷a – Tr¸i
Tr¸i
Gi÷a
Gi÷a – Ph¶i
Ph¶i
Surround
Tãm l¹i cÊu tróc cña file Wave ®îc m« t¶ nh b¶ng sau :
M« t¶
KÝch thíc
Gi¸ trÞ th«ng thêng
Tªn cña Chunk RIFF
4 byte
“RIFF”
KÝch thíc chunk RIFF(RIFF chunk size)
4 byte
KÝch thíc file RIFF – 8
§Þnh d¹ng cña file RIFF(Form type)
4 byte
"WAVE"
Tªn cña chunk Format(Format chunk ID)
4 byte
“fmt”
KÝch thíc chunk Format(Format chunk size)
4 byte
16
ChuÈn cña file Wave(wFormatTag)
2 byte
PCM = 1
Sè kªnh (wChannels)
2 byte
mono = 1 stereo = 2
Tèc ®é lÊy mÉu(dwSamplesPerSec)
4 byte
11025 Hz, 22050 Hz,44100 Hz
Sè byte/1 gi©y (dwAvgBytesPerSec)
4 byte
dwSamplesPerSec * wBlockAlign
KÝch thíc khung mÉu(wBlockAlign)
2 byte
wChannels * (wBitsPerSample / 8)
Sè bit lîng tö ho¸(wBitsPerSample)
2 byte
816
Tªn cña chunk Data(Data chunk ID)
4 byte
"data"
KÝch thíc chunk Data
(Data chunk size)
4 byte
wBlockAlign * Tæng sè khung mÉu
D÷ liÖu mÉu ©m thanh
?
?
3. C¸c ph¬ng ph¸p ph¸t mét file Wave
3.1. Dïng hµm sndPlaySound hoÆc PlaySound
Windows cung cÊp 2 hµm sau ®Ó ph¸t mét file wave: sndPlaySound vµ PlaySound. Hai hµm nµy tuy gän, nhÑ, ®¬n gi¶n nhng toµn bé d÷ liÖu ©m thanh vµo bé nhí, v× vËy mµ kÝch thíc cña file sÏ bÞ giíi h¹n ®Õn 100 KB. Ngoµi ra, hai hµm nµy còng ®ßi hái ®Þnh d¹ng cña d÷ liÖu ©m thanh ph¶i ®îc nhËn biÕt bëi tr×nh ®iÒu khiÓn ©m thanh vµ chØ ph¸t ra soundcard.
3.2. Dïng MCI (Media Control Interface)
C¸c hµm cña MCI ®îc chøa trong th viÖn Winmm.lib cña Windows. C¸c khai b¸o ®Æc t¶ liªn quan ®îc cung cÊp trong 2 file Mmsystem.h vµ Windows.h
§Ó ph¸t mét file Wave cã kÝch thíc lín h¬n, Windows cung cÊp mét giao tiÕp MCI (Media Control Interface). §©y lµ mét giao tiÕp rÊt m¹nh thùc hiÖn c«ng viÖc giao tiÕp gi÷a øng dông vµ thiÕt bÞ ©m thanh ®Ó thu hoÆc ph¸t rÊt nhiÒu lo¹i file ©m thanh nh: ph¸t c¸c dµn nh¹c tõ CD Audio, c¸c file Wave, Midi, Video,…
MCI lµ tËp hîp c¸c hµm, mçi hµm cã mét chøc n¨ng riªng biÖt. §iÒu ®Æc biÖt lµ MCI sö dông c¸c chuçi lÖnh sau ®Ó ph¸t 10000 mÉu ©m thanh:
mciSendString(
"open c:\Sound\MyWave.wav type waveaudio alias finch",
lpszReturnString, lstrlen(lpszReturnString), NULL);
mciSendString("set finch time format samples", lpszReturnString, lstrlen(lpszReturnString), NULL);
mciSendString("play finch from 1 to 10000", lpszReturnString,
lstrlen(lpszReturnString), NULL);
mciSendString("close finch", lpszReturnString,
lstrlen(lpszReturnString), NULL);
3.3. Dïng c¸c hµm cÊp thÊp cña Windows
C¸c hµm nµy ®îc chøa trong th viÖn Winmm.lib cña Windows. C¸c khai b¸o ®Æc t¶ liªn quan ®îc cung cÊp trong 2 file Mmsystem.h vµ Windows.h. Díi ®©y lµ c¸c hµm chÝnh lu«n ®îc dïng ®Ó ®iÒu khiÓn viÖc ph¸t mét file Wave:
waveOutOpen()
waveOutPrepareHeader()
waveOutWrite()
waveOutClose()
Trong ®ã, hµm waveOutOpen() sÏ yªu cÇu cung cÊp ®Þa chØ cña mét hµm gäi lµ CallBack. Hµm CallBack nµy sÏ cho biÕt mét trong 3 sù kiÖn liªn quan sÏ x¶y ra, vµ 3 sù kiÖn nµy t¬ng øng víi 3 th«ng ®iÖp sau ®îc göi ®Õn hµm CallBack:
MM_WOM_OPEN
§îc göi khi thiÕt bÞ ®îc më b»ng hµm waveOutOpen()
MM_WOM_DONE
§îc göi khi thiÕt bÞ ®· ph¸t xong khèi d÷ liÖu ©m thanh mµ ®îc göi ®i b»ng hµm waveOutWrite()
MM_WOM_CLOSE
§îc göi khi thiÕt bÞ ®îc ®ãng b»ng hµm waveOutClose()
Ngoµi ra, hµm waveOutOpen() cßn ®ßi hái mét sè tham sè quan trong nh: m· nhËn d¹ng thiÕt bÞ ©m thanh, handle cña thiÕt bÞ sau khi më, con trá tíi mét cÊu tróc m« t¶ file Wave. §Ó chän thiÕt bÞ ©m thanh mÆc ®Þnh, ta dïng h»ng WAVE_MAPPER thay cho m· nhËn d¹ng thiÕt bÞ ©m thanh.
Hµm waveOutPrepareHeader() sÏ t¹o ra mét header cho khèi d÷ liÖu ©m thanh sÏ ph¸t bao gåm c¶ c¸c mÉu ©m thanh ®· ®îc n¹p vµo bé nhí.
Cuèi cïng, hµm waveOutWrite() sÏ b¾t ®Çu göi khèi d÷ liÖu ©m thanh nµy ra thiÕt bÞ ®Ó ph¸t víi header ®ã.
Sau khi ph¸t xong ta ph¶i gäi hµm waveOutClose() ®Ó ®ãng thiÕt bÞ ®· më nh»m gi¶i phãng tµi nguyªn hÖ thèng.
TÊt c¶ c¸c hµm liªn quan ®Õn c«ng viÖc ph¸t ©m thanh nµy ®Òu ho¹t ®éng th«ng qua handle cña thiÕt bÞ mµ lÊy ®îc tõ hµm waveOutOpen().
NhËn xÐt chung vÒ 3 c¸ch ph¸t file Wave
Theo thø tù trong 3 c¸ch nªu trªn th× tÝnh ®¬n gi¶n tû lÖ nghÞch víi tÝnh linh ®éng, uyÓn chuyÓn trong viÖc ph¸t mét file Wave, nghÜa lµ ta muèn n¾m quyÒn kiÓm so¸t, ®iÒu khiÓn cµng nhiÒu th× ph¶i thùc hiÖn cµng nhiÒu thao t¸c.
Trong 3 c¸ch ph¸t file Wave trªn th× 2 c¸ch ®Çu (dïng hµm sndPlaySound, PlaySound hoÆc MCI) ta kh«ng cÇn quan t©m ®Õn viÖc ®äc file Wave vµ n¹p c¸c mÉu ©m thanh vµo bé nhí. Riªng c¸ch thø 3 th× ®iÒu nµy lµ b¾t buéc. PhÇn díi ®©y sÏ nãi s¬ vÒ c¸ch ®äc d÷ liÖu ©m thanh vµo bé nhí tríc khi gäi c¸c hµm ®ã.
4. C¸ch ®äc file Wave vµo bé nhí
§Ó thao t¸c víi file Wave, Windows cung cÊp hµng lo¹t c¸c hµm ®îc chøa trong th viÖn Winmm.lib. Sau ®©y lµ mét sè hµm chÝnh thùc hiÖn c«ng viÖc ®äc file Wave:
§Ó lµm viÖc víi file Wave ta ph¶i më file ®ã b»ng hµm:
mmioOpen()
Sau ®ã ®Þnh vÞ vµo chunk ta cÇn b»ng hµm:
mmioDescend()
Lóc nµy con trá file sÏ trá vµo ®Çu phÇn d÷ liÖu cña chunk ®ã vµ ta sÏ ®äc d÷ liÖu vµo bé nhí b»ng hµm:
mmioRead()
Khi lµm viÖc xong víi mét chunk, tríc khi muèn ®Þnh vÞ vµo mét chunk kh¸c, ta ph¶i ra khái chunk cò b»ng hµm:
mmioAscend()
Sau khi hoµn tÊt c«ng viÖc, ta sÏ ®ãng file Wave ®· më b»ng hµm:
mmioClose()
Tríc khi ®äc d÷ liÖu ©m thanh vµo bé nhí, ta nªn ®äc header cña file Wave trong chunk Format. Tõ header nµy ta sÏ x¸c ®Þnh tæng sè byte mµ bé nhí cÇn ®Ó lu tr÷ d÷ liÖu ©m thanh vµ tiÕn hµnh cÊp ph¸t bé nhí b»ng hµm:
GlobalAlloc()
Sau ®ã ta chØ viÖc ®äc d÷ liÖu vµo vïng nhí ®ã. BÊt cø lóc nµo cÇn ta còng cã thÓ gi¶i phãng vïng nhí ®ã b»ng hµm:
GlobalFree()
Ngoµi ra, nÕu ta muèn thay ®æi vÞ trÝ hiÖn t¹i cña con trá file sau khi ®· më file, ta cã thÓ dïng hµm:
mmioSeek()
5. Ph¬ng ph¸p thu ©m
Víi MCI ®· giíi thiÖu ë phÇn trªn ®Ó ph¸t mét file Wave, ta còng cã thÓ dïng MCI ®Ó thu ©m. C¸ch thø hai lµ dïng c¸c hµm cÊp thÊp cña Windows. Nh ®· giíi thiÖu, c¸c hµm nµy sÏ cho ta sù linh ho¹t trong mäi thao t¸c.
Tríc hÕt ta ph¶i më thiÕt bÞ ©m thanh b»ng hµm:
waveInOpen()
T¬ng tù nh khi ph¸t, ta ph¶i cung cÊp ®Þa chØ cña mét hµm gäi lµ hµm CallBack mµ sÏ ph¸t ra c¸c sù kiÖn liªn quan ®Õn qu¸ tr×nh thu ©m. c¸c th«ng ®iÖp t¬ng øng víi c¸c sù kiÖn nµy lµ:
MM_WIM_OPEN
§îc göi khi thiÕt bÞ ®îc më b»ng hµm waveInOpen()
MM_WIM_DATA
§îc göi khi thiÕt bÞ hoµn tÊt viÖc thu ©m sau khi gäi hµm waveInStart()
MM_WIM_CLOSE
§îc göi khi thiÕt bÞ ®îc ®ãng b»ng hµm waveInClose()
Ngoµi ra, ta còng cÇn cung cÊp m· nhËn d¹ng thiÕt bÞ ©m thanh vµ mét cÊu tróc m« t¶ c¸c th«ng sè ®Þnh d¹ng cña file Wave. §Ó chän thiÕt bÞ ©m thanh mÆc ®Þnh, ta dïng h»ng WAVE_MAPPER thay cho m· nhËn d¹ng thiÕt bÞ ©m thanh.
Mét viÖc kh¸c kh«ng thÓ thiÕu lµ cÊp ph¸t bé nhí ®Ó lu c¸c mÉu ©m thanh thu ®îc. Dùa vµo c¸c th«ng sè ®îc m« t¶ trong c¸c file Wave, ta ph¶i tÝnh to¸n dung lîng bé nhí tèi thiÓu cÇn ®îc cÊp ph¸t trong mét kho¶ng thêi gian nµo ®ã. Cô thÓ lµ: dwAvgBytesPerSec * thêi gian thu ©m.
KÕ ®ã, ta sÏ t¹o ra header file sÏ thu ©m bao gåm c¶ vïng nhí võa cÊp ph¸t b»ng hµm:
waveInPrepareHeader()
Sau ®ã sÏ göi nh÷ng th«ng tin nµy ®Õn thiÕt bÞ thu ©m b»ng hµm:
waveInAddBuffer()
Cuèi cïng, qu¸ tr×nh thu ©m sÏ ®îc b¾t ®Çu b»ng hµm:
waveInStart()
6. Ch¬ng tr×nh chÝnh
Ph¸t tiÕng nãi
Sub Play(ByVal soundcard As Integer)
Dim lFlags As Long
If soundcard = -1 Then
lFlags = CALLBACK_FUNCTION
Else
lFlags = CALLBACK_FUNCTION Or WAVE_MAPPED
End If
format.cbSize = 0
rc = waveOutOpen(hWaveOut, soundcard, format, AddressOf waveOutProc, 0, lFlags)
If (rc 0) Then
GlobalFree (hmem)
waveOutGetErrorText rc, msg, Len(msg)
err.Raise rc, "Play", msg & ""
Exit Sub
End If
outHdr.lpData = bufferIn
outHdr.dwBufferLength = numSamples * format.nBlockAlign
outHdr.dwFlags = 0
outHdr.dwLoops = 0
rc = waveOutPrepareHeader(hWaveOut, outHdr, Len(outHdr))
If (rc 0) Then
waveOutGetErrorText rc, msg, Len(msg)
err.Raise rc, "Play", msg & ""
Exit Sub
End If
rc = waveOutWrite(hWaveOut, outHdr, Len(outHdr))
If (rc 0) Then
GlobalFree (hmem)
Else
fPlaying = True
frmMain.Timer1.Enabled = True
End If
End Sub
Thu tiÕng nãi
Public Sub RecStart(nMaxLength As Long, dwDevice As Long, sFileName As String)
Dim lFlags As Long
Dim bufsz As Long
Dim hData As Long
If dwDevice = -1 Then
lFlags = CALLBACK_FUNCTION
Else
lFlags = CALLBACK_FUNCTION Or WAVE_MAPPED
End If
fRecording = True
m_FileName = sFileName
format.wFormatTag = 7
format.nChannels = 1
format.wBitsPerSample = 8
format.nSamplesPerSec = 8000
format.nBlockAlign = 1
format.nAvgBytesPerSec = 8000
format.cbSize = 0
rc = waveInOpen(h_wavein, dwDevice, format, AddressOf waveInProc, 0, lFlags)
If rc 0 Then
err.Raise rc, "RecStart", "Can Not Open the Device"
Exit Sub
End If
bufsz = nMaxLength * format.nSamplesPerSec * format.wBitsPerSample / 8
AddWaveInBuffer bufsz, whdr
rc = waveInStart(h_wavein)
If rc 0 Then
err.Raise rc, "RecStart", "Error in waveInStart"
Exit Sub
End If
frmMain.Timer1.Enabled = True
DebugString 5, "RecStart Completed"
End Sub
TiÕp nhËn c¸c sù kiÖn cña thiÕt bÞ ph¸t ©m thanh
Sub waveOutProc(ByVal hwi As Long, ByVal uMsg As Long, ByVal dwInstance As Long, ByRef hdr As WAVEHDR, ByVal dwParam2 _As Long)
If (uMsg = MM_WOM_DONE) Then
fPlaying = False
End If
End Sub
TiÕp nhËn c¸c sù kiÖn cña thiÕt bÞ thu ©m thanh
Sub waveInProc(ByVal hwi As Long, ByVal uMsg As Long, ByVal dwInstance As Long, ByRef hdr As WAVEHDR, ByVal dwParam2_ As Long)
Select Case uMsg
Case MM_WIM_DATA
whdr = hdr
fRecording = False
End Select
End Sub
N¹p d÷ liÖu tiÕng nãi vµo vïng ®Öm
Private Sub AddWaveInBuffer(bufsz As Long, whdr As WAVEHDR)
Dim nErr As Long
Dim hData As Long
hData = GlobalAlloc(GPTR, bufsz)
If hData = 0 Then
err.Raise nErr, "AddWaveInBuffer", "Can Not Allocate Memory"
Exit Sub
End If
whdr.lpData = GlobalLock(hData)
If whdr.lpData = 0 Then
err.Raise nErr, "AddWaveInBuffer", "Can Not Lock Memory"
Exit Sub
End If
whdr.dwBufferLength = bufsz
nErr = waveInPrepareHeader(h_wavein, whdr, Len(whdr))
If nErr 0 Then
err.Raise nErr, "AddWaveInBuffer", "Error in waveInPrepareHeader"
Exit Sub
End If
nErr = waveInAddBuffer(h_wavein, whdr, Len(whdr))
If nErr 0 Then
err.Raise nErr, "AddWaveInBuffer", "Error in waveInAddBuffer"
Exit Sub
End If
whdr.dwUser = hData
End Sub
Ch¬ng 3: thö nghiÖm hÖ thèng th«ng b¸o tù ®éng qua ®iÖn tho¹i
Lu ®å gi¶i thuËt cña ch¬ng tr×nh
Trªn c¬ së ph©n tÝch qu¸ tr×nh thùc hiÖn ch¬ng tr×nh ta cã thÓ thÊy ch¬ng tr×nh ®îc thùc hiÖn qua bèn bíc:
Khi cã mét cuéc gäi tíi hÖ thèng sÏ kÕt nèi víi cuéc gäi ®ã
TiÕp nhËn yªu cÇu cña ngêi gäi th«ng qua viÖc ph¸t hiÖn phÝm nµo ®îc nhÊn nhê vµo tÝn hiÖu DTMF ®îc göi tíi
T×m d÷ liÖu trong m¸y tÝnh
Tr¶ lêi yªu cÇu cho cuéc gäi ®Õn
Lu ®å ho¹t ®éng tæng qu¸t cña ch¬ng tr×nh ®îc m« t¶ ë h×nh 3.1
B¾t ®Çu
CÊu h×nh
Chu«ng
F
KÕt nèi
T
T
Tr¶ lêi
F
Cã nhÊn phÝm
Ghi ©m
F
T
T×m d÷ liÖu
T
T
Th«ng b¸o kÕt qu¶
Chê cuéc gäi míi
T
KÕt thóc
F
H×nh 3.1. Lu ®å gi¶i thuËt cña ch¬ng tr×nh
Giao tiÕp gi÷a ®iÖn tho¹i vµ m¸y tÝnh
C«ng viÖc giao tiÕp gi÷a ®iÖn tho¹i vµ m¸y tÝnh ®îc thùc hiÖn th«ng qua c¸c hµm cÊp thÊp cña Windows. C¸c hµm nµy ®îc chøa trong th viÖn Tapi32.lib cña Windows. C¸c khai b¸o ®Æc t¶ liªn quan ®îc cung cÊp trong file Tapi.h
lineInitialize()
lineCallBack()
lineNegotiateAPIVersion()
lineGetDevcaps()
lineOpen()
lineSetStatusMessages()
lineAnswer()
lineModitorDigits()
lineDeallocateCall()
lineClose()
lineShutdowns()
§Ó tiÕn hµnh c«ng viÖc giao tiÕp gi÷a m¸y tÝnh vµ ngêi gäi th× tríc hÕt ta ph¶i t¹o ®îc mét kÕt nèi gi÷a m¸y tÝnh vµ ®iÖn tho¹i víi sù hç trî cña c¸c hµm TAPI. Nh»m t¹o mét phiªn lµm viÖc gi÷a m¸y tÝnh vµ ®iÖn tho¹i ®Ó cã thÓ nhËn ®îc c¸c m· DTMF vµ truyÒn tiÕng nãi tíi ngêi gäi. Qu¸ tr×nh kÕt nèi mét cuéc gäi ®îc tiÕn hµnh tõ kh©u khëi t¹o c¸c hµm TAPI ®Õn lóc kÕt thóc nã.
1. Khëi t¹o ®êng truyÒn (line)
Mäi ho¹t ®éng giao tiÕp gi÷a ®iÖn tho¹i vµ m¸y tÝnh muèn diÔn ra th× tríc hÕt cÇn khëi t¹o ®êng truyÒn gi÷a m¸y tÝnh vµ ®iÖn tho¹i. ViÖc kÕt nèi ®iÖn tho¹i vµ m¸y tÝnh ®îc thùc hiÖn th«ng qua mét thiÕt bÞ trung gian gäi lµ Modem. Mét m¸y tÝnh cã thÓ cã g¾n nhiÒu h¬n mét Modem. Do ®ã, ta cÇn ph¶i lÊy vÒ tæng sè ®êng line mµ nã ph¸t hiÖn cã trong m¸y b»ng c¸ch gäi hµm lineInitialize().
Ta sÏ ®Þnh nghÜa mét hµm gäi lµ lineCallBack() ®Ó tiÕp nhËn c¸c sù kiÖn ®îc sinh ra bëi c¸c ho¹t ®éng cña TAPI (ch¼ng h¹n: khi cã m· DTMF ®îc göi tíi…). Gi¸ trÞ tr¶ vÒ cña hµm nµy sÏ ®îc ®a vµo hµm lineInitialize() nh lµ mét tham sè.
Sau khi khëi t¹o thµnh c«ng, hµm lineInitialize() sÏ tr¶ vÒ mét Handle cña TAPI ®· n¹p vµo bé nhí vµ nã sÏ ®îc sö dông trong suèt qu¸ tr×nh thùc hiÖn viÖc giao tiÕp.
KiÓm tra ®êng truyÒn (line) hîp lÖ
Sau khi ®· lÊy ®îc tæng sè ®êng truyÒn (line) trong hÖ thèng. øng dông b¾t ®Çu vßng lÆp qua tÊt c¶ c¸c line b»ng c¸ch gäi hai hµm lineNegitiateAPIVersion() vµ lineGetDevcaps() ®Ó t×m line thÝch hîp cho viÖc kÕt nèi.
øng víi mçi line, hµm lineNegitiateAPIVersion() sÏ tr¶ vÒ phiªn b¶n API mµ nã hç trî cho øng dông. Víi mçi phiªn b¶n lÊy ®îc ta gäi hµm lineGetDevcaps() ®Ó kiÓm tra vµ tr¶ vÒ nh÷ng chøc n¨ng ®îc hç trî trªn line nµy.
Më line
Sau khi ®· chän ®îc line thÝch hîp, ta gäi hµm lineOpen() ®Ó më line ®ã vµ tiÕn hµnh c«ng viÖc giao tiÕp gi÷a ®iÖn tho¹i vµ m¸y tÝnh. NÕu më thµnh c«ng hµm lineOpen() sÏ tr¶ vÒ mét handle cña line ®îc më vµ nã sÏ ®iÒu khiÓn mäi ho¹t ®éng diÔn ra trªn line ®ã.
§¨ng ký c¸c sù kiÖn cho TAPI
Mäi sù kiÖn liªn quan ®Õn TAPI ®îc göi ®Õn hµm lineCallBack() ®Òu ph¶i ®îc ®¨ng ký sau khi më line. C«ng viÖc nµy ®îc thùc hiÖn b»ng lêi gäi hµm lineSetStatusMessages() vµ ®a vµo c¸c sù kiÖn m« t¶ mµ ta cÇn. Gi¸ trÞ nµy thùc chÊt lµ mét d·y c¸c 32 bit liªn tiÕp, mçi bit t¬ng øng víi mét sù kiÖn cña TAPI.
KÕt nèi víi cuéc gäi ®Õn
Khi cã tÝn hiÖu gäi tíi, th«ng ®iÖp LINEDEVSTATE_RINGING sÏ ®îc göi tíi hµm lineCallBack() cïng víi mét handle cña cuéc gäi ®ã. NÕu sè tiÕng chu«ng reo b»ng con sè mµ ta chän tríc th× hÖ thèng sÏ gäi hµm lineAnswer() víi handle võa nhËn ®îc ®Ó kÕt nèi víi cuéc gäi ®Õn. Lóc nµy ta cã thÓ göi nhËn c¸c m· DTMF hoÆc c©u tr¶ lêi cho ngêi gäi.
Thu nhËn c¸c m· DTMF
§Ó gi¸m s¸t vµ thu nhËn c¸c m· DTMF ®îc göi tíi ta sö dông hµm lineMonitorDigits(). HÖ thèng sÏ tiÕp nhËn yªu cÇu cña ngêi gäi th«ng qua c¸c m· DTMF. V× vËy, khi ngêi gäi nhÊn mét phÝm nµo ®ã trªn bµn phÝm ®iÖn tho¹i th× ngay lËp tøc th«ng ®iÖp LINE_MONITORDIGITS ®îc göi tíi hµm lineCallBack() cïng víi c¸c m· DTMF t¬ng øng.
PhÝm
M· DTMF (Hex)
0
30
1
31
2
32
3
33
4
34
5
35
6
36
7
37
8
38
9
39
*
2A
#
23
KÕt thóc cuéc gäi
Khi ngêi gäi nhÊn phÝm yªu cÇu kÕt thóc cuéc gäi tõ menu hoÆc g¸c m¸y bÊt k× lóc nµo. HÖ thèng sÏ nhËn biÕt tÝn hiÖu kÕt thóc vµ gäi hµm lineDrop() ®Ó huû bá cuéc gäi nµy vµ hµm lineDeallocateCall() ®Ó gi¶i phãng cuéc gäi khái bé nhí. B©y giê hÖ thèng sÏ trë vÒ tr¹ng th¸i chê ®îi mét cuéc gäi kh¸c.
§ãng line hiÖn t¹i
NÕu muèn chän line kh¸c ®Ó kÕt nèi hoÆc kÕt thóc ho¹t ®éng cña hÖ thèng, sö dông hµm lineClose() ®Ó ®ãng line hiÖn t¹i ®ang ®îc më. Lóc nµy hÖ thèng hoµn tr¶ l¹i tµi nguyªn cho m¸y.
KÕt thóc TAPI
Sau khi khëi t¹o TAPI b»ng hµm lineInitialize(), mét sè tµi nguyªn cña hÖ thèng sÏ bÞ chiÕm dông suèt phiªn lµm viÖc. Khi tho¸t ch¬ng tr×nh ta gäi hµm lineShutdown( ) ®Ó kÕt thóc phiªn lµm viÖc vµ gi¶i phãng tµi nguyªn hÖ thèng.
10. Mét sè Modul chÝnh:
Khëi t¹o TAPI
‘ khëi t¹o TAPI
‘ më line
‘ kÕt thóc TAPI
Public Sub myInit(fSetup As Boolean)
Dim nError As Long
Dim lpExtensionID As lineextensionid
Dim lUnused As Long
Dim lLineID As Long
lLineID = GetSetting("VB-TAPI", "Settings", "DeviceID", "0")
If m_TapiInit = False Then ‘nÕu cha khëi t¹o TAPI
DoEvents
nError = lineInitialize(hTAPI, App.hInstance, _
AddressOf LineCallBack, 0, lNumLines) ‘khëi t¹o TAPI
If nError 0 Then ‘ khëi t¹o kh«ng thµnh c«ng
ProcessTAPIError nError
err.Raise nError, "Init TAPI", "Can not initialize TAPI"
Else
DebugString 4, "lineInitialize -> Success"
End If
‘ qu¸ tr×nh duyÖt qua tÊt c¶ c¸c line ®Ó t×m line thÝch hîp
setupHack:
nError = lineNegotiateAPIVersion(hTAPI, lLineID, TAPIVERSION, _
TAPIVERSION, lNegVer, lpExtensionID) ‘lÊy phiªn b¶n TAPI hç trî cho øng dông
If nError 0 Then
If fSetup = True Then
lLineID = lLineID + 1 ' chuyen sang line tiep theo
If lLineID <= lNumLines Then GoTo setupHack
End If
ProcessTAPIError nError
err.Raise nError, "Init TAPI", "Can not negotiate TAPI version 1.4"
Else
If fSetup = True Then Exit Sub 'Just init for dlgSetup
‘ më line hiÖn t¹i
nError = lineOpen(hTAPI, lLineID, hLine, lNegVer, lUnused, lUnused, LINECALLPRIVILEGE_OWNER, LINEMEDIAMODE_AUTOMATEDVOICE, 0)
If nError 0 Then ProcessTAPIError nError
End If
lpLineDevCaps.dwTotalSize = Len(lpLineDevCaps)
nError = lineGetDevCaps(hTAPI, lLineID, lNegVer, lUnused, lpLineDevCaps)
If nError 0 Then ProcessTAPIError nError
nError = lineSetStatusMessages(hLine, lpLineDevCaps.dwLineStates, 0)
If nError 0 Then
ProcessTAPIError nError
err.Raise nError, "Init TAPI", "Can not setup for status messages"
End If
m_TapiInit = True
DebugString 3, "m_TapiInit=" & CStr(m_TapiInit)
optAnswer.Enabled = False
optListen.Enabled = False
mnuFile.Enabled = False
mnuTools.Enabled = False
cmdExit.Enabled = False
cmdOnOff.Caption = "&Off"
frmMain.lblState = "§ang chê cuéc gäi míi..."
Else 'TAPI is already initialized, shut it down
If hTAPI 0 Then
nError = lineShutdown(hTAPI)
If nError 0 Then ProcessTAPIError nError
hTAPI = 0
m_TapiInit = False
optAnswer.Enabled = True
optListen.Enabled = True
mnuFile.Enabled = True
mnuTools.Enabled = True
cmdExit.Enabled = True
cmdOnOff.Caption = "&On"
frmMain.lblState = "Cha ®Æt tr¹ng th¸i chê cuéc gäi..."
End If
End If
End Sub
TiÕp nhËn c¸c sù kiÖn cña TAPI
'tiep nhan cac su kien cua TAPI
Public Function LineCallBack(ByVal dwDevice As Long, ByVal dwMessage As Long, _
ByVal dwInstance As Long, ByVal dwParam1 As Long, ByVal dwParam2 As Long, _
ByVal dwParam3 As Long) As Long
Select Case dwMessage
Case TapiEvent.LINE_CALLINFO ‘th«ng tin cuéc gäi
If dwParam1 = LINECALLINFOSTATE_CALLERID Then
GetCallerInfo dwDevice
Else
DebugString 5, "LINE_CALLINFO -> " & CStr(dwParam1)
End If
Case TapiEvent.LINE_CALLSTATE ‘tr¹ng th¸i cuéc gäi
LineCallStateProc dwDevice, dwInstance, dwParam1, dwParam2, dwParam3
Case TapiEvent.LINE_GENERATE
If frmMain.optListen.Value = True Then
RecordMessage
End If
Case TapiEvent.LINE_LINEDEVSTATE
LineDevStateProc dwDevice, dwInstance, dwParam1, dwParam2, dwParam3
Case TapiEvent.LINE_MONITORDIGITS
sSecret = sSecret & CStr(Chr(LoWord(dwParam1)))
lTollSaver = 0 'Reset the toll saver counter
frmMain.lblKeys = sSecret
If frmMain.optAnswer.Value = True Then
ReceiveDTMF sSecret ‘nhËn m· DTMF
End If
End Select
End Function
TiÕp nhËn c¸c sù kiÖn liªn quan ®Õn line
Public Sub LineDevStateProc(ByVal dwDevice As Long, ByVal dwInstance As Long, ByVal dwParam1 As Long, ByVal dwParam2 As Long, ByVal dwParam3 As Long)
Select Case dwParam1
Case LINEDEVSTATE_RINGING: ‘chu«ng reo -> sè chu«ng= dwParam3
DebugString 3, "Ring Count = " & CStr(dwParam3)
frmMain.lblState = "§ang ®æ chu«ng..."
If frmMain.lblMsgCount > 0 Then
If dwParam3 >= frmSetup.txtTollSaver Then
Answer
frmMain.lblSecond = 0
frmMain.timeCall = True
End If
Else
If dwParam3 >= frmSetup.txtRTA Then
Answer
frmMain.lblSecond = 0
frmMain.timeCall = True
End If
End If
End Select
End Sub
TiÕp nhËn c¸c sù kiÖn liªn quan ®Õn cuéc gäi
Public Sub LineCallStateProc(ByVal dwDevice As Long, ByVal dwInstance As Long, ByVal dwParam1 As Long, ByVal dwParam2 As Long, ByVal dwParam3 As Long)
Select Case dwParam1
Case LINECALLSTATE_OFFERING: ‘ tÝn hiÖu cã cuéc gäi tíi
DebugString 3, "LINECALLSTATE_OFFERING:"
CallIDName = "UNKNOWN"
CallIDNumber = "UNKNOWN"
hCall = dwDevice
Case LINECALLSTATE_CONNECTED: ‘tr¹ng th¸i ®· kÕt nèi
fInTollSaver = False
frmMain.lblName.Caption = CallIDName
frmMain.lblNumber.Caption = CallIDNumber
frmMain.LblTime.Caption = Now
frmMain.lblState = "KÕt nèi thµnh c«ng - lêi chµo..."
PlayMenu
If frmMain.optAnswer.Value = True Then
frmMain.lblState = "KÕt nèi thµnh c«ng - nhËn gâ phÝm..."
Else
frmMain.lblState = "KÕt nèi thµnh c«ng - ghi cuéc gäi..."
End If
frmMain.lblMsgCount.Caption = Val(frmMain.lblMsgCount.Caption) + 1
Case LINECALLSTATE_DISCONNECTED: ‘tr¹ng th¸i ng¾t kÕt nèi
‘ huû vµ gi¶i phãng cuéc gäi hiÖn t¹i
‘thiÕt lËp mét sè tr¹ng th¸i vµ chê cuéc gäi míi
frmMain.lblState = "KÕt thóc cuéc gäi. Chê cuéc gäi míi..."
Call waveInReset(h_wavein)
If fInTollSaver = True Then
DropCall
End If
End Select
End Sub
Tr¶ lêi cuéc gäi
Public Sub Answer()
On Error Resume Next
Dim nError As Long
nError = lineAnswer(hCall, "", 0)
If nError < 0 Then ProcessTAPIError nError
MonitorDigits
End Sub
Huû vµ gi¶i phãng line hiÖn t¹i
‘hñy vµ gi¶i phãng line hiÖn t¹i cïng víi tµi nguyªn hÖ thèng
Public Sub DropCall()
Call lineDrop(hCall, "", 0)
Call lineDeallocateCall(hCall)
End Sub
NhËn m· DTMF
Public Sub ReceiveDTMF(strKey As String)
Dim rsVOICE As ADODB.Recordset
Dim sSql As String
On Error GoTo EH
sSql = "SELECT * FROM tbVOICES WHERE KEYS='" & strKey & "'"
Set rsVOICE = New ADODB.Recordset
rsVOICE.Open sSql, MyConn
If rsVOICE.RecordCount > 0 Then
PlayVoice Trim(rsVOICE.Fields("FILENAME"))
frmMain.lblAnswer = Trim(rsVOICE.Fields("CONTENT"))
strKey = ""
End If
Exit Sub
EH:
MsgBox "Error " & CStr(err.Number) & " : " & err.Description
End Sub
Mét sè giao diÖn chÝnh cña ch¬ng tr×nh
Khi ch¹y ch¬ng tr×nh, tr¹ng th¸i ban ®Çu cña nã nh sau:
§Ó thùc hiÖn kÕt nèi thµnh c«ng th× tríc hÕt ta ph¶i vµo Tools/ Config…. Khi ®ã mét hép tho¹i cÊu h×nh hiÖn ra yªu cÇu ta chän lo¹i Modem kÕt nèi, sè tiÕng chu«ng reo vµ thêi gian rçi tèi ®a. Giao diÖn cña nã nh sau:
Ch¬ng tr×nh thu ©m:
øng dông cã thÓ thu ®îc ©m th«ng qua ch¬ng tr×nh thu ©m (Record) cã giao diÖn nh sau:
Chóng ta cã thÓ tiÕn hµnh thu vµ ph¸t ©m thanh th«ng qua ch¬ng tr×nh Record. Ch¬ng tr×nh nµy ®îc x©y dùng ®Ó thu ©m thanh theo cÊu tróc phï hîp víi viÖc ph¸t qua ®iÖn tho¹i.
Sau khi tiÕn hµnh xong c«ng viÖc chän cÊu h×nh cho m¸y, ta chän chÕ ®é tr¶ lêi (Answering) hay chÕ ®é nghe (Listening). Sau ®ã ta kÝch ho¹t “On button”, khi ®ã øng dông sÏ chuyÓn sang tr¹ng th¸i chê cuéc gäi. T¹i ®©y ta cã thÓ tiÕn hµnh c«ng viÖc gäi tíi sè m¸y ®ang kÕt nèi víi m¸y tÝnh nµy tõ bÊt kú mét ®iÖn tho¹i nµo. Sau khi nhËn ®îc tÝn hiÖu DTMF tõ phÝm ®iÖn tho¹i tæng ®µi sÏ kiÓm tra tr¹ng th¸i cña m¸y ®îc gäi tíi vµ cÊp tÝn hiÖu chu«ng, khi ®ã tr¹ng th¸i th«ng b¸o thµnh c«ng sÏ ®îc thÓ hiÖn nh sau:
Sau khi kÕt nèi thµnh c«ng, øng dông sÏ tiÕn hµnh ph¸t file “Lêi chao.wav” cïng mét sè th«ng b¸o cÇn thiÕt. VÝ dô: chøc n¨ng cña mét sè phÝm, nhÊn phÝm nµo ®Ó ng¾t kÕt nèi, nhÊn phÝm nµo ®Ó kÕt nèi l¹i … trªn c¬ së ®ã, øng dông cho phÐp chóng ta nhÊn phÝm t¬ng øng víi chøc n¨ng cÇn t×m.
MÆt kh¸c, giao diÖn trªn cña øng dông cßn cho chóng ta biÕt thêi ®iÓm thùc hiÖn cuéc gäi, cuéc gäi ®îc tiÕn hµnh trong kho¶ng thêi gian bao nhiªu gi©y (Second), th«ng tin ngêi gäi, …
Ch¬ng tr×nh cËp nhËt d÷ liÖu:
Ch¬ng tr×nh ®îc thiÕt kÕ ®¬n gi¶n gåm c¸c chøc n¨ng thªm, xo¸, söa c¬ së d÷ liÖu. §îc minh häa nh sau:
§¸nh gi¸ hÖ thèng
Sau khi hoµn tÊt ch¬ng tr×nh thö nghiÖm, em cã mét sè nhËn xÐt nh sau:
+ u ®iÓm:
Ch¹y ®îc trªn c¸c phiªn b¶n Windows kh¸c nhau
Ch¬ng tr×nh sö dông giao tiÕp là modem ®Ó thùc hiÖn kÕt nèi nªn ngêi dïng chØ cÇn trang bÞ mét modem (internal/external) víi gi¸ kh«ng qu¸ cao.
Cho phÐp cËp nhËt th«ng tin cÇn thiÕt khi hÖ thèng ®ang ho¹t ®éng th«ng qua viÖc nhÊn phÝm.
Cho phÐp thu ©m th«ng qua ch¬ng tr×nh thu ©m vµ ph¸t l¹i nã. §Æc biÖt nã cã thÓ thu l¹i tiÕng nãi cña cuéc gäi ®Õn trong trêng hîp ta chän chÕ ®é nghe.
+ H¹n chÕ:
V× ch¬ng tr×nh sö dông Modem lµm trung gian ®Ó giao tiÕp nªn t¹i mét thêi ®iÓm x¸c ®Þnh, øng dông chØ tiÕp nhËn ®îc mét cuéc gäi.
V× thêi gian cã h¹n nªn tiÕng nãi thu vµo cha ®îc läc ®Ó cã chÊt lîng cao h¬n.
Do ®©y chØ lµ mét ch¬ng tr×nh mang tÝnh chÊt m« pháng, nªn th«ng tin ngêi gäi vµ sè gäi ®Õn vÉn cha ®îc cËp nhËt …
Ch¬ng tr×nh vÉn cha ®i s©u vµo x©y dùng vµ xö lÝ mét c¬ së d÷ liÖu lín.
+ Híng ph¸t triÓn:
Hç trî telephone Card nh»m kÕt nèi víi nhiÒu cuéc gäi tíi ë cïng mét thêi ®iÓm.
X©y dùng cËp nhËt tèi ®a c¬ së d÷ liÖu, n©ng øng dông ë møc ®é mét ch¬ng tr×nh minh häa lµm cho nã hoµn thiÖn h¬n vµ cã thÓ øng dông vµo thùc tÕ.
CËp nhËt ®îc th«ng tin cña cuéc gäi ®Õn: chñ m¸y, sè m¸y…
KÕt luËn
Ch¬ng tr×nh “T×m hiÓu vÒ TAPI vµ x©y dùng m« h×nh thö nghiÖm tr¶ lêi ®iÖn tho¹i tù ®éng qua m¸y tÝnh” ®· ®îc hoµn thµnh, cã thÓ cµi ®Æt ®Ó ch¹y trªn bÊt kú hÖ ®iÒu hµnh Windows 32-bit nµo. Víi nh÷ng yªu cÇu ®Æt ra cña ®Ò tµi, ch¬ng tr×nh chØ míi ®îc hoµn thiÖn ë møc ®é lµ m« h×nh minh häa dùa trªn viÖc nghiªn cøu vµ t×m hiÓu vÒ TAPI.
Tuy nhiªn, ®Ò tµi nµy lµ mét ®Ò tµi rÊt hay vµ thiÕt thùc. Trong qu¸ tr×nh t×m hiÓu, nghiªn cøu, em ®· cã dÞp «n l¹i rÊt nhiÒu kiÕn thøc ®· häc còng nh biÕt thªm ®îc nhiÒu kiÕn thøc míi nh: t¹o vµ xö lý file ©m thanh, c¸c kü thuËt lËp tr×nh trong Visual Basic, c¸c kiÕn thøc vÒ TAPI vµ c¸c hµm Windows cÊp thÊp ®îc sö dông ®Ó thu/ ph¸t file ©m thanh còng nh thùc hiÖn viÖc kÕt nèi ®iÖn tho¹i víi m¸y tÝnh. Trªn c¬ së ®ã ®· gióp em hiÓu thªm ®îc phÇn nµo vÒ ho¹t ®éng cña c¸c hép th tho¹i (voice mail) vµ hÖ thèng tr¶ lêi tù ®éng (answering machine), c«ng nghÖ ®iÖn tho¹i IP, c«ng nghÖ tæng hîp tiÕng nãi Text – to Speech, … hiÖn nay ®ang ®îc sö dông vµ chó träng ph¸t triÓn.
Tuy ®Ò tµi ®îc khÐp l¹i song vÉn tån t¹i nhiÒu vÊn ®Ò cÇn ®îc gi¶i quyÕt vµ ph¸t triÓn ®Ó hoµn thiÖn nã thµnh mét øng dông. Cô thÓ: sö dông telephony card ®Ó hç trî cho viÖc tiÕp nhËn nhiÒu cuéc gäi t¹i mét thêi ®iÓm, øng dông ®îc c«ng nghÖ tæng hîp tiÕng nãi Text – to – Speech, x©y dùng ®îc chøc n¨ng thu l¹i néi dung cuéc gäi, … Nh»m ph¸t triÓn thµnh mét øng dông cã thÓ gi¶i quyÕt ®îc mét sè bµi to¸n trong thùc tÕ nh: th«ng b¸o ®iÓm, lÞch thi cho sinh viªn; th«ng b¸o kÕ ho¹ch cho gi¸o viªn, …§ã lµ môc tiªu vµ híng ph¸t triÓn mµ bÊt cø mét ch¬ng tr×nh nµo còng ph¶i cã.
Tµi liÖu tham kh¶o
CDs MSDN 10/2001
E-book : “MAPI, SAPI, and TAPI Developer's Guide” (Michael Amundsen -
TAPI reference (
TAPI description (
TAPI reference and examples (
The Canonical WAVE File Format (
Audio Interchange File Format (
Modem truyÒn sè liÖu (NguyÔn Hång S¬n - Hoàng §øc H¶i)
Microsoft Visual Basic 6.0 & LËp tr×nh c¬ së d÷ liÖu (NguyÔn ThÞ Ngäc Mai)
10. BÝ quyÕt lËp tr×nh Visual Basic 6.0 (NguyÔn TiÕn - §Æng Xu©n Hêng – NguyÔn V¨n Hoài – Tr¬ng Ngäc V©n)
11. Kü x¶o lËp tr×nh VB6 (Ph¹m H÷u Khang)
Môc lôc
Lêi nãi ®Çu 1
I. Giao tiÕp lËp tr×nh cho hÖ thèng ®iÖn tho¹i TAPI 3
1. TAPI lµ g×? 3
2. Ch¬ng tr×nh øng dông TAPI 4
3. TAPI DLL (Dynamic Link Library) 4
4. MSP (Media Service Provider) 4
5. MSPI (Media Service Provider Interface) 5
6. TAPI Server …………………………………………………....5
7. TSP (Telephony Service Provider) 6
8. TSPI (Telephony Service Provider Interface) 6
9. Service Providers 6
II. §iÖn tho¹i IP (Internet Protocol) 7
1. IP Telephony lµ g×? 7
2. C¸c øng dông cña ®iÖn tho¹i IP 9
3. Lîi Ých cña IP Telephony 10
4. ¦u nhîc ®iÓm cña ®iÖn tho¹i IP 11
III. M« h×nh lËp tr×nh cho hÖ thèng ®iÖn tho¹i 12
IV. M« h×nh øng dông TAPI 14
1. Khëi t¹o TAPI (TAPI Initialization) 14
2. §iÒu khiÓn phiªn lµm viÖc (Session Control) 15
3. §iÒu khiÓn thiÕt bÞ (Device Control) 15
4. §iÒu khiÓn ph¬ng tiÖn (Media Control) 15
5. KÕt thóc TAPI (TAPI Shutdown) 16
V. C¸c phiªn b¶n TAPI 16
VI. Kü thuËt göi sè b»ng xung lìng ®a ©m tÇn DTMF 17
1. HÖ thèng DTMF lµ g×? 17
2. So s¸nh thêi gian göi sè 19
3. Ph¬ng thøc lµm viÖc cña thuª bao 19
Ch¬ng 2: T×m hiÓu vÒ tiÕng nãi……………………………..22
I. §Æc tÝnh cña tiÕng nãi 22
II. C«ng nghÖ tæng hîp tiÕng nãi Text – to – Speech 23
III. øng dông c«ng nghÖ Text – to – Speech 24
IV. Giíi thiÖu vÒ File Wave (*.Wav) 25
1. Kh¸i niÖm vÒ file Wave vµ file RIFF 25
2. CÊu tróc file Wave 26
2.1. Chunk Format 27
2.2. Chunk Data 28
3. C¸c ph¬ng ph¸p ph¸t mét file Wave 31
3.1. Dïng hµm sndPlaySound hoÆc PlaySound 31
3.2. Dïng MCI (Media Control Interface) 31
3.3. Dïng c¸c hµm cÊp thÊp cña Windows 32
4. C¸ch ®äc file Wave vµo bé nhí 33
5. Ph¬ng ph¸p thu ©m 34
6. Ch¬ng tr×nh chÝnh 35
Ch¬ng3: Thö nghiÖm hÖ thèng th«ng b¸o tù ®éng qua ®iÖn tho¹i..…………………………………………………….40
I. Lu ®å gi¶i thuËt cña ch¬ng tr×nh 40
II. Giao tiÕp gi÷a ®iÖn tho¹i vµ m¸y tÝnh 42
1. Khëi t¹o ®êng truyÒn (line)…………………..……………..42
2. KiÓm tra ®êng truyÒn (line) hîp lÖ 43
3. Më line 43
4. §¨ng kÝ c¸c sù kiÖn cho TAPI 43
5. KÕt nèi víi cuéc gäi ®Õn 43
6. Thu nhËn c¸c m· DTMF 44
7. KÕt thóc cuéc gäi 44
8. §ãng line hiÖn t¹i 45
9. KÕt thóc TAPI 45
10. Mét sè Modul chÝnh 45
III. Mét sè giao diÖn chÝnh cña ch¬ng tr×nh 52
IV. §¸nh gi¸ hÖ thèng 57
KÕt luËn 58
Tµi liÖu tham kh¶o 59
Các file đính kèm theo tài liệu này:
- Luan van.doc
- Bao cao.PPT