Trong thời đại thông tin như hiện nay, việc trao đổi thông tin, tìm kiếm thông tin ngày càng nhiều. Con người có thể trao đổi, thu thập thông tin qua thư từ, sách báo, đài, tivi, và hiện nay mọi người có thể chủ động hơn qua mạng điện thoại, Internet. Các ứng dụng trên Internet là rất đa dạng, gồm nhiều loại khác nhau, có thể bao gồm âm thanh, hình ảnh tĩnh hay động.Tuy nhiên, để sử dụng nó không phải bất kỳ nơi đâu, lúc nào cũng có thể dùng......
Tự Động Hóa Đài 116 GVHD : Phan Đình Mãi – Nguyễn Thanh Liêm Mục lục Mục Lục .1 Đặt vấn ñeà PHẦN MỘT : THỰC TRẠNG VÀ GIẢI PHÁP CHO 116 .6 I Thực trạng dịch vụ 116 .6 II Giải pháp bán tự động dịch vụ 116 .10 Các chức ứng dụng 12 Giao tiếp qua điện thoại 12 Truy tìm liệu mạng máy tính 13 Phát âm 13 III Sơ đồ chức chương trình xử lý .13 IV Kết luận 16 PHẦN HAI : CƠ SỞ LÝ THUYẾT 17 CHƯƠNG : GIAO TIẾP QUA MẠNG ĐIỆN THOẠI 18 I Giới thiệu 19 II Maïng điện thoại 19 1.Tổng đài điện thoại 19 1.1 Định nghóa .19 1.2Các lớp tổng đài điện thoại 19 1.3Phân loại tổng đài 20 2.Tổng đài PABX 21 3.Máy điện thoại 21 3.1Nguyên tắc cấu tạo máy điện thoại 21 3.2Chức chung máy điện thoại 22 3.3Phân loại kiểu máy điện thoại 23 3.4Các kiểu mạch máy điện thoại 23 3.5Yêu cầu mạch điện máy điện thoại 24 3.6Các thông số máy điện thoại 24 3.7Tín hiệu thuê bao tổng đài 24 4.Dialogic Card 27 4.1Mô tả card Dialogic/4 27 4.2Các mô hình lập trình cho card Dialogic/4 34 4.3Giao diện lập trình ứng dụng (API) .43 CHƯƠNG : TỔNG QUAN VỀ TRUY XUẤT CƠ SỞ DỮ LIỆU 49 I TỔNG QUAN VỀ TRUY XUẤT CƠ SỞ DỮ LIỆU50 1.Cơ sở liệu ? 50 2.Các mô hình sở liệu 50 2.1Mô hình CSDL phẳng .50 2.2Mô hình CSDL quan hệ 50 3.Cách truy xuất CSDL 51 4.Chọn phương pháp truy xuất CSDL 52 II TRUY XUẤT LIỆU DÙNG ODBC 52 1.Giới thiệu ODBC 52 2.Kiến trúc ODBC 52 3.Cấu hình ODBC data source .56 4.Hướng dẫn gọi hàm ODBC .57 5.Các bước ứng dụng .58 SVTH: Nguyễn Hữu Phú – Trần Lê Trung Trang Tự Động Hóa Đài 116 GVHD : Phan Đình Mãi – Nguyễn Thanh Liêm CHƯƠNG SƠ LƯC VỀ TIẾNG NÓI VÀ CÁC PHƯƠNG PHÁP TỔNG HP ÂM .60 I SƠ LƯC VỀ TIẾNG NÓI 60 1.Đặc tính chung tiếng nói 60 2.Cách thức tổng hợp tiếng nói dùng Text-ToSpeech 62 3.Tại sử dụng Text-To-Speech 63 4.Những lý cho việc thực thi Text-To-Speech 63 5.Những ứng dụng tìm ủa3 Text-To-Speech 64 6.Hạn chế Text-To-Speech .65 II SƠ LƯC VỀ CẤU TRÚC TIẾNG VIỆT 66 1.Các đặc tính Tiếng Việt 66 2.Hệ thống ngữ âm Tiếng Việt 66 2.1Khái niệm .66 2.2Cấu trúc âm Tiếng Việt .66 III CÁC PHƯƠNG PHÁP, TIÊU CHUẨN TỔNG HP TIẾNG NÓI TRONG HỆ THỐNG TIẾNG VIỆT 69 1.Nguyên nhân cần phải tổng hợp tiếng nói .69 2.Các tiêu chuẩn cần thỏa mãn tổng hợp tiếng nói 69 3.Các phương pháp tổng hợp âm cho Tiếng Việt 70 3.1Ghép từ đơn 70 3.2Ghép âm theo âm tiết 71 3.3Ghép âm từ hai âm loại 71 3.4Ghép âm từ hai âm loại 75 IV SƠ LƯC VỀ CÁC DẠNG FILE ÂM THANH DÙNG TRONG CARD DIALOGIC 76 1.Cấu trúc Wave file .76 2.Đọc RIFF files .80 PHẦN BA : THIẾT KẾ HỆ THỐNG 85 CHƯƠNG MODULE GIAO TIẾP 87 1.Hoạt động giao tiếp 88 2.Chọn lựa mô hình lập trình 88 3.Máy trạng thái 89 CHƯƠNG MODULE TRUY XUẤT DỮ LIỆU 93 I GIỚI THIỆU CÁC LỚP MFC ODBC .9 1.Giới thiệu lớp Cdatabase 94 2.Giới thiệu lớp CrecordSet 94 II GIỚI THIỆU VỀ SQL 95 III TRUY XUAÁT DATABASEE BẰNG MFC ODBC 97 1.Nếu quan hệ Database biết trước thời điểm lập trình 97 2.Làm việc với Database không xác định trước 100 IV SƠ LƯC VỀ CSDL DÙNG TRONG ĐÀI 116, 102 V HOẠT ĐỘNG CỦA PHẦN TRUY XUẤT DỮ LIỆU 103 CHƯƠNG MODULE TỔNG HP ÂM 105 SVTH: Nguyễn Hữu Phú – Trần Lê Trung Trang Tự Động Hóa Đài 116 GVHD : Phan Đình Mãi – Nguyễn Thanh Liêm 1.Chức .106 2.Chọn phương pháp tổng hợp âm 106 3.Các bước chuẩn bị 106 4.Tổ chức lưu trữ liệu âm thực tổng hợp âm 106 4.1Chỉ lưu trữ liệu âm .106 4.2Để riêng lẻ file wave 109 5.Chọn phương pháp lưu trữ tạo âm .109 VẬN HÀNH ĐÁNH GIÁ HỆ.THỐNG 110 Giao diện chương trình 111 Vận hành chương trình 112 Đánh gía hệ thống .113 Kết luận 114 CHƯƠNG TRÌNH NGUỒN 115 Ñ A Ë T VA Á N Đ E À Trong thời đại thông tin nay, việc trao đổi thông tin, tìm kiếm thông tin ngày nhiều Con người trao đổi, thu thập thông tin qua thư từ, sách báo, đài, tivi, người chủ động qua mạng điện thoại, SVTH: Nguyễn Hữu Phú – Trần Lê Trung Trang Tự Động Hóa Đài 116 GVHD : Phan Đình Mãi – Nguyễn Thanh Liêm Internet Các ứng dụng Internet đa dạng, gồm nhiều loại khác nhau, bao gồm âm thanh, hình ảnh tónh hay động.Tuy nhiên, để sử dụng nơi đâu, lúc dùng được.Tận dụng hạ tầng sở có sẵn hệ thống thông tin liên lạc qua mạng điện thoại, phát triển số ứng dụng mà cho phép người sử dụng khai thác thông tin qua máy điện thoại nối với mạng điện thoại Các loại dịch vụ trao đổi qua mạng điện thoại thường thực người người 1080, 116 Hiện nay, nhu cầu sử dụng dịch vụ ngày cao đặt cho vấn đề : đáp ứng nhu cầu mà Có hai cách giải quyết: Thứ : tăng cường thêm điện thoại điện thoại viên nhằm đảm bảo gọi khách hàng đến dịch vụ không bị tải Thứ hai : chuyển sang hướng tự động dịch vụ thông tin dựa máy tính Cả hai cách giải phải dùng lại sở hạ tầng để đảm bảo chi phí cải tạo dịch vụ thấp Tuy nhiên, cách thứ tốn chí phí :bao gồm phí lắp đặt điện thoại, chi phí tuyển điện thoại viên, lương bổng hàng tháng cho điện thoại viên Trong cách thứ hai cần máy tính sử dụng sở liệu thông tin có sẵn, phần cứng chuyên dụng, phần mềm quản lý Việc lựa chọn cách giải tùy thuôc vào tình hình cụ thể sơ hạ tầng dịch vụ hướng phát triển dịch vụ Mặt khác, thân người làm kỹ thuật phải cân nhắc hiệu giải pháp (chi phi xây dựng, vận hành, bảo trì) khả phát triển giải pháp theo mở rộng dịch vụ Vấn đề lớn đặt cụ thể hóa vào dịch vụ 116 bưu diện thành phố Dịch vụ 116 có chức giải đáp số điện thoại từ tên địa thuê bao ngược lại, từ tên địa thuê bao, cho người gọi biết số điện thoại chủ thuê bao Dịch vụ tải số gọi yêu cầu giải đáp thông tin ngày nhiều SVTH: Nguyễn Hữu Phú – Trần Lê Trung Trang Tự Động Hóa Đài 116 GVHD : Phan Đình Mãi – Nguyễn Thanh Liêm PHẦN MỘT THỰC TRẠNG VÀ GIẢI PHÁP CHO HỆ THỐNG 116 SVTH: Nguyễn Hữu Phú – Trần Lê Trung Trang Tự Động Hóa Đài 116 GVHD : Phan Đình Mãi – Nguyễn Thanh Liêm I THỰC TRẠNG CỦA DỊCH VỤ 116 : Hiện nay, thông tin giải đáp cho người gọi thực thông qua Điện thoại viên Mỗi Điện thoại viên có máy điện thoại máy tính, thông qua máy điện thoại Điện thoại viên giao tiếp với người gọi, thông qua máy tính Điện thoại viên truy xuất mạng tùy theo yêu cầu người gọi đây, Điện thoại viên đóng vai trò trung gian việc chuyển tiếp liệu từ máy tính lên mạng điện thoại đến với người gọi Các thành phần dịch vụ 116 : Database server: chứa liệu gởi trả liệu có yêu cầu Hub Máy tính: dùng Điện thoại viên để truy xuất liệu Máy điện thoại: dùng Điện thoại viên để giao tiếp với người gọi ACD (Automatically Call Distribution) : phân phối gọi tự động đến Điện thoại viên SVTH: Nguyễn Hữu Phú – Trần Lê Trung Trang Tự Động Hóa Đài 116 Mãi – Nguyễn Thanh Liêm Sơ đồ mạng 116 chưa bán tự động SVTH: Nguyễn Hữu Phú – Trần Lê Trung Trang GVHD : Phan Đình Tự Động Hóa Đài 116 GVHD : Phan Đình Mãi – Nguyễn Thanh Liêm Để cải tạo dịch vụ, ta có hai cách giải nêu phần đặt vấn đề Giải pháp tự động hóa dịch vụ 116 giải pháp ưu tiên lên hàng đầu tính khả thi, hiệu mặt kinh tế mặt kỹ thuật Việc tự động hóa dịch vụ 116 thực chất việc thực trình trao đổi người máy người sử dụng trao đổi thông qua máy điện thoại Do việc trao trực tiếp qua giọng nói với người khó khăn, thực Vì thông tin mà người sử dụng cung cấp cho máy qua phím máy điện thoại Do số lượng phím máy điện thoại có giới hạn, thông tin cung cấp cho máy gói gọn việc nhập vào số điện thoại số tổ quy định trước cho số chức Do vậy, việc tự động hóa dịch vụ 116 dừng lại mức độ bán tự động Máy nhận biết chuyển đổi thông tin từ số điện thoại sang tên địa thuê bao người gọi nhập vào; việc chuyển đổi ngược lại tự động kết nối sang Điện thoại viên để thực II GIẢI PHÁP BÁN TỰ ĐỘNG DỊCH VỤ 116 Khi bán tự động, vai trò Điện thoại viên giảm bớt nửa, gọi yêu cầu cho biết số điện thoại chuyển đến Điện thoại viên, thao tác thực Điện thoại viên y chưa bán tự đông Còn gọi yêu cầu địa xử lý tự động, lúc trình trao đổi thực người máy Nói cách khác, thiết bị chương trình xử lý đóng vai trò Điện thoại viên Để thực trình chuyển kết nối người gọi với chương trình xử lý tự động Điện thoại viên có hai cách để thực Thứ nhất, trình chương trình xử lý tự động xử lý theo yêu cầu người gọi, nghóa sau giao tiếp với chương trình xử lý, người gọi có nhu cầu trao đổi với Điện thoại viên chương trình kết nối với Điện thoại viên Thứ hai, trình xác định từ đầu Khi khách hàng gọi vào 116 yêu cầu chọn hai chức đài 116 Nếu có yêu cầu tên địa thuê bao chương trình xử lý giải quyết, có yêu cầu số điện thoại chuyển qua trao đổi với Điện thoại viên SVTH: Nguyễn Hữu Phú – Trần Lê Trung Trang Tự Động Hóa Đài 116 GVHD : Phan Đình Mãi – Nguyễn Thanh Liêm Trong trường hợp thứ hai chương trình xử lý coi nhận gọi gọi vào số điện thoại cố định, việc chuyển đổi gọi chương trình không quan t âm Tùy theo cách đưa chức kết nối với Điện thoại viên vào hay chương trình xử lý mà ứng dụng ta thêm hay bớt chức Nếu đưa chương trình đơn giản mặt ứng dụng thực tế phù hợp Lúc này, xem dịch vụ có chức độc lập, cung cấp thông tin tên địa thuê bao gán cho dịch vụ số điện thoại Cách thực phân định rõ chức dịch vụ giúp cho người gọi sử dụng dễ dàng đồng thời quản lý dịch vụ dễ dàng Còn đưa kết nối vào bên gộp hai chức lại chương trình, lúc có kết hợp làm tay làm máy trình quản lý dịch vụ gặp nhiều khó khăn Tùy theo cách chọn mà chương trình có thêm chức năng, chức không đổi Các thành phần dịch vụ 116 bán tự động: Các thành phần chưa bán tự động Máy tính Card chuyên dụng để xử lý tự động SVTH: Nguyễn Hữu Phú – Trần Lê Trung Trang Tự Động Hóa Đài 116 GVHD : Phan Đình Mãi – Nguyễn Thanh Liêm Sơ đồ mạng 116 bán tự động (xử lý kết nối bên ngoài) SVTH: Nguyễn Hữu Phú – Trần Lê Trung Trang 10 extern HWND hWnd; int nVolume[4] = {0,0,0,0}; ///////////////////////////////////////////////////////////////////////////// // CSetVolume dialog CSetVolume::CSetVolume(CWnd* pParent /*=NULL*/) : CDialog(CSetVolume::IDD, pParent) { //{{AFX_DATA_INIT(CSetVolume) m_strChannel = _T("dxxxC1B1"); //m_nVolume = nVolume; m_strTemp = _T(""); //}}AFX_DATA_INIT } void CSetVolume::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CSetVolume) DDX_Control(pDX, IDC_TEMP, m_wndTemp); DDX_Control(pDX, IDC_VOLUME_SLIDER, m_wndVolume); DDX_Control(pDX, IDC_CHANNEL_COMBO, m_wndChannel); DDX_CBString(pDX, IDC_CHANNEL_COMBO, m_strChannel); DDX_Slider(pDX, IDC_VOLUME_SLIDER, m_nVolume); DDX_Text(pDX, IDC_TEMP, m_strTemp); //}}AFX_DATA_MAP } BEGIN_MESSAGE_MAP(CSetVolume, CDialog) //{{AFX_MSG_MAP(CSetVolume) ON_WM_HSCROLL() ON_CBN_CLOSEUP(IDC_CHANNEL_COMBO, OnCloseupChannelCombo) //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CSetVolume message handlers BOOL CSetVolume::OnInitDialog() { CDialog::OnInitDialog(); m_wndVolume.SetRange( -10, 10,TRUE ); m_wndVolume.SetTic(10); m_wndVolume.SetTicFreq(2); m_wndChannel.SetCurSel(0); m_wndVolume.SetPos(nVolume[0]); return TRUE; // return TRUE unless you set the focus to a control // EXCEPTION: OCX Property Pages should return FALSE } void CSetVolume::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) { // TODO: Add your message handler code here and/or call default int nTempPos; int nChannel; CDialog::OnHScroll(nSBCode, nPos, pScrollBar); switch (nSBCode) { case TB_THUMBTRACK: nTempPos = (int)nPos; //m_strTemp = temp; //m_nVolume = nPos; break; case TB_PAGEUP: case TB_PAGEDOWN: default: nTempPos = ((CSliderCtrl*)pScrollBar)->GetPos(); //strTemp = temp; //nVolume = nPos; break; } //m_wndTemp.SetWindowText(temp); nChannel = m_wndChannel.GetCurSel(); nVolume[nChannel] = nTempPos; ::PostMessage(hWnd,WM_USER_ADJSV,++nChannel,nTempPos); } void CSetVolume::OnCloseupChannelCombo() { int nChannel; nChannel = m_wndChannel.GetCurSel(); m_wndVolume.SetPos(nVolume[nChannel]); } ///////////////////////////////////// #include "LVTNSet.h" #if ! defined(AFX_DATAACCESS_H 9192CD51_A39C_11D3_BB72_D69E1BF65 909 INCLUDED_) #define AFX_DATAACCESS_H 9192CD51_A39C_11D3_BB72_D69E1BF65909 INC LUDED_ #if _MSC_VER > 1000 #pragma once #endif // _MSC_VER > 1000 class CDataAccess { public: void MakeSpeak(CString channelnum); CLVTNSet* m_pSet; CString FirstWord; CString XuLyWord(CString string); CString XuLy(CString digit,CString channelnum); void TachTu(CString string); BOOL Searching(CString col,CString digit); CString NumToString(CString string); CString HnumToString(CString string); CString HangNghin(int Num); CString HangTram(int Num); CString HangChuc(int Num); CString ExtractFirstWord(CString string); CString Duyet(CString string); CString DonVi(int Num); char* CStringToCharPtr(CString string); CDataAccess(); virtual ~CDataAccess(); }; #endif // ! defined(AFX_DATAACCESS_H 9192CD51_A39C_11D3_BB72_D69E1BF65 909 INCLUDED_) //////////////////////////////////////////// // // DataAccess.cpp: implementation of the CDataAccess class // ///////////////////////////////////////////////////////// #include "stdafx.h" #include "LVTN.h" #include "DataAccess.h" #include "LVTNSet.h" //#include "LVTNView.h" #ifdef _DEBUG #undef THIS_FILE static char THIS_FILE[]= FILE ; #define new DEBUG_NEW #endif #define SIZE_DELAY 50 typedef struct { char Word[10];//ten cua tu long DataSize;//chieu dai data wave cua tu }INDEX_FIND; extern void* pSet; CStringArray chuoi; CString Ketqua; ///////////////////////////////////////////////////////// // // Construction/Destruction ///////////////////////////////////////////////////////// CDataAccess::CDataAccess() { m_pSet = (CLVTNSet*)pSet; } CDataAccess::~CDataAccess() { } /////////////////////////////////////////////////////////////ham chuyen mot doi tuong CString tro char ///////////////////////////////////////////////////////// char* CDataAccess::CStringToCharPtr(CString string) { LPTSTR lpsz = new TCHAR[string.GetLength() + 1]; _tcscpy(lpsz,string); return lpsz; } /////////////////////////////////////////////////////////////Ham doi don vi chuoi phat am ///////////////////////////////////////////////////////// CString CDataAccess::DonVi(int Num) { CString temp; switch(Num) { case : temp = case : temp = case : temp = case : temp = case : temp = case : temp = case : temp = case : temp = case : temp = case : temp = } return temp ; "";break; " mèt";break; " hai";break; " ba";break; " bỗn";break; " nm";break; " su";break; " b¶y";break; " tÀm";break; " chÛn";break; } /////////////////////////////////////////////////////////////ham xu ly chuoi lan cuoi ///////////////////////////////////////////////////////// CString CDataAccess::Duyet(CString string) { CString temp = string; CString so = "0123456789"; CString word,tam; CString ketqua =""; int vitri; temp.TrimRight(); temp += " "; while(temp.GetLength() != 0) { word = ExtractFirstWord(temp); if(word.FindOneOf(so) != -1) { tam = XuLyWord(word); if((vitri = tam.Find("Q ")) != -1) { tam.Delete(vitri,2); tam.Insert(vitri,"quËn "); } if((vitri = tam.Find("P ")) != -1) { tam.Delete(vitri,2); tam.Insert(vitri,"ph§éng "); } ketqua += tam; } else ketqua += word + " "; word = word + " "; temp.Delete(0,word.GetLength()); } return ketqua; } /////////////////////////////////////////////////////////////ham lay tu day tien cua chuoi ///////////////////////////////////////////////////////// CString CDataAccess::ExtractFirstWord(CString string) { int vitri; TCHAR space=' '; vitri=string.Find(space); return string.Left(vitri); } /////////////////////////////////////////////////////////////ham chuyen ham chuc sang chuoi ///////////////////////////////////////////////////////// CString CDataAccess::HangChuc(int Num) { CString temp; switch(Num) { case : temp = " mĐƠỉ";break; case : temp = " hai mĐƠi";break; case : temp = " ba mĐƠi";break; case : temp = " bỗn mĐƠi";break; case : temp = " nm mĐƠi";break; case : temp = " su mĐƠi";break; case : temp = " bảy mĐƠi";break; case : temp = " tm mĐƠi";break; case : temp = " chn mĐƠi";break; } return temp ; } ///////////////////////////////////////////////////////// CString CDataAccess::HangTram(int Num) { CString temp; switch(Num) { //case : temp = "";break; case : temp = " mèt";break; case : temp = " hai";break; case : temp = " ba";break; case : temp = " bỗn";break; case : temp = " nŸm";break; case : temp = " sÀu";break; case : temp = " b¶y";break; case : temp = " tÀm";break; case : temp = " chÛn";break; } return temp + " trŸm"; } ///////////////////////////////////////////////////////// CString CDataAccess::HangNghin(int Num) { CString temp; switch(Num) { //case : temp = "";break; case : temp = " mèt";break; case : temp = " hai";break; case : temp = " ba";break; case : temp = " bỗn";break; case : temp = " nŸm";break; case : temp = " sÀu";break; case : temp = " b¶y";break; case : temp = " tÀm";break; case : temp = " chÛn";break; } return temp + " nghØn"; } //////////////////////////////////////////////////////////////////////////////// //chuyen so nha day du sang chuoi //////////////////////////////////////////////////////////////////////////////// CString CDataAccess::HnumToString(CString string) { CString temp,Ketqua="",word; LPCTSTR phancach="/"; int vitri; temp=string; while((vitri=temp.Find(phancach)) > -1) { word=temp.Mid(0,vitri); temp.Delete(0,vitri+1); Ketqua += XuLyWord(word) + "tr£n"; } Ketqua += XuLyWord(temp); return Ketqua; } //////////////////////////////////////////////////////////////////////////////// //ham chuyen so sang chuoi //////////////////////////////////////////////////////////////////////////////// CString CDataAccess::NumToString(CString string) { CString ketqua = ""; int hang_nghin,hang_tram,hang_chuc,donvi,num; num = atoi(string); hang_nghin = num / 1000; hang_tram = (num % 1000) / 100; hang_chuc = ((num % 1000) % 100) / 10; donvi = ((num % 1000) % 100) % 10; if (hang_nghin > 0) ketqua = HangNghin(hang_nghin); if (hang_tram > 0) ketqua += HangTram(hang_tram); if ((hang_tram ==0)&&(hang_nghin>0)) ketqua += " khÔng trm"; if ((donvi != 0) && (hang_chuc == 0)&&((hang_nghin != 0)|| (hang_tram != 0))) ketqua += " lÍ" + DonVi(donvi); if(hang_chuc > 0) ketqua += HangChuc(hang_chuc); if ((hang_chuc > 0) && (donvi > 0)) { if((hang_chuc ==1) && (donvi == 1)) ketqua += " mốt"; else if (donvi == 1) ketqua += " mỗt"; else if (donvi == 5) ketqua += " lèm"; else ketqua += DonVi(donvi); } if((donvi > 0)&&(hang_tram==0)&&(hang_chuc==0)&&(hang_nghin==0)) ketqua = DonVi(donvi); return ketqua; } ///////////////////////////////////////////////////////////ham tim kiem bang tra ve gia tri TRUE neu tim thay ///////////////////////////////////////////////////////// BOOL CDataAccess::Searching(CString col, CString digit) { CString str = col + " = '" + digit + "'"; m_pSet->Close(); m_pSet->m_strFilter = str; m_pSet->Open(); int recCount = m_pSet->GetRecordCount(); if (recCount==0) { m_pSet->Close(); m_pSet->m_strFilter = ""; m_pSet->Open(); return FALSE; } else { Ketqua=m_pSet->m_sdtm + "\n" + m_pSet->m_tcqv +"\n" + m_pSet->m_diachiv ; FirstWord=ExtractFirstWord(m_pSet->m_diachiv); // UpdateData(FALSE); return TRUE; } } /////////////////////////////////////////////////////////// //tra ve day cac file wav can mo de phat am // ///////////////////////////////////////////////////////// void CDataAccess::TachTu(CString string) { CString temp = string; CString word; int i=0; while(temp !="") { word = ExtractFirstWord(temp); chuoi.Add(word + ".wav"); word += " "; temp.Delete(0,word.GetLength()); } } /////////////////////////////////////////////////////////// //ham chinh cua phan du lieu nhan vao chuoi so, tra ve chuoi can phat am va mang cac file can mo ///////////////////////////////////////////////////////// CString CDataAccess::XuLy(CString digit,CString channelnum) { CString filename; if(!digit.IsEmpty()) { BOOL find; find = Searching("sdtm",digit); if(find == TRUE) { CString temp; m_pSet->m_tcqv.TrimRight(); Ketqua = m_pSet->m_tcqv; Ketqua += " dia chi "; temp = m_pSet->m_diachiv; if(FirstWord.FindOneOf("0123456789") != -1) { temp.Replace(FirstWord + " ",""); Ketqua += HnumToString(FirstWord); } Ketqua += temp; Ketqua = Duyet(Ketqua); Ketqua.MakeLower(); TachTu(Ketqua); //MakeSpeak(channelnum); filename = "speakout" + channelnum + ".wav"; } else { chuoi.RemoveAll(); filename = "error.wav"; } /* */ } } return filename; BOOL find; find = Searching("sdtm",digit); if(find == TRUE) { CString temp; temp = m_pSet->m_diachiv; temp.Replace(FirstWord + " ",""); m_pSet->m_tcqv.TrimRight(); Ketqua = m_pSet->m_tcqv; Ketqua += " dia chi"; Ketqua += HnumToString(FirstWord); Ketqua += temp; Ketqua = Duyet(Ketqua); Ketqua.MakeLower(); TachTu(Ketqua); } /////////////////////////////////////////////////////////// //tach mot chuoi gom co so ky tu phat am ///////////////////////////////////////////////////////// CString CDataAccess::XuLyWord(CString string) { CString Ketqua = ""; CString num; CString temp, space = " "; int i,j,len,so_kytu = 0,vitri,lensub; BOOL flag; temp = string; i = 0; j = 0; len = temp.GetLength(); if(::isdigit(temp.GetAt(i))) flag = TRUE; else if(::isalpha(temp.GetAt(i))) flag = FALSE; while (i < len) { if (flag==TRUE) { while ((flag==TRUE) &&(i -1) { num.Insert(vitri,space); //num.Insert(vitri +4 ,space); } else { vitri = 1; lensub = num.GetLength(); while((vitri ) < lensub) { lensub = num.Insert(vitri,space); vitri += 2; } } Ketqua += num + space; j = i; }//end if !flag } return Ketqua; } ///////////////////////////////////////////////////////// void CDataAccess::MakeSpeak(CString channelnum) { int chiso;//chiso so duyet mang ten file int arraylen;//chieu dai cua mang int vitri; long sumdata,datasize,dem; arraylen = chuoi.GetUpperBound();//lay chieu dai cua mang chua file FILE* fileheader;//handle cua file header FILE* speakfile; FILE* filedata;//handle cua file chua du lieu am FILE* fileindex;//handle cua file chua thong tin tim kiem FILE* filebosung;//handle cua file bosung khoang lang CString datafile,indexfile;//ten cua cac file data va index char header[44];//chieu dai cua header char byte[1]; char temp[10]; char bosung[SIZE_DELAY]; CString word; CString outputfile = "speakout"+ channelnum + ".wav"; INDEX_FIND Infor; fileheader = fopen("header.wav","rb");//mo file header fread(header,sizeof(char),44,fileheader);//doc header fclose(fileheader); speakfile = fopen(outputfile,"wb");//mo file speakout.wav fwrite(header,sizeof(char),44,speakfile);//ghi header filebosung = fopen("bosung.wav","rb");//ghi phan am lang vao cuoi file speakout.wav fread(bosung,sizeof(char),SIZE_DELAY,filebosung); for(chiso=0;chiso