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

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”.

doc62 trang | Chia sẻ: lvcdongnoi | Lượt xem: 2369 | Lượt tải: 0download
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 ch­a ®­î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 tr­ng 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 nh­ng 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 nh­ng 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 nh­ng ®­î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 tr­ng 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, nh­ng 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 tr­ng 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í ®Ó l­u 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 l­u 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 l­u 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 l­u 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 l­u 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 l­u 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 l­u d¹ng BYTE hoÆc WORD nªn khi khi l­u tr÷ vÉn ph¶i l­u 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 l­u 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 8 16 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 nh­ng 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 ®Ó l­u 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í ®Ó l­u 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 L­u ®å 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 L­u ®å 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. L­u ®å 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 ch­a 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 = "Ch­a ®Æ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 ch­a ®­î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 ch­a ®­îc cËp nhËt … Ch­¬ng tr×nh vÉn ch­a ®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. L­u ®å 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:

  • docLuan van.doc
  • pptBao cao.PPT