Đề 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

Tài liệu Đề 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: 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 ứn...

doc68 trang | Chia sẻ: hunglv | Lượt xem: 1021 | Lượt tải: 0download
Bạn đang xem trước 20 trang mẫu tài liệu Đề 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, để tải tài liệu gốc về máy bạn click vào nút DOWNLOAD ở trên
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”. Để hoàn thành được đề tài này, em đã nhận được sự giúp đỡ nhiệt tình , những lời động viên khích lệ của thầy giáo – Thạc sỹ Hoàng Hữu Việt – người đã trực tiếp hướng dẫn em cùng với các thầy cô giáo trong khoa Công Nghệ Thông Tin và các thành viên lớp 43A. Qua đây, cho phép em được bày tỏ lòng biết ơn sâu sắc tới thầy giáo Hoàng Hữu Việt, là người đã định hướng và tận tình giúp đỡ em trong quá trình học tập và nghiên cứu. Cảm ơn các thầy, cô giáo khoa Công nghệ Thông tin trường Đại Học Vinh đã giảng dạy và chỉ bảo những vấn đề liên quan đến đề tài. Xin cảm ơn người thân và bạn bè đã giúp đỡ và tạo điều kiện cho em trong suốt quá trình học tập và hoàn thành khoá luận. Em xin chân thành cảm ơn. Mặc dù trong quá trình thực hiện đề tài đã có nhiều cố gắng. Song, do hạn chế về mặt trình độ của bản thân cũng như thời gian thực hiện; nên chắc chắn không thể tránh khỏi những thiếu sót. Vậy, em rất mong nhận được sự quan tâm, giúp đỡ và đóng góp ý kiến từ phía thầy, cô giáo và các bạn sinh viên. Nhằm làm cho đề tài hoàn thiện hơn và có thể phát triển thành một ứng dụng lớn có tính khả thi. Vinh, tháng 5 năm 2006 Sinh viên thực hiện: Nguyễn Văn Hùng Chương 1: TỔNG QUAN VỀ TAPI Giao tiếp lập trình cho hệ thống điện thoại TAPI (Telephony Application Program Interface) TAPI là gì? TAPI được phát triển bởi sự kết hợp của hai hãng Intel và Microsoft. Nó được thiết kế để truy xuất các dịch vụ điện thoại trên tất cả các hệ điều hành Windows. Nói cách khác, TAPI là tập hợp các hàm riêng lẽ được Windows cung cấp để hỗ trợ cho việc giao tiếp giữa điện thoại và máy tính thông qua Modem hoặc các thiết bị truyền thông. Với TAPI người lập trình không cần để ý nhiều đến các tập lệnh của Modem để khởi tạo nó hoặc chọn cổng hoạt động cho Modem. Mục đích của TAPI là cho phép các nhà lập trình viết các ứng dụng mà không cần quan tâm chi tiết đến các thiết bị phần cứng. Chẳng hạn, với Modem người lập trình không cần biết Modem loại nào? của hãng nào? tập lệnh của Modem là gì?…chỉ cần thiết bị phần cứng đó có một TAPI driver hay còn gọi là TSP (Telephony Service Provider) do nhà sản xuất cung cấp, mà khi cài đặt các thiết bị phần cứng thì đồng thời các Driver cũng được cài đặt. TAPI hỗ trợ hệ thống đàm thoại H.323 và giao thức đàm thoại đa điểm (Mutilcast). Nó kết hợp cả việc truyền số liệu lẫn tiếng nói ở nhiều loại thiết bị đầu cuối khác nhau, hỗ trợ các kiểu kết nối phức tạp và các kỹ thuật quản lí cuộc gọi như: tạo cuộc gọi, chờ cuộc gọi, thư thoại, …Các ứng dụng được viết bởi TAPI có thể truy cập trực tiếp được vào các dịch vụ trên đường dây điện thoại, khi đó nó có thể phát ra và nhận vào mọi tín hiệu của điện thoại. Dù đường dây điện thoại truyền tín hiệu dạng tương tự (Analog) hay dạng số (Digital) thì ta cũng cần có một thiết bị trung gian hỗ trợ cho việc giao tiếp giữa đường dây điện thoại và máy tính. Tuy nhiên, thiết bị giao tiếp đó phải có hỗ trợ TAPI TSP. Nó có thể là một trạm ISPN, một bảng mạch hệ thống điện thoại hoặc đơn giản là một Modem. Chương trình ứng dụng TAPI Ứng dụng TAPI là ứng dụng mà có sử dụng giao tiếp lập trình hệ thống điện thoại nhằm thực hiện một công việc gì đó. Ví dụ: phần mềm giả lập điện thoại trong mạng điện thoại chuyển mạch công cộng (PSTN), phần mềm gửi/ nhận Fax, hộp thư thoại, hệ thống trả lời tự động, điện thoại qua Internet (VoIP),… TAPI DLL (Dynamic Link Library – Thư viện liên kết động) Các thư viện này cùng với TAPI Server (Tapisvr.exe) là trừu tượng hoá trong việc phân cách giữa người dùng và các nhà cung cấp dịch vụ điện thoại. Một thư viện TAPI liên kết với TAPI Server để cung cấp một giao tiếp giữa hai lớp (thể hiện ở mô hình lập trình cho hệ thống điện thoại được đề cập ở phần sau). Có ba thư viện liên quan tới TAPI là: Tapi.dll, Tapi32.dll, Tapi3.dll; mỗi thư viện đều có vai trò như nhau (được minh họa ở hình 1.1). Mỗi thư viện này tương ứng với mỗi thời điểm phiên bản của TAPI. Các ứng dụng 16-bit liên kết với Tapi.dll. Trong Windows 98/ NT/ 2000, Tapi.dll sẽ chuyển các yêu cầu tới Tapi32.dll. Với các ứng dụng 32-bit thì chúng sẽ liên kết với Tapi32.dll (TAPI phiên bản 1.4 – 2.2). Với phiên bản 3.0 và 3.1 thì chúng sẽ liên kết với Tapi3.dll. MSP (Media Service Provider) Trước hết, MSP chỉ đến với TAPI 3, nó cho phép việc điều khiển một ứng dụng qua phương tiện với cơ chế vận chuyển đặc biệt. Một MSP luôn luôn tồn tại song song với một TSP (TAPI Service Provider). Một TSP cho phép việc điều khiển phương tiện thông qua việc điều khiển thiết bị cuối và các giao tiếp luồng được định nghĩa bởi TAPI. Ứng dụng TAPI 32-bit Ứng dụng TAPI 16-bit Ứng dụng TAPI 32-bit Tapi3.dll Tapi.dll Tapi32.dll MSP Tapi32.dll TAPISVR.EXE Registry TSP Telephony Control Panel, Dialing, Properties, etc… Kernel mode driver Hình 1.1. Mô hình các thư viện liên kết động (Tapi dll) MSPI (Media Service Provider Interface) MSPI là tập hợp các giao tiếp và các phương thức được thực hiện bởi MSP nhằm cho phép việc điều khiển một ứng dụng TAPI 3 trên phương tiện trong suốt phiên liên lạc truyền thông. TAPI Server TAPI Server được xem như kho trung tâm lưu trữ các thông tin về hệ thống điện thoại trên máy người dùng. Tiến trình của dịch vụ này giám sát các tài nguyên cục bộ và ở xa của hệ thống điện thoại, giám sát các ứng dụng của TAPI, và thực hiện một giao tiếp phù hợp với TSP (mối liên hệ giữa TAPI Server và các thành phần khác được thể hiện ở mô hình lập trình hệ thống điện thoại). Trong Windows 95/ 98/ NT, TAPI Server (Tapisvr.exe) sẽ chạy như một tiến trình riêng biệt. Trong Windows 2000, nó chạy trong ngữ cảnh của Svchost.exe. Khi ứng dụng nạp TAPI DLL và thực hiện công việc khởi tạo xong, DLL sẽ xây dựng một kết nối tới TAPI Server. Sau đó, TAPI Server sẽ nạp các TSP. TSP (Telephony Service Provider) TSP thực chất là một thư viện liên kết động hỗ trợ điều khiển các thiết bị truyền thông thông qua một tập các hàm dịch vụ. Ứng dụng TAPI sử dụng các lệnh được chuẩn hoá, và TSP điều khiển các lệnh đặc trưng mà cần phải được trao đổi với thiết bị. TSPI (Telephony Service Provider Interface) TSP phải tạo ra một giao tiếp TSP phù hợp để thực hiện chức năng như một nhà cung cấp dịch vụ trong môi trường hệ thống điện thoại TSPI định nghĩa ra các hàm ngoại mà hỗ trợ TSP. Service Providers Đây được xem như là các bộ phận cung cấp các dịch vụ cần thiết để thực hiện việc điều khiển cuộc gọi và MSP nếu có sẽ cung cấp điều khiển luồng qua phương tiện. Tất cả các TSP thực thi bên trong tiến trình TAPISRV. Các bộ phận cung cấp dịch vụ có thể tạo ra các Thread ngay trong ngữ cảnh của TAPISRV khi cần và được chắc chắn rằng không có tài nguyên nào mà chúng tạo ra bị huỷ do thoát khỏi một ứng dụng cá nhân nào đó. Khi cần TAPI Server có thể dịch các câu lệnh của ứng dụng sang tập lệnh phù hợp như TSPI. Các MSP thực thi ngay trong tiến trình của ứng dụng, cho phép phản hồi nhanh một số yêu cầu trong việc điều khiển phương tiện. TAPI DLL cung cấp một kết nối chặt chẽ với MSPI. Điện thoại IP (Internet Protocol ) 1. IP Telephony là gì? IP Telephony (điện thoại IP) là một tập hợp các công nghệ phát triển cho phép tiếng nói, dữ liệu và video truyền qua mạng LAN, WAN và mạng Internet. Đặc biệt, IP telephony dựa trên sự kết hợp cơ sở hạ tầng mạng điện thoại truyền thống PSTN (Public Switch Telephone Network) với kỹ thuật thoại VoIP dựa trên kiến trúc chuẩn H 323. Do điện thoại sử dụng giao thức Internet – IP, nên tín hiệu thoại được truyền qua mạng thoại tới cổng thoại – Voice Gateway, được số hoá tín hiệu qua mạng riêng sử dụng giao thức Internet. Trong điện thoại thông thường, tín hiệu thoại có tần số nằm trong khoảng 0.4 – 3.3 KHz được lấy mẫu với tần số 8 KHz theo Nyquyst. Sau đó các mẫu sẽ được lượng tử hoá với 8bit/mẫu và được truyền với tốc độ 64 KHz đến mạng chuyển mạch rồi được truyền tới đích, ở bên nhận, dòng số 64 Kbps này được giải mã để cho ra tín hiệu thoại tương tự. Hình 1.2. Mô hình điện thoại Thực chất thoại qua mạng IP (Voice over IP – VoIP) cũng không hoàn toàn khác hẳn điện thoại thông thường. Đầu tiên tín hiệu thoại cũng được số hoá, nhưng sau đó thay vì truyền trên mạng TSPN qua các trường chuyển mạch, chúng sẽ được nén xuống tốc độ thấp, đóng gói và chuyển mạch lên mạng IP. Tại bên nhận, các gói tin này được giải nén thành các luồng PCM 64 Kb truyền đến thuê bao bị gọi. Sự khác nhau chính là mạng truyền dẫn và khuôn dạng thông tin dùng để truyền dẫn. Trên hình 1.3 đưa ra ví dụ về một cuộc gọi VoIP: Giả sử thuê bao A muốn gọi đến thuê bao B. Thuê bao A quay số điện thoại của thuê bao B. Mạng TSPN có nhiệm vụ phân tích địa chỉ và kết nối đến gateway1. Tại đây địa chỉ của B lại được phân tích và gateway1 xác định được thuê bao B được kiểm soát bởi gateway2. Nó sẽ thiết lập một phiên liên kết với gateway2. Các thông tin báo hiệu mà gateway1 nhận được từ PSTN sẽ được chuyển đổi thích hợp sang dạng gói và truyền đến gateway2. Tại gateway2, các gói tin lại được chuyển đổi ngược lại và truyền sang mạng PSTN. Mạng PSTN có nhiệm vụ định tuyến cuộc gọi đến thuê bao B. Các thông tin trả lời sẽ được chuyển đổi ngược lại qua gateway2 đến gateway1. Sau khi cuộc gọi được thiết lập, các gateway có nhiệm vụ chuyển đổi giữa các gói tin thoại trên mạng IP và các luồng PCM trên mạng PSTN. Hình 1.3. Điện thoại IP Sử dụng công nghệ IP đưa đến cho người dùng sự linh hoạt trong các phương tiện truyền thông vật lý: đường POTS, ADSL, ISDN, kênh truyền dữ liệu, cáp đồng trục, máy vệ tinh, dây xoắn đôi và cả sự linh hoạt về các địa chỉ vật lý. Từ đó, các mạng được phân bố rộng rãi nhằm vận chuyển Web, Email và chia sẻ dữ liệu; nó có thể là cơ sở để kết nối các cá nhân, các thương nghiệp, trường học,… 2. Các ứng dụng của điện thoại IP Giao tiếp thoại sẽ vẫn là dạng giao tiếp cơ bản của con người. Mạng điện thoại công cộng không thể bị đơn giản thay thế, thậm chí thay đổi trong thời gian tới. Mục đích tức thời của các nhà cung cấp dịch vụ điện thoại IP là tái tạo lại khả năng của điện thoại với một chi phí vận hành thấp hơn nhiều và đưa ra các giải pháp kỹ thuật bổ sung cho mạng PSTN. Điện thoại có thể được áp dụng cho gần như mọi yêu cầu của giao tiếp thoại, từ một cuộc đàm thoại đơn giản cho đến một cuộc gọi hội nghị nhiều người phức tạp. Chất lượng âm thanh được truyền cũng có thể biến đổi tuỳ theo ứng dụng. Ngoài ra, với khả năng của Internet, dịch vụ điện thoại Ip sẽ cung cấp thêm nhiều tính năng mới. Ta có thể xem một vài ứng dụng trước mắt của điện thoại: Thoại thông minh: Hệ thống điện thoại ngày càng trở nên hữu hiệu: rẻ, phổ biến, dễ sử dụng, cơ động. Nhưng nó hoàn toàn “ngớ ngẫn”. Nó chỉ có một số phím để điều khiển. Trong những năm gần đây, người ta đã cố gắng để tạo ra thoại thông minh, đầu tiên là các thoại để bàn, sau là đến các Server. Nhưng mọi cố gắng đều bị thất bại do sự tồn tại của các hệ thống có sẵn. Internet sẽ thay đổi điều này. Kể từ khi Internet phủ khắp toàn cầu, nó đã được sử dụng để tăng thêm tính thông minh cho mạng điện thoại toàn cầu. Giữa mạng máy tính và mạng điện thoại tồn tại một mối liên hệ. Internet cung cấp cách giám sát và điều khiển các cuộc thoại một cách tiện lợi hơn. chúng ta có thể thấy được khả năng kiểm soát và điều khiển các cuộc thoại thông qua mạng Internet. Dịch vụ điện thoại Web: “World Wide Web” đã làm cuộc cách mạng trong cách giao dịch với khách hàng của các doanh nghiệp. Điện thoại Web hay bấm số (click to dial) cho phép các nhà doanh nghiệp có thể đưa thêm các phím bấm lên trang Web để kết nối tới hệ thống điện thoại của họ. Dịch vụ bấm số là cách dễ nhất và an toàn nhất để đưa thêm các kênh trực tiếp từ trang Web của bạn vào hệ thống điện thoại. Truy cập các trung tâm trả lời điện thoại: Truy nhập đến các trung tâm phục vụ khách hàng qua mạng Internet sẽ thúc đẩy mạnh mẽ thương mại điện tử. Dịch vụ này sẽ cho phép một khách hàng có câu hỏi về một sản phẩm được chào hàng qua Internet được các nhân viên của công ty trả lời trực tuyến. Dịch vụ fax qua IP: Nếu bạn gửi nhiều Fax từ PC, đặc biệt là gửi ra nước ngoài thì việc sử dụng dịch vụ Internet Faxing sẽ giúp bạn tiết kiệm được tiền và cả kênh thoại. Dịch vụ này sẽ chuyển trực tiếp từ PC của bạn qua kết nối Internet. Hàng năm, thế giới tốn hơn 30 tỷ USD cho việc gửi Fax đường dài. Nhưng ngày nay Internet Fax đã làm thay đổi điều này. Việc sử dụng Internet không những được mở rộng cho thoại mà còn cho cả dịch vụ Fax. Khi sử dụng dịch vụ thoại và Fax qua Internet, có hai vấn đề cơ bản: + Những người sử dụng dịch vụ thoại qua Internet cần có chương trình phần mềm chẳng hạn Quicknet’s Internet PhoneJACK. Cấu hình này cung cấp cho người sử dụng khả năng sử dụng thoại qua Internet thay cho sử dụng điện thoại để bàn truyền thống. + Kết nối một gateway thoại qua Internet với hệ thống điện thoại hiện hành. Cấu hình này cung cấp dịch vụ thoại qua Internet giống như việc mở rộng hệ thống điện thoại hiện hành của bạn. 3. Lợi ích của IP telephony Nếu như trước kia việc tổ chức triển khai lực lượng chỉ có thể thực hiện được trên các mạng riêng lẽ để điều khiển quá trình trao đổi dữ liệu, tiếng nói và video truyền thống. Phương pháp này đòi hỏi nhiều chi phí cho việc cài đặt, duy trì và tái tạo. Đặc biệt, khi mạng đang tồn tại dưới dạng vật lý thì việc tích hợp các chức năng, công cụ là rất khó thực hiện và bị hạn chế về tính hiệu quả, tác dụng và tiềm lực. Ngày nay, khi điện thoại IP ra đời và phát triển nó đang dần trở nên hiệu quả nhờ vào sự phát triển của mạng máy tính, trong việc xử lí tín hiệu, kỹ thuật nén ở tốc độ bit rất thấp mà vẫn giữ được chất lượng. Băng thông rộng cho phép điện thoại IP tăng khả năng tìm đường, tiết kiệm đường truyền và tận dụng tối đa dung lượng chuyển tới của mạng lưới. Thêm vào đó, sự phát triển của các thiết bị IP với công nghệ ngày càng cao cho phép mô hình IP ngày càng được mở rộng. Với những tính chất này, IP cho phép các tổ chức, các cá nhân giảm mức chi phí cho các dịch vụ: truyền tiếng nói, video, trong sự mở rộng các phương tiện truyền thông kể cả hội thoại video truyền thống, chia sẻ ứng dụng và các công cụ WhiteBoarding; sản sinh ra những công cụ kết hợp mới và gia tăng hiệu quả. Ưu và nhược điểm của điện thoại IP Về mặt kỹ thuật điện thoại IP có những ưu điểm và nhược điểm sau: Ưu điểm: - Thông tin thoại trước khi đưa lên mạng IP sẽ được nén xuống dung lượng thấp (tuỳ theo kỹ thuật nén), vì vậy sẽ làm giảm được lưu lượng mạng. - Trong trường hợp cuộc gọi ở mạng chuyển mạch kênh một kênh vật lí sẽ được thiết lập và duy trì giữa hai bên cho đến khi một trong hai bên huỷ bỏ liên kết. Như vậy, trong khoảng thời gian không có tiếng nói, tín hiệu thoại vẫn được lấy mẫu, lượng tử hoá và truyền đi. Vì vậy, hiệu suất đường truyền sẽ không cao. Đối với điện thoại Internet có các cơ chế để phát hiện khoảng lặng (khoảng thời gian không có tiếng nói) nên sẽ làm tăng hiệu suất mạng. Nhược điểm: - Nhược điểm chính của điện thoại qua mạng IP chính là chất lượng dịch vụ. Các mạng số liệu vốn dĩ không phải xây dựng với mục đích truyền thoại thời gian thực, vì vậy khi truyền thoại qua mạng số liệu cho chất lượng cuộc gọi thấp và không thể xác định trước được. Sở dĩ như vậy là vì gói tin truyền trong mạng có thể thay đổi trong phạm vi lớn, khả năng mất mát thông tin trong mạng hoàn toàn có thể xảy ra. Một yếu tố làm giảm chất lượng thoại nữa là kỹ thuật nén để tiết kiệm đường truyền. Nếu nén xuống dung lượng càng thấp thì kỹ thuật càng phức tạp, cho chất lượng không cao và đặc biệt là thời gian xử lí sẽ lâu, gây trễ. - Một nhược điểm khác của điện thoại IP là vấn đề tiếng vọng. Nếu như trong mạng thoại, do trễ ít nên tiếng vọng không ảnh hưởng nhiều thì trong mạng IP, do trễ lớn nên tiếng vọng ảnh hưởng nhiều đến chất lượng thoại. Vì vậy, vấn đề tiếng vọng là một vấn đề cần phải giải quyết trong điện thoại IP. Mô hình lập trình cho hệ thống điện thoại Ứng dụng TAPI sẽ nạp thư viện TAPI (TAPI DLL) vào và sử dụng TAPI cho các nhu cầu truyền thông. TAPI sẽ tạo ra một kết nối với TAPI Server. Ngoài ra, với phiên bản TAPI 3.0 còn tạo thêm một đối tượng MSP và kết nối với nó bằng cách sử dụng các câu lệnh định nghĩa trước, hình thành nên MSPI. Khi ứng dụng thực hiện một thao tác TAPI, thư viện TAPI sẽ thực hiện một số kiểm tra cần thiết, sau đó sẽ chuyển thông tin cho TAPISVR. TAPISVR liên lạc với các tài nguyên khả dụng trên máy tính và giao tiếp với các TSP bằng cách sử dụng TSPI. Những kết nối TSP và MSP được diễn ra bằng cách sử dụng một kết nối ảo thông qua TAPI DLL và TAPISVR. TSP và MSP sẽ làm nhiệm vụ cung cấp những thông tin về trạng thái, chức năng của thiết bị khi có yêu cầu. Kết quả của việc lập trình theo mô hình này là ứng dụng vẫn có thể hoạt động khi thay thiết bị mới mà không cần thực hiện những thay đổi mã nguồn. Ứng dụng TAPI TAPI 2.2 (TAPI/C) TAPI 3.0 (TAPI/COM) TAPI DLL (Dynamic Link Library) MSP (Media Service Provider) MSPI TAPISVR (TAPI Server) Service Providers TSP (TAPI Service Provider) TSPI Device Hình 1.4. Mô hình lập trình cho hệ thống điện thoại Mô hình ứng dụng TAPI Khởi tạo TAPI Điều khiển phiên làm việc Điều khiển thiết bị Điều khiển phương tiện Kết thúc TAPI Hình 1.5. Mô hình ứng dụng TAPI 1. Khởi tạo TAPI (TAPI Initialization) + 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 3 IV. Mô hình ứng dụng TAPI 3 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:

  • docTì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.doc