الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

كيفية استخدام AT&T لقراءة الكلمات (Text To Speech)

بدأه Mahmoud Kelany في 15 مارس 2012 · 5 رد · 1,144 مشاهدة · في JavaSE
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم ورحمه الله وبركاته

اقدم لكم درس بسيط وهو كيفية التعامل مع الموقع 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

Test AT&T.zip

بالتوفيق جميعا

واتمنى ان يكون الشرح مفيد والموضوع ايضا مفيد

وشكرا لمن جعلنى ابحث فى هذه الطريقة smile.gif

لكى تعم الفائدة smile.gif

3

Software Developer
Mahmoudkelany.com


 

#3

هناك مشكلة بسيطة في الموضوع

ماذا يحصل لو غيرت AT&T موقعها؟

أفضل أن أستخدم API على أن أقوم بعمل hack

لأني لا أضمن متى يصبح برنامجي خارج نطاق الخدمة

على كل لازال الحل فاعل في حالة عدم وجود بديل :)

تحياتي

حزمة المحرك الإصدارة 0.8

أي أحد يجد أني ظلمته فليراسلني

وبإذن الله لو كان له حق سيأخذه

728x90.png

#4

هتعمل hack على مين ROFL.gif

انا حاولت اجد لها API لكن صراحه لم اجد

ممكن يكون احد الاخوة وجد ذلك

لكن انت تعلم جيدا ان معظم السيرفرات المعروفه لا تغير IP

وهذا ما تم الاعتماد عليه :)

Software Developer
Mahmoudkelany.com


 

#5

موضوع جميل وشرح أجمل.

+1

عفواً أحبتي انقطاعي بسبب الدراسة دعواتكم بالتوفيق..

{ لا ينال العلم مستحٍ ولا مستكبر }

#6

المقصود بـ hack هنا عمل الشيء الذي لا يعرف عنه الآخر شيء

فلما يقوم الآخر بتغيير عمله لا يأخذك بالحسبان

صحيح معظم السيرفرات لا تغير IP أو حتى لو غيرت IP فإنها لا تغير domain

لكن ليس جميع المواقع لا تغير محتواها فتضيف أو تزيل لينك أو تقوم بالتحول إلى ajax

على كل كما أخبرتك في حال عدم وجود بديل فأنت مجبر

لكن على حد علمي يوجد بديل :)

لكني لم أحتاج الموضوع

تحياتي

حزمة المحرك الإصدارة 0.8

أي أحد يجد أني ظلمته فليراسلني

وبإذن الله لو كان له حق سيأخذه

728x90.png

مواضيع مشابهة