Cơ chế FastAGI

Một phần của tài liệu công nghệ voip trên nền asterisk (Trang 34 - 78)

2.8.1 FastAGI là gì?

 FastAGI có thể được sử dụng như một khuôn mẫu để thiết kế quá trình lập trình AGI từ xa của bạn.

 Cơ chế này giúp giảm tải trên CPU của bạn. Nó sẽ gọi dịch vụ từ một máy tính khác trong mạng và trả về kết quả cho server xử lí.Nó giúp cho server bớt công đoạn xử lí các công việc,giảm quá trình tắt nghẽn tổng đài.

 FastAGI vẫn là một trong những lựa chọn thay thế tốt nhất để xây dựng các ứng dụng Asterisk, tách các ứng dụng riêng của mình, nhân rộng trên nhiều ứng dụng máy chủ FastAGI.

 Để kết nối với một giao diện AGI /API interfaces,ta phải có một số thư viện để kết nối. Chúng bao gồm:

 Asterisk –Java  Asterisk.NET  PHPAGI  Asterisk-Perl  Asterisk-PyThon

2.8.2 Hoạt động

 Đầu tiên,trên tổng đài ta chỉ khai báo địa chỉ của máy cục bộ(nơi xử lí công việc dùm server)

AGI:\\192.168.1.123\script_cong_viec

 Down về thư viện Asterisk.NET để chạy các script trên máy cục bộ và trả về kết quả cho server. Thư viện này bao gồm một tập hợp các lớp C# cho phép bạn dễ dàng xây dựng các ứng dụng tương tác với một máy chủ PBX Asterisk. Cả FastAGI và API đều được hỗ trợ trong .NET / Mono tương thích.

 Asterisk NET hỗ trợ cả hai giao diện đó Asterisk cung cấp cho kịch bản này:Các giao thức FastAGI và quản lý API. Việc thực hiện FastAGI hỗ trợ tất cả các lệnh có sẵn từ Asterisk.

 Link down : http://sourceforge.net/projects/asterisk-dotnet/

CHƢƠNG 3: TÌM HIỂU CHỨC NĂNG TEXT TO SPEECH

3.1 Khái niệm:

3.1.1 Sơ lƣợc về tiếng nói trong VoIP:

 Là công cụ để diễn đạt ý nghĩ và giao tiếp giữa người với người.Tiếng nói là một sự kết hợp của rất nhiều âm thanh khác nhau.

 Trong lĩnh vực viễn thông , ta có cụm từ “voice over IP”. Đó là “tiếng nói qua giao thức Internet”. Nói đến công nghệ tiếng nói qua IP là nói đến việc truyền dẫn tiếng nói qua các mạng lưới hoạt động dựa trên mạng internet. Ban đầu giao thức Internet (Internet Protocol - IP) được thiết kế để nối mạng dữ liệu và sau khi vận hành thành công, giao thức đã được áp dụng vào việc nối mạng tiếng nói.

 Công nghệ tiếng nói qua IP (VoIP) có thể dễ dàng hỗ trợ các nhiệm vụ và đáp ứng các dịch vụ mà khi sử dụng hệ thống PSTN truyền thống có thể sẽ phức tạp hay tốn kém.

3.1.2 Khái niệm về Text To Speech:

 Text To Speech (kí hiệu TTS) là quá trình chuyển dạng văn bản dạng text sang tiếng nói.

 TTS được phân loại như sau:  Nối từ (Concatenated Word):

 Là hệ thống chứa những từ đã được ghi âm sẵn . Khi nhận được một chuỗi văn bản cần đọc, hệ thống tách các từ trong chuỗi này ra. Sau đó, tìm các từ này trong hệ thống từ ghi âm sẵn. Cuối cùng, ta kết hợp các từ tương ứng trong chuỗi lại và phát âm thành câu.

 Hai âm tố(Diphone Concatenation):

 Là phương pháp nối lại những đoạn âm thanh ngắn đã được số hoá và tạo ra âm thanh liên tục. Mỗi diphone bao gồm hai âm vị : một âm vị bắt đầu và một âm vị kết thúc.

 Tổng hợp:

 Là phương pháp tạo âm giống giọng con người với sự mô phỏng về chiều dài,cổ họng,khoang miệng…Với kĩ thuật này, ta có thể thay đổi chất lượng giọng ,tạo ra âm trầm bổng khác nhau.

3.1.3 Lí do chọn Text To Speech

 Thuận tiện cho việc đọc văn bản động, nhất là các cụm từ ngữ ngắn và luôn thay đổi liên tục mà ta không thể ghi âm hết tất cả.

 Khi đọc lên văn bản hay số liệu sẽ giúp người sử dụng có thể nghe lại văn bản của mình và phát hiện lỗi khi gõ bàn phím.

 Cung cấp những phản hồi rõ ràng và thông báo cho người dùng bằng âm thanh phát ra. Người dùng có thể nghe và đáp ứng lại thông báo. (adsbygoogle = window.adsbygoogle || []).push({});

 Ứng dụng này rất thiết thực và hữu ích trong cuộc sống như: hộp thư thoại, các tổng đài trả lời tự động,các đường dây nóng 1900xxx…

3.1.4 Hạn chế của Text To Speech (TTS)

 Chất lượng giọng chưa tốt đôi khi khó nghe nếu đọc cụm từ dài . Vì TTS thực chất là ta phải nối từng từ lại với nhau để tạo thành 1 câu dài. Nó là giọng đọc tổng hợp các từ ngữ với các dấu nhấn,nhịp ngắt,trọng âm,thời gian đọc….

 Biểu cảm cảm xúc như chấm than,chấm hỏi lên xuống giọng sẽ không đáp ứng thật như con người.

 Có thể bị lỗi phát âm từ sai do đặc điểm phát âm của từng vùng trong nước.

3.2 Cấu trúc file âm thanh 3.2.1 Khái niệm: 3.2.1 Khái niệm:

 Tâ ̣p tin âm thanh là mô ̣t da ̣ng tâ ̣p tin dùng để lưu trữ dữ liê ̣u âm thanh số (dạng sóng ) và nó là một trong những định dạng phổ biến nhất của hệ điều hành Windows.

 Tâ ̣p tin wave thuô ̣c chuẩn RIFF ( Resource Interchange File Format - dạng tập tin tài nguyên có thể trao đổi).

 Đặc điểm của những tập tin thuộc chuẩn RIFF đó là nó sẽ nhóm nội dung của tâ ̣p tin thành các khối riêng biệt .Mỗi một khối sẽ gồm một header (dùng để qui định kiểu và kích thước của khối ) và các byte dữ liê ̣u.

 Tập tin wave có hai dạng là dạng nén và dạng không nén (dạng chuẩn).Vì thế trong đề tài này tôi chỉ đề cập đến dạng chuẩn của tập tin wave tức là dạng không nén.

3.2.2 Định dạng dữ liệu:

 Tất cả các giá trị dữ liệu được lưu trữ trong thứ tự nhỏ dần về cuối (byte ít quan trọng đầu tiên).

 File sóng có thể chứa các chuỗi văn bản quy định cụ thể các nhãn điểm nhấn, ghi chú,… Strings được lưu trữ trong một định dạng mà các byte đầu tiên xác định số lượng theo byte văn bản ASCII trong chuỗi.

 Các byte sau đây là các byte ký tự ASCII tạo nên các chuỗi văn bản. Đây là định dạng được sử dụng cho các chuỗi Pascal.

7 'E' 'X' 'A' 'M' 'P' 'L' 'E'

Hình 3.1: Định dạng chuỗi sóng

3.2.3 Xử lí tập tin wave

 Là một dạng tập tin dùng để lưu trữ dữ liệu âm thanh số(dạng sóng) và nó là một trong những định dạng phổ biến nhất của hệ điều hành Windows.

 Một file RIFF chứa một hay nhiều loại chunks.Mỗi chunk gồm có loại chunk và dữ liệu theo sau loại chunk đó,đồng thời chứa con trỏ để trỏ đến chunk kế tiếp.

 Cấu trúc file âm thanh gồm ba khối: khối mô tả dạng RIFF,khối thuộc tính “fmt “ và khối dữ liệu “data” trong đó khối thuộc tính “fmt” và khối dữ liệu “data” là 2 khối con của khối mô tả dạng RIFF.

Hình 3.2: Cấu trúc tập tin âm thanh 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 publicushort wFormatTag;

// có hai giá trị: bằng 1 cho âm thanh mono, bằng 2 cho âm thanh stereo

publicushort wChannels; (adsbygoogle = window.adsbygoogle || []).push({});

// cho biết tốc độ lấy mẫu (11025-11,025kHz,22050-22,05 kHz…)

publiculong 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

publiculong dwAvgBytesPerSec;

// mẫu <= 8 bit sẽ yêu cầu 1 byte, mẫu 9-16 bit sẽ yêu cầu 2 bytes

publicushort wBlockAlign;

// cho biết số bit trong một mẫu dữ liệu(dạng byte hay word) publicushort 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 chuỗ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) (adsbygoogle = window.adsbygoogle || []).push({});

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 toà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 hoàn toà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 toán chiều dài dạng sóng trong vài giây. (adsbygoogle = window.adsbygoogle || []).push({});

 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 (adsbygoogle = window.adsbygoogle || []).push({});

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 toá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:

Một phần của tài liệu công nghệ voip trên nền asterisk (Trang 34 - 78)