Khối mô tả dạng RIFF:
Khối này xác định dạng RIFF và có kích thước là 12 byte gờm các trường.
Hình 3.3 : Làn sóng dạng RIFF
Khối thuô ̣c tính “fmt ”:
Khối này xác định các thuộc tính của dữ liệu âm thanh và có kích thước là 24 byte.
Cấu trúc khối fmt như sau:
class WavFormatChunk : WavChunk {
// kiểu mã hoá dữ liệu âm thanh public ushort wFormatTag;
// có hai giá trị: bằng 1 cho âm thanh mono, bằng 2 cho âm thanh stereo
public ushort wChannels;
// cho biết tốc độ lấy mẫu (11025-11,025kHz,22050-22,05 kHz…)
public ulong dwSamplesPerSec;
//số byte trung bình yêu cầu trong 1 giây để phát lại mẫu dữ liệu của sóng âm
public ulong dwAvgBytesPerSec;
// mẫu <= 8 bit sẽ yêu cầu 1 byte, mẫu 9-16 bit sẽ yêu cầu 2 bytes
public ushort wBlockAlign;
// cho biết số bit trong một mẫu dữ liệu(dạng byte hay word) public ushort wBitsPerSample;
}
Khối này xác định các thuộc tính của dữ liệu âm thanh và có kích thước là 24 byte gồm các trường:
• Subchunk1ID:
- Kích thước: 4 byte
- Chứ c năng: chứa ch̃i “fmt ”. • Subchunk1Size:
- Kích thước: 4 byte
- Chức năng :cho biết tổng kích thước của các trường thuộc khối thuộc tính đứng phía sau trường này.
(đối với tập tin wave khơng nén thì Subchunk1Size bằng 16) • AudioFormat:
- Kích thước: 2 byte
- Chức năng: cho ta biết dạng nén của dữ liệu trong tập tin wave. Giá trị mô tả
- 0 :Không xác định
- 1: Không nén (PCM-Pulse Code Modulation) Một số giá trị thơng dụng
• NumChannels: Kích thước: 2 byte
Chức năng: cho biết số kênh của tập tin wave. (Mono=1,Stereo=2,v.v)
• SampleRate:
- Kích thước: 4 byte
- Chức năng: cho biết số mẫu trên 1s và đây chính là tần số lấy mẫu của tập tin wave.
• ByteRate:
- Kích thước: 4 byte
- Chức năng:cho biết số byte trên 1 s ứng với tần số lấy mẫu trên. (ByteRate=SampleRate*NumChannels*(BitsperSample/8))
• BlockAlign:
- Kích thước:2 byte
- Chức năng: cho biết số byte của 1 mẫu gồm tất cả các kênh. • BitsPerSample: cho biết số bit trên 1 mẫu chỉ tính cho 1 kênh. ( 8 bit=8,16 bit=16,v.v)
Data Chunk - "dữ liệu"
Chunk sóng dữ liệu chứa dữ liệu mẫu âm thanh kỹ thuật số có thể được giải mã bằng cách sử dụng định dạng và phương pháp nén quy định tại Chunk Định dạng Wave.
Đối với mẫu âm thanh 8 bit,dữ liệu của “data” bao gồm các giá trị 1 byte(từ 0-255) của các mẫu âm thanh. Với mẫu âm thanh 16 bits,mỗi mẫu dữ liệu gồm 2 bytes (-32768 đến 32767).
Cấu trúc :
typedef struct
{
ID chunkID; Long chunkSize;
unsigned char waveformData [];
} DataChunk;
ChunkSize là số lượng byte trong đoạn.
Độ phân giải bit và các thông tin khác nhận được từ các đoạn định dạng(Format).
Các mảng waveformData chứa dữ liệu dạng sóng thực tế. Dữ liệu được sắp xếp thành các khung mẫu.
Số lượng các khung mẫu trong waveformData được xác định bằng cách chia này chunkSize wBlockAlign đoạn định dạng.
Chunk dữ liệu là cần thiết vì chỉ có một Chunk dữ liệu có thể xuất hiện trong một WAVE.
Làn sóng các tập tin thường chứa chỉ có một đoạn dữ liệu, nhưng chúng có thể chứa nhiều hơn một nếu họ được chứa trong một Chunk Danh sách Wave ("wavl").
Hình 3.4: Định dạng dữ liệu Chunk
Mẫu kĩ thuật số đa kênh âm thanh được lưu trữ như các dữ liệu sóng xen kẽ (như âm thanh stereo và surround).
Sóng tập tin được lưu trữ bằng cách lướt qua các mẫu âm thanh cho mỗi kênh trước khi tiến tới mẫu tiếp theo. Điều này được thực hiện để các tập tin âm thanh có thể được phát hoặc xem trực tiếp trước khi tồn bộ tập tin có thể được đọc. Đây là tiện dụng khi phát một file lớn từ đĩa (có thể khơng hồn tồn phù hợp với bộ nhớ) hoặc trình chiếu một tập tin qua Internet.
Các giá trị trong sơ đồ dưới đây sẽ được lưu trữ trong một file Wave theo thứ tự được liệt kê trong cột giá trị (trên xuống dưới).
Hình 3.5: Làn sóng mẫu Interlaced Stereo
Một điểm về dữ liệu mẫu mà có thể gây ra một số nhầm lẫn khi mẫu được biểu diễn với 8-bit, được quy định như giá trị unsigned. Tất cả các mẫu khác - bit kích thước được quy định cụ thể như các giá trị đã kí kết. Ví dụ một mẫu 16-bit có thể là -32.768-32767 với một điểm giữa (im
lặng) ở 0.
Như đã đề cập trước đó, tất cả các khối RIFF (bao gồm cả WAVE "dữ liệu" khối) phải được liên kết từ. Nếu dữ liệu mẫu sử dụng một số lẻ của byte, một byte padding với một giá trị không phải được đặt ở phần cuối của dữ liệu mẫu. Các đoạn "dữ liệu" tiêu đề của kích thước khơng nên bao gồm byte này.
Fact Chunk - "thực tế"
Một đoạn thông tin thực tế nén phụ thuộc mã về nội dung của tập tin sóng. Đó là yêu cầu tất cả các định dạng WAVE nén và khi các dữ liệu dạng sóng được chứa bên trong một đoạn "wavl DANH SÁCH", nhưng không cần thiết cho các tập tin định dạng khơng nén PCM WAVE (nén mã 1) có chứa các dữ liệu dạng sóng bên trong một đoạn "dữ liệu" .
Hình 3.6: Định dạng thực tế Chunk
Định dạng Phụ thuộc dữ liệu :
Hiện tại chỉ có một lĩnh vực quy định cho các dữ liệu phụ thuộc vào định dạng. Đó là một giá trị duy nhất 4-byte quy định cụ thể số lượng mẫu trong đoạn dữ liệu dạng sóng. Giá trị này có thể được sử dụng với các mẫu ,mỗi giá trị thứ hai quy định trong định dạng đoạn để tính tốn chiều dài dạng sóng trong vài giây.
Khi định dạng WAVE mới được giới thiệu, các đoạn thực tế sẽ được mở rộng, lĩnh vực phụ được thêm vào sau khi số lượng quy định của mẫu nghiên cứu lấy.
Các ứng dụng có thể sử dụng kích thước đoạn thực tế để xác định các lĩnh vực có mặt trong đoạn.
3.2.4 Đọc file RIFF:
Làn sóng tập tin header theo cấu trúc tập tin định dạng RIFF chuẩn. 8 byte đầu tiên trong tập tin tiêu đề trong đó có một ID đoạn "RIFF" và
một đoạn kích thước bằng kích thước tập tin trừ đi 8 byte được sử dụng bởi tiêu đề.
Vì vậy, chúng ta cần phải biết tổng chiều dài của tất cả các tập tin để xác định ChunkSize và đọc NumChannels SampleRate và BitsPerSample.
private void WaveHeaderIN( string spath) {
FileStream fs = new FileStream(spath, FileMode.Open, FileAccess.Read);
BinaryReader br = new BinaryReader(fs); length = ( int )fs.Length - 8 ;
fs.Position = 22 ; channels = br.ReadInt16(); fs.Position = 24 ; samplerate = br.ReadInt32(); fs.Position = 34 ; BitsPerSample = br.ReadInt16(); DataLength = ( int )fs.Length - 44 ; br.Close ();
fs.Close(); }
Như chúng ta biết, các kênh được lưu trữ trong tiêu đề WAV trong số byte 22, chúng tôi di chuyển vị trí hiện tại của tập tin đến vị trí này và kích thước của nó là 2 byte, do đó chúng tơi sử dụng br.ReadInt16 () để đọc chỉ có 2 byte.
private void WaveHeaderOUT( string sPath) {
FileStream fs = new FileStream(sPath, FileMode.Create, FileAccess.Write );
BinaryWriter bw = new BinaryWriter(fs); fs.Position = 0;
bw.Write(new char[4] { 'R', 'I', 'F', 'F' }); bw.Write(length);
bw.Write(new char[8] {'W','A','V','E','f','m','t',' '}); bw.Write((int)16);
bw.Write((short)1); bw.Write(channels); bw.Write(samplerate );
bw.Write((int)(samplerate * ((BitsPerSample * channels) / 8))); bw.Write((short )((BitsPerSample * channels) / 8));
bw.Write(new char[4] {'d','a','t','a'}); bw.Write(DataLength);
bw.Close(); fs.Close(); }
Khai báo "RIFF" như là một mảng của char, không phải là chuỗi và sử dụng loại int để lưu trữ 4 byte và loại ngắn để lưu trữ 2 byte. public void Merge( string [] files, string outfile)
{
WaveIO wa_IN = new WaveIO(); WaveIO wa_out = new WaveIO();
wa_out.DataLength = 0; wa_out.length = 0; //Gather header data
foreach (string path in files) {
wa_IN.WaveHeaderIN(@path);
wa_out.DataLength += wa_IN.DataLength; wa_out.length += wa_IN.length;
}
//Recontruct new header
wa_out.BitsPerSample = wa_IN.BitsPerSample; wa_out.channels = wa_IN.channels;
wa_out.samplerate = wa_IN.samplerate; wa_out.WaveHeaderOUT(@outfile); foreach (string path in files)
{
FileStream fs = new FileStream(@path, FileMode.Open, FileAccess.Read);
byte[] arrfile = new byte[fs.Length - 44]; fs.Position = 44;
fs.Read(arrfile, 0, arrfile.Length); fs.Close();
BinaryWriter bw = new BinaryWriter(fo); bw.Write(arrfile);
bw.Close(); fo.Close();
}
Chúng ta cần để tính tốn tổng chiều dài và chiều dài dữ liệu của tất cả các tập tin và sau đó xác định các kênh, SampleRate và BitsPerSample của file.
Tất cả chúng ta cần làm là gọi phương thức kết và quy định cụ thể các tập tin đầu vào và tập tin đầu ra.
string [] files = new string [ 2 ] { @" ..\đường dẫn\file.wav" , @"C:\WINDOWS\Media\Windows\XP Shutdown.wav" }; WaveIO wa = new WaveIO();
CHƢƠNG 4: TÌM HIỂU DỊCH VỤ TRA CỨU ĐIỂM TUYỂN SINH
4.1 Tổng quan về hệ thống tuyển sinh: 4.1.1 Hoạt động: 4.1.1 Hoạt động:
Khi khách hàng gọi đến tổng đài , khách hàng có thể biết được mã trường , điểm thi của một thí sinh nào đó ứng với số báo danh.
Theo lí thuyết, tuỳ theo chương trình mà ta chuyển xử lí đến điện thoại viên hay để máy xử lí tự động.Và nếu chuyển đến điện thoại viên thì ta phải quản lí thêm kênh kết nối giữa người và máy.Điều này sẽ làm ta khó quản lí hơn.
Và trong thực tế, tổng đài thường được xử lí một cách tự động. Nó tạo hiệu quả xử lí nhanh và dễ quản lí. Chính điều đó, trong ứng dụng này, ta sẽ tạo một ứng dụng hoàn toàn tự động.
4.1.2 Các thành phần và quá trình hoạt động:
Các thành phần
Database server – sql server : chứa dữ liệu của dịch vụ. Hub – router : kết nối mạng và các máy tính cục bộ.
Máy tính : dùng để truy xuất cơ sở dữ liệu cà cài đặt softphone. Softphone -3CX: điện thoại giao tiếp với người dùng.
Khi bạn gọi tới hệ thống ,ứng dụng sẽ xuất hiện ngay câu chào : “Chào mừng bạn đến với dịch vụ tra điểm tuyển sinh”.
Xử lý của ứng dụng
Giao tiếp trong mạng Lan
Trong phần demo này, ta cho các máy tính giao tiếp trog mạng Lan cục bộ chứ khơng giao tiếp với mạng điện thoại bên ngồi mạng được. Muốn kết nối được ta phải một thiết bị trung gian nào đó để có thể kết nối máy tính với máy điện thoại bên ngoài.
Trong thực tế,ứng dụng sẽ được giao tiếp trực tiếp với mạng điện thoại thông qua một số Card do cơng ty Digium sản xuất.Nó giúp việc giao tiếp thuận lợi hơn.
Truy vấn dữ liệu
Tồn bộ thơng tin điểm ,số báo danh,danh sách thí sinh đều được lưu trữ trong chương trinh SQL Server 2005.
Chương trình xử lý dựa vào thơng tin mà người dùng cung cấp như mã thí sinh mà đáp ứng yêu cầu người dùng.
Chương trình đóng vai trị như client giao tiếp với SQL để gởi và nhận dữ liệu cần thiết.
Thông tin lấy được ở đây là dạng Text. Phát ra âm thanh
Đây là quá trình giao tiếp giữa người và máy nên ta phải xử lí sao cho người dùng có thế nghe được âm thanh.
Khi thơng tin được trả về, nó có dạng text nên ta phải chuyển sang dạng âm thanh tương ứng để người sử dụng hiểu được. Tóm lại, chức năng chính của hệ thống là làm sao chuyển từ dạng text
sang dạng văn nói (tiếng nói) tương ứng với chữ đó. Và chức năng đó gọi là Text to Speech.
Hoạt động
Khi gọi vào, hệ thống sẽ yêu cầu bạn nhập mã số dự thi để bắt đầu tra cứu.Khi nhập xong,dựa vào mã số dự thi này,chương trình sẽ tìm kiếm trong cơ sở dữ liệu và thơng báo kết quả cho bạn.
4.2 Chức năng của hệ thống: 4.2.1 Tổng quát chức năng 4.2.1 Tổng quát chức năng
4.2.2 Sơ đồ xử lí chức năng Lựa chọn Lựa chọn phím bấm Nghe điểm thi Đọc kết quả theo SBD Nghe mã mơn thi Khơng có sinh viên Gọi vào số 200 Nhập SBD khác Kết thúc cuộc gọi Truy vấn CSDL Trả lời tự động Phím 1 Phím 2
hết thời gian thao tác
hết thời gian thao tác khơng có có điểm hết thời gian xử lí Phím 2
4.3 Thiết kế lƣợc đồ dữ liệu quan hệ ERD 4.3.1 Các tập thực thể 4.3.1 Các tập thực thể
Hình 4.2: Mơ hình tập thực thể
4.3.2 Diagram
4.4 Các bảng dữ liệu
4.4.1 Danh sách bảng dữ liệu:
Trương
- Chứa các thông tin về trường
- Thuộc tính: matruong,tentruong,status MonHoc
- Chứa thông tin về các môn thi - Thuộc tính: mamh,tenmh,status SinhVien
- Chứa thơng tin chi tiết về thí sinh.
- Thuộc tính: masv ,tensv,ngaysinh,status,matruong Diem
- Chứa kết quả điểm thi của thí sinh - Thuộc tính: masv,mamh,diem,status. TuDien
- Chứa tập hợp các từ ngữ trong tiếng việt. - Thuộc tính : matu, tu
4.4.2 Mô tả các bảng:
MonHoc
Diem
TuDien
4.4.3 Các mối liên hệ
Mối liên hệ bảng Truong-SinhVien
- Mỗi sinh viên thi vào 1 trường và mỗi trường thì có nhiều sinh viên dự thi. Vì vậy,mối quan hệ là một-nhiều.
- Mỗi thí sinh thi vào 1 trường sẽ có 1 điểm tương ứng với môn thi
Mối liên hệ bảng Monhọc- bảng Diem
- Mỗi mơn học thì có 1 điểm số và mỗi điểm số được chấm cho nhiều mơn học. Vì vậy, quan hệ là nhiều-một.
4.5 Những thuận lợi và khó khăn của ứng dụng: 4.5.1 Thuận lợi 4.5.1 Thuận lợi
Chương trình server tổng đài nhẹ,tốn ít dung lượng bộ nhớ và dễ cài đặt. Người dùng dễ dàng sử dụng dịch vụ thơng qua các phím nhấn trên
softphone.
4.5.2 Khó khăn
Chưa triển khai với cuộc gọi ngồi mạng do khơng có hỗ trợ phần cứng là card digium.
Kết quả điểm trả về nhanh hay chậm tuỳ thuộc vào tốc độ đường truyền nhanh hay chậm.
Việc dùng hàm text to speech để ghép từng từ làm cho chuỗi âm thanh cịn rời rạc nên âm thanh khơng hay lắm.
CHƢƠNG 5: CÀI ĐẶT VÀ CẤU HÌNH HỆ THỐNG SERVER 5.1 Cài đặt các tính năng cơ bản của tổng đài Asterisk 5.1 Cài đặt các tính năng cơ bản của tổng đài Asterisk
5.1.1 Yêu cầu thiết bị:
Cài đặt hệ điều hành Linux trên máy tính , có thể cài hệ điều hành Linux Fedora, CentOS, Redhat, hoặc Debian ,ở đây ta cài bản Centos server 5.6.
Máy server cài hệ điều hành Linux để xây dựng hệ thống Server Asterisk. Ở đây, ta dùng hệ điều hành linux centos 5.6
Máy client cài hai softphone là X-Lite và 3CX nối mạng với máy tính Server asterisk.(Ở đây server asterisk được chạy trên máy ảo Virtual
Box- link download:
https://www.virtualbox.org/wiki/Linux_Downloads.)
5.1.2 Các bƣớc cài đặt các gói Asterisk phiên bản 1.6.2.20
Tải các gói sau và để trong thư mục : usr/src/asterisk Asterisk 1.6.2.20 http://downloads.asterisk.org/pub/telephony/asterisk/releases/asterisk- 1.6.2.20.tar.gz Dahdi-2.4.1.2 http://downloads.asterisk.org/pub/telephony/dahdi- linux/releases/dahdi- linux-2.4.1.2.tar.gz Dahdi-tool-2.4.1.2 http://downloads.asterisk.org/pub/telephony/dahdi-tools/releases/dahdi- tools- 2.4.1.2.tar.gz Libpri 1.4.12 http://downloads.asterisk.org/pub/telephony/libpri/releases/libpri-1.4.12.tar.gz Sau khi tải thành công, ta giải nén các gói và cài đặt theo trình tự sau: (lệnh giải nén: tar –xzvf file nén)
cd /usr/src/asterisk/libpri-1.4.12 make make install cd /usr/src/asterisk/dahdi-linux-2.4.1.2 ./configure make all make install cd /usr/src/asterisk/dahdi-tool-2.4.1.2
make config cd /usr/src/asterisk/asterisk-1.6.2.20 ./configure make make install make config make samples
Ta có thể cài thêm gói Asterisk-Addon để hổ trợ các file âm thanh mp3…. Khởi động Asterisk bằng lệnh sau:
service dahdi start asterisk –cvvvv asterisk –r Thoát khỏi Asterisk:
Exit
Shut down
5.1.3 Tải chƣơng trình Asterisk.NET:
Chương trình Asterisk.NET giúp ta thực hiện cơ chế gọi từ xa FastAGI. Nó bao gồm chức năng quản lí API.
Khi máy tổng đài muốn lấy một ứng dụng nào từ xa thì trên máy đó,ta chạy chương trình ứng dụng Asterisk.NET này lên và trả về kết quả cho máy server thông qua các Script.
Link down: http://sourceforge.net/projects/asterisk-dotnet/
5.1.4 Cấu hình SIP cho softphone