Как использовать службу перевода Bing для воспроизведения аудио для определенных слов на Android? - PullRequest
3 голосов
/ 02 июля 2011

Я пытаюсь перенести мое приложение WP7 на Android. Я использовал сервис перевода Bing для загрузки и воспроизведения аудио для определенных слов / фраз. Как я могу сделать это в Android? в bing поток приходит в виде файла .wav. Вот мой код WP7:

private void button1_Click(object sender, RoutedEventArgs e)  
    {  
        this.Speak();  
    }  

    public void Speak()  
    {  
        string appId = "Your ID";  
        string text = "Speak this for me";  
        string language = "en";  

        string uri = "http://api.microsofttranslator.com/v2/Http.svc/Speak?appId=" + appId +  
                "&text=" + text + "&language=" + language + "&file=speak.wav";  

        WebClient client = new WebClient();  
        client.OpenReadCompleted += new OpenReadCompletedEventHandler(client_OpenReadCompleted);  
        client.OpenReadAsync(new Uri(uri));  
    }  

    void client_OpenReadCompleted(object sender, OpenReadCompletedEventArgs e)  
    {  
        if (e.Error != null) return;  

        var sound = e.Result;  
        Player.Source = null;  
        string filename = "MyAudio";  
        using (IsolatedStorageFile userStoreForApplication = IsolatedStorageFile.GetUserStoreForApplication())  
        {  
            bool fileExists = userStoreForApplication.FileExists(filename);  

            if (fileExists)  
            {  
                userStoreForApplication.DeleteFile(filename);  
            }  

            var isolatedStorageFileStream = userStoreForApplication.CreateFile(filename);  

            using (isolatedStorageFileStream)  
            {  
                SaveFile(e.Result, isolatedStorageFileStream);  

                if (e.Error == null)  
                {  
                    Player.SetSource(isolatedStorageFileStream);  
                }  
            }  
        }    
    }  

    public static void SaveFile(System.IO.Stream input, System.IO.Stream output)  
    {  
        try 
        {  
            byte[] buffer = new byte[32768];  

            while (true)  
            {  
                int read = input.Read(buffer, 0, buffer.Length);  

                if (read <= 0)  
                {  
                    return;  
                }  

                output.Write(buffer, 0, read);  
            }  
        }  
        catch (Exception ex)  
        {  
            MessageBox.Show(ex.ToString());  
        }  
    }   


    void mysound_MediaFailed(object sender, ExceptionRoutedEventArgs e)  
    {  
        MessageBox.Show(e.ErrorException.Message);  
    }  

    void mysound_MediaOpened(object sender, RoutedEventArgs e)  
    {  
        Player.Play();  
    } 

Ответы [ 2 ]

1 голос
/ 04 сентября 2012

Я подумал, что просто оставлю общий ответ о выполнении HTTP-запросов и загрузке файлов, но более неприятная вещь, с которой я столкнулся, это то, как Microsoft Azure хочет выполнить аутентификацию. Очевидно, использование идентификатора приложения устарело, и их API чрезвычайно требователен к заголовкам и параметрам запроса.

В любом случае, я бы предложил начать с написания AsyncTask, который обрабатывает выполнение HttpURLConnection. Я закончил с:

/**
 * Tailor-made HTTP request for Microsoft Azure, downloading a file to a
 * specified location.
 */
private class HttpDownloadFile extends AsyncTask<String, Integer, String> {

    private String mDir;

    @Override
    protected String doInBackground(String... params) {
        if (params.length < 2) {
            throw new IllegalArgumentException(
                    "Two arguments required for "
                            + getClass().getSimpleName());
        }
        String response = null;
        String uri = params[0];
        String query = params[1];
        try {
            if (query.length() > 0) {
                uri += "?" + query;
            }
            URL url = new URL(uri);
            HttpURLConnection connection = (HttpURLConnection) url
                    .openConnection();
            connection.setRequestProperty("Content-Type",
                    "application/x-www-form-urlencoded");
            if (params.length > 2) {
                connection.setRequestProperty("Authorization", "Bearer "
                        + params[2]);
            }
            connection.connect();
            int fileLength = connection.getContentLength();
            String charset = PREFERRED_CHARSET;
            if (connection.getContentEncoding() != null) {
                charset = connection.getContentEncoding();
            }

            InputStream input;
            OutputStream output;
            boolean isError = false;
            try {
                input = connection.getInputStream();
                output = new FileOutputStream(mDir);
            } catch (IOException e) {
                input = connection.getErrorStream();
                output = new ByteArrayOutputStream();
                isError = true;
            }

            byte data[] = new byte[1024];
            long total = 0;
            int count;
            while ((count = input.read(data)) != -1) {
                total += count;
                publishProgress((int) (total * 100 / fileLength));
                output.write(data, 0, count);
            }

            output.flush();
            if (!isError) {
                response = mDir;
            } else {
                response = ((ByteArrayOutputStream) output).toString(charset);
                Log.e(TAG, response);
                response = null;
            }
            output.close();
            input.close();
        } catch (Exception e) {
            Log.e(TAG, "Failed requesting " + uri, e);
        }
        return response;
    }
}

Затем вы можете выполнить задачу с правильными параметрами:

HttpDownloadFile task = new HttpDownloadFile();
task.execute(
        getString(R.string.url_speak),
        getString(R.string.url_speak_query,
                text, toLanguage, file),
        accessToken,
        Environment.getExternalStorageDirectory().getPath()
                + "/temp.wav");

My strings.xml содержит:

<string 
    name="url_speak" 
    formatted="false" 
    translate="false">http://api.microsofttranslator.com/v2/Http.svc/Speak</string>
<string 
    name="url_speak_query" 
    formatted="false" 
    translate="false">text=%s&amp;language=%s&amp;file=%s</string>

К сожалению, это означает, что вам необходимо написать код для получения токена аутентификации, который уже сделан. Не волнуйтесь! Я также написал полный код для всего этого:

  1. MainActivity.java
  2. strings.xml
0 голосов
/ 03 сентября 2012

Мне это кажется довольно прямолинейным, сначала используйте HttpUrlConnection для вызова веб-службы, а затем обработайте ответ как файл wav, либо вы можете сначала сохранить файл локально, а затем загрузить его в Mediaplayer экземпляр или вы можете напрямую загрузить его в прямом эфире.

...