客户端使用Microsoft Translator没有声音

时间:2012-03-30 05:28:31

标签: c# asp.net text-to-speech

我在使用HTTP接口的microsoft translator Speak方法时遇到了一些问题。

这是我的代码:

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;
            }
        }

我删除了客户端ID和客户端密钥。

我面临的问题是,如果我在服务器上运行该站点,我将无法听到任何声音。是的我知道当用户点击按钮时,SoundPlayer会在服务器上生成,因此客户端听不到任何声音。

我搜索了各种搜索方法。但无济于事。

我尝试使用方法来保存流并更新到数据库。如果我从Visual Studio运行它,一切都很好。但在客户端,它无法下载流。甚至可以播放我从数据库中检索到的声音文件。

请帮帮我

我正在使用Visual Studio 2010和.NET Framework 4.0,而我想听到的文字是中文。

更新:我使用其他方式完成此任务。如果有人有兴趣。请PM我,并要求代码。

1 个答案:

答案 0 :(得分:0)

您实际上可以在Silverlight中端到端地实现此过程,但我不知道ASP.NET中的。但是,由于您可以在ASP.NET页面上轻松地锚定Silverlight控件 (请参阅here),您可以将转换代码API调用重构为一个小的Silverlight控件并将其放在您的ASP上.NET页面。

正如Tim Heuer的博客文章所指出的,MediaElement无法直接播放无损WAV格式。然而,在Codeplex上有一个'WaveMediaStreamSource'对象可由Silverlight团队的成员创建,并允许在您需要的时候在客户端上播放流。

在通过REST调用Translator API(或者你选择的方法,SOAP,HTTP,AJAX)来接收转换后的值之后,你可以加载WaveMediaStreamSource构造函数,并将其值重播给客户端。

如果您之前从未使用Silverlight,请不要害怕,因为这个解决方案开始结束应该不那么困难。来自Tim的示例和来自CodePlex的相关WaveMediaStreamSource的链接如下。

Make your Silverlight applications Speak to you with Microsoft Translator

WaveMediaStreamSource (Codeplex)