السلام عليكم ورحمه الله وبركاته
اقدم لكم درس بسيط وهو كيفية التعامل مع الموقع AT &T
http://www2.research...eb/tts/demo.php
المستخدم لقراءة الكلمات المكتوبة له > Text to speech
استخدمت الـ Form المستخدمة فى الموقع لارسال المتغيرات له
لكن المشكله انها تستخدم طريقة الـ POST
طبعا المشكله لها حل لكن تصعب اكثر عن طريقة الـ GET
استخدمت الدالة التالية لارسال المتغيرات لموقع عن طريق الـ POST وانتظار النتيجه
وهذه الداله تاخذ الرابط وتاخذ المتغيرات
public String doPostSubmit(String url, Map<String, String> data) throws Exception {
String result = "";
URL siteUrl = new URL(url);
HttpURLConnection conn = (HttpURLConnection) siteUrl.openConnection();
conn.setRequestMethod("POST");
conn.setDoOutput(true);
conn.setDoInput(true);
DataOutputStream out = new DataOutputStream(conn.getOutputStream());
Set keys = data.keySet();
Iterator keyIter = keys.iterator();
String content = "";
for (int i = 0; keyIter.hasNext(); i++) {
Object key = keyIter.next();
if (i != 0) {
content += "&";
}
content += key + "=" + URLEncoder.encode(data.get(key), "UTF-8");
}
out.writeBytes(content);
out.flush();
out.close();
BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream()));
String line = "";
while ((line = in.readLine()) != null) {
result += line;
}
in.close();
return result;
}تقوم باخد كائن Map به المدخلات وقيمتها ويقوم بوضعها داخل الـ URL لارسالها بطريقة الـ POST
وبعد ذلك نقوم باستخراج النتيجه من الموقع
وعودتها لعمل مجموعه من العمليات عليها
فهذه هى داله التشغيل
public static void main(String[] args) throws Exception {
ATT att = new ATT();
String ip = "http://192.20.225.36";
String url = ip + "/tts/cgi-bin/nph-nvdemo";
HashMap<String, String> data = new HashMap<String, String>();
data.put("voice", "crystal");
data.put("txt", "God With you");
data.put("downloadButton", "DOWNLOAD");
String doSubmit = att.doPostSubmit(url, data);
String resultURL = ip + att.getResultWavURL(doSubmit);
String outPath = "D:/" + att.getWavFileName(resultURL);
att.downloadWav(resultURL, outPath);
}فهذا الموقع يعود بالنتيجه التى تحتوى على هذا الرابط المستخدم لتحميل الـ WAV File الذى تم صنعه بناء على الاحرف المرسله للموقع
اقتباس<A HREF="/tts/speech/525f05abb56bc0def597bb7943af8271.wav">
نقوم بكتابه الـ IP الخاص بالموقع
وكتابه الصفحه المسئولة عن ذلك فى عمل الـ Text to Speech
ونرسل لها المتغيرات
data.put("voice", "crystal");هى الصوت المستخدم فى القراءة
وهذه هى الاختيارت الاخرى لنوع الصوت نفسه (من المتحدث واللغة له )
value="crystal">Crystal .... US English value="mike">Mike ....... US English value="rich">Rich ....... US English value="lauren">Lauren ..... US English value="claire">Claire ..... US English value="charles">Charles .... UK English value="audrey">Audrey ..... UK English value="anjali">Anjali ..... IN English value="rosa">Rosa ....... Latin Am. Spanish value="alberto">Alberto .... Latin Am. Spanish value="klara">Klara ...... German value="reiner">Reiner ..... German value="francesca">Francesca .. Italian value="giovanni">Giovanni ... Italian value="alain">Alain ...... French value="juliette">Juliette ... French value="arnaud">Arnaud ..... CA French
data.put("txt", "God With you");الكلمة المرسلة
data.put("downloadButton", "DOWNLOAD");الامر المستخدم فى عملية التحميل للملف
ستعود الداله doPostSubmit بالنتيجه العائدة من الخادم
وهى تحتوى على رابط تحميل ملف الـ WAV
استخدمت داله للحصول على هذا الرابط وهى
public String getResultWavURL(String result) {
String[] split = result.split("\"");
for (String string : split) {
if (string.endsWith(".wav")) {
return string;
}
}
return null;
}من الملاحظ ان الرابط يعود بهذا الشكل
اقتباس<A HREF="/tts/speech/525f05abb56bc0def597bb7943af8271.wav">
تقوم هذه الدالة بتقطيع الكلمات على الـ (") لنقوم بالحصول على جميع الكلمات المقطعه
فتعود جميع الكلمات التى تم تقطيعها فى مصفوفة
نقوم بعملية الفحص على الكلمات التى تم تقطيعها ونرى ان كان هناك احدهم ينتهى بـ .wav
نقوم بارجاعه وهذا هو الـ URL
لكن طبعا يحتاج الى الـ IP المستخدم فى الخادم
لذلك تم استخدامها كالتالى
String resultURL = ip + att.getResultWavURL(doSubmit);
بعد ذلك نقوم بحفظ الملف لدينا على الهارد ديسك
لكن نريد ان نخزن الملف بالاسم العائد لدينا من الرابط
لذلك استخدم الداله هذه
public String getWavFileName(String url) {
int lastIndexOf = url.lastIndexOf("/");
return url.substring(lastIndexOf);
}وبعدها نقوم باستخدام الداله الخاصه بحفظ الملف
وهى عباره عن InputStream من الرابط الذى حصلنا عليه
و OuputStream لحفظ الملف على الهارد ديسك
وهذه هى الداله المستخدمه
public void downloadWav(String url, String outPath) {
try {
URL u = new URL(url);
InputStream is = u.openStream();
DataInputStream dis = new DataInputStream(new BufferedInputStream(is));
DataOutputStream dos = new DataOutputStream(new FileOutputStream(outPath));
byte[] buff = new byte[1024];
while (dis.read(buff) != -1) {
dos.write(buff);
dos.flush();
}
dos.close();
dis.close();
} catch (Exception ex) {
ex.printStackTrace();
}
}وها قد انتهينا من الشرح واليكم الكود كاملا
package att;
import java.io.*;
import java.net.*;
import java.util.*;
/**
*
* @author Mahmoud Kelany
*/
public class ATT {
public String doPostSubmit(String url, Map<String, String> data) throws Exception {
String result = "";
URL siteUrl = new URL(url);
HttpURLConnection conn = (HttpURLConnection) siteUrl.openConnection();
conn.setRequestMethod("POST");
conn.setDoOutput(true);
conn.setDoInput(true);
DataOutputStream out = new DataOutputStream(conn.getOutputStream());
Set keys = data.keySet();
Iterator keyIter = keys.iterator();
String content = "";
for (int i = 0; keyIter.hasNext(); i++) {
Object key = keyIter.next();
if (i != 0) {
content += "&";
}
content += key + "=" + URLEncoder.encode(data.get(key), "UTF-8");
}
out.writeBytes(content);
out.flush();
out.close();
BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream()));
String line = "";
while ((line = in.readLine()) != null) {
result += line;
}
in.close();
return result;
}
public String getResultWavURL(String result) {
String[] split = result.split("\"");
for (String string : split) {
if (string.endsWith(".wav")) {
return string;
}
}
return null;
}
public String getWavFileName(String url) {
int lastIndexOf = url.lastIndexOf("/");
return url.substring(lastIndexOf);
}
public void downloadWav(String url, String outPath) {
try {
URL u = new URL(url);
InputStream is = u.openStream();
DataInputStream dis = new DataInputStream(new BufferedInputStream(is));
DataOutputStream dos = new DataOutputStream(new FileOutputStream(outPath));
byte[] buff = new byte[1024];
while (dis.read(buff) != -1) {
dos.write(buff);
dos.flush();
}
dos.close();
dis.close();
} catch (Exception ex) {
ex.printStackTrace();
}
}
}package att;
import java.util.HashMap;
/**
*
* @author Mahmoud Kelany
*/
public class Main {
public static void main(String[] args) throws Exception {
ATT att = new ATT();
String ip = "http://192.20.225.36";
String url = ip + "/tts/cgi-bin/nph-nvdemo";
HashMap<String, String> data = new HashMap<String, String>();
data.put("voice", "crystal");
data.put("txt", "God With you");
data.put("downloadButton", "DOWNLOAD");
String doSubmit = att.doPostSubmit(url, data);
String resultURL = ip + att.getResultWavURL(doSubmit);
String outPath = "D:/" + att.getWavFileName(resultURL);
att.downloadWav(resultURL, outPath);
}
}ولتحميل الكود كاملا باستخدام الـ Netbeans IDE
بالتوفيق جميعا
واتمنى ان يكون الشرح مفيد والموضوع ايضا مفيد
وشكرا لمن جعلنى ابحث فى هذه الطريقة ![]()
لكى تعم الفائدة ![]()
