Нет звука со стороны клиента с помощью Microsoft Translator - PullRequest
2 голосов
/ 30 марта 2012

У меня возникли некоторые проблемы при использовании переводчика Microsoft. Метод Speak интерфейса HTTP.

Это мой код:

public void Speak()
    {
        AdmAuthentication admAuth = new AdmAuthentication("clientID", "clientSecret");
        AdmAccessToken admToken;
        string headerValue;
        admToken = admAuth.GetAccessToken();
        // Create a header with the access_token property of the returned token
        headerValue = "Bearer " + admToken.access_token;
        string language = "zh-CHS";
        string uri = "https://api.microsofttranslator.com/v2/Http.svc/Speak?&text=" + System.Web.HttpUtility.UrlEncode(lblRead.Text) + "&language=" + language + "&format=" + HttpUtility.UrlEncode("audio/wav") + "&options=MaxQuality";
        WebRequest webRequest = WebRequest.Create(uri);
        webRequest.Headers.Add("Authorization", headerValue);
        WebResponse response = null;
        try
        {
            response = webRequest.GetResponse();
            using (Stream stream = response.GetResponseStream())
            {
                using (SoundPlayer player = new SoundPlayer(stream))
                {
                    player.PlaySync();
                }
            }
        }
        catch
        {

            throw;
        }
        finally
        {
            if (response != null)
            {
                response.Close();
                response = null;
            }
        }
    }
    }

    public class AdmAccessToken
    {
        [DataMember]
        public string access_token { get; set; }
        [DataMember]
        public string token_type { get; set; }
        [DataMember]
        public string expires_in { get; set; }
        [DataMember]
        public string scope { get; set; }
    }

    public class AdmAuthentication
    {
        public static readonly string DatamarketAccessUri = "https://datamarket.accesscontrol.windows.net/v2/OAuth2-13";
        private string clientId;
        private string cientSecret;
        private string request;

        public AdmAuthentication(string clientId, string clientSecret)
        {
            this.clientId = clientId;
            this.cientSecret = clientSecret;
            //If clientid or client secret has special characters, encode before sending request
            this.request = string.Format("grant_type=client_credentials&client_id={0}&client_secret={1}&scope=http://api.microsofttranslator.com", HttpUtility.UrlEncode(clientId), HttpUtility.UrlEncode(clientSecret));
        }

        public AdmAccessToken GetAccessToken()
        {
            return HttpPost(DatamarketAccessUri, this.request);
        }

        private AdmAccessToken HttpPost(string DatamarketAccessUri, string requestDetails)
        {
            //Prepare OAuth request 
            WebRequest webRequest = WebRequest.Create(DatamarketAccessUri);
            webRequest.ContentType = "application/x-www-form-urlencoded";
            webRequest.Method = "POST";
            byte[] bytes = Encoding.ASCII.GetBytes(requestDetails);
            webRequest.ContentLength = bytes.Length;
            using (Stream outputStream = webRequest.GetRequestStream())
            {
                outputStream.Write(bytes, 0, bytes.Length);
            }
            using (WebResponse webResponse = webRequest.GetResponse())
            {
                DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(AdmAccessToken));
                //Get deserialized object from JSON stream
                AdmAccessToken token = (AdmAccessToken)serializer.ReadObject(webResponse.GetResponseStream());
                return token;
            }
        }

Я удалил идентификатор клиента и секрет клиента.

Проблема, с которой я сталкиваюсь, заключается в том, что я ничего не слышу, если запускаю сайт на сервере.Да, я знаю, что когда пользователь нажимает кнопку, на сервере создается SoundPlayer, поэтому клиентская часть ничего не слышит.

Я искал все виды методов поиска.Но безрезультатно.

Я пытался использовать метод для сохранения потока и обновления базы данных.Все хорошо, если я запускаю его из Visual Studio.Но на стороне клиента он не может загрузить поток.Или даже воспроизведение звукового файла, который я извлекаю из базы данных.

Пожалуйста, помогите мне

Я использую Visual Studio 2010 с .NET Framework 4.0, и текст, который я пытаюсь услышать, написан на китайском языке.

ОБНОВЛЕНИЕ: У меня есть другой способ выполнить эту задачу.Если у кого есть интерес.Могли бы PM и попросить коды.

1 Ответ

0 голосов
/ 30 марта 2012

На самом деле вы можете реализовать этот процесс сквозным в Silverlight, но я не знаю, как только в ASP.NET.Однако, так как вы можете прикрепить элемент управления Silverlight на странице ASP.NET легко (см. здесь ), вы можете преобразовать вызовы API кода перехода в небольшой элемент управления Silverlight и поместить его на свойСтраница ASP.NET.

Как указано в записи блога Тима Хеера, MediaElement не может напрямую воспроизводить формат WAV без потерь.Однако в Codeplex имеется объект «WaveMediaStreamSource», созданный членом команды Silverlight и позволяющий воспроизводить поток на клиенте по мере необходимости.

После получения потерянного значения из вызова Translator APIчерез REST (или какой-либо метод, который вы выберете: SOAP, HTTP, AJAX), вы можете загрузить конструктор WaveMediaStreamSource с его значением для воспроизведения клиенту.

Не бойтесь, если вы никогда не использовалиSilverlight до того как это решение начало заканчиваться, не должно быть таким сложным.Ссылка из примера Тима и связанный с ним WaveMediaStreamSource из CodePlex приведены ниже.

Сделайте ваши приложения Silverlight Поговорите с вами с помощью Microsoft Translator

WaveMediaStreamSource (Codeplex)

...