Ramtin

رفع مشکل تشخیص گفتار صوتی

2 ارسال در این موضوع قرار دارد

سلام، 

توی تاپیک قبلی >

آموزش ساخت دستیار صوتی و تشخیص گفتار صوتی رو آموزش داده بودم.

اما اگه از این کد استفاده کرده باشید می دونید که در بعضی موارد جواب رو نمیده و به احتمال زیاد ف-ی=ل=ت-ر هست.

خب برای رفع این مشکل من یه api کوچیک آماده کردم که شما کافیه که فایلی که رکورد کردید رو به این آدرس پست کنید:

http://appsoorena.ir/api/wit

نمونه کد برای ارسال:

 

        async Task<string> GetAsync(StorageFile file)
        {
            try
            {
                using (HttpClient httpClient = new HttpClient())
                {
                    MultipartFormDataContent form = new MultipartFormDataContent();
                    using (Stream fileStream = (await file.OpenAsync(FileAccessMode.ReadWrite)).AsStream())
                    {
                        byte[] bytes = ReadStream(fileStream);

                        form.Add(new ByteArrayContent(bytes, 0, bytes.Length), "file", file.Name);

                        HttpResponseMessage response = await httpClient.PostAsync("http://appsoorena.ir/api/wit", form);

                        response.EnsureSuccessStatusCode();

                        httpClient.Dispose();
                        string result = response.Content.ReadAsStringAsync().Result;
                        return result;
                    }
                }
            }
            catch (Exception ex)
            {
                Debug.WriteLine("Ex: " + ex.Message + "\r\n\r\n" + ex.Source + "\r\n\r\n" +
                    ex.StackTrace);

            }
            return "";
        }

به صورت پیشفرض این میاد از AccessToken من استفاده میکنه و ارسال فایل به ویت رو انجام میده، اگه مایل هستید که از AccessToken خودتون استفاده کنید، کافیه که توی هدر ارسالی نام هدر رو Authorization بذارید و مقدار اون رو برابر با AccessToken خودتون قرار بدید:

مثال:

                    httpClient.DefaultRequestHeaders.Add("Authorization", "ACCESS TOKEN E SHOMA");

 

نکته: این API قابلیت ارسال همزمان چندین فایل رو داره:
 

        async Task<string> GetAsync(IReadOnlyList<StorageFile> files)
        {
            try
            {

                using (HttpClient httpClient = new HttpClient())
                {
                    //httpClient.DefaultRequestHeaders.Add("Authorization", "ACCESS TOKEN E SHOMA");

                    MultipartFormDataContent form = new MultipartFormDataContent();
                    Dictionary<string, byte[]> dic = new Dictionary<string, byte[]>();
                    foreach (StorageFile f in files)
                    {
                        using (Stream fileStream = (await f.OpenAsync(FileAccessMode.ReadWrite)).AsStream())
                        {
                            byte[] bytes = ReadStream(fileStream);
                            string name = f.Name;
                            dic.Add(name, bytes);
                        }
                    }
                    foreach (var f in dic)
                        form.Add(new ByteArrayContent(f.Value, 0, f.Value.Length), "file", f.Key);

                    HttpResponseMessage response = await httpClient.PostAsync("http://appsoorena.ir/api/wit", form);

                    response.EnsureSuccessStatusCode();

                    httpClient.Dispose();
                    string result = response.Content.ReadAsStringAsync().Result;
                    return result;

                }
            }
            catch (Exception ex)
            {
                Debug.WriteLine("Ex: " + ex.Message + "\r\n\r\n" + ex.Source + "\r\n\r\n" +
                    ex.StackTrace);
            }
            return "";

        }

 

جواب به صورت لیستی از کلاس WitResponseObject خواهد بود.

در اینجا من 8 فایل ارسال کردم که اینم جوابش:

[
    {
        "msg_id": "0XuSI5fNDdIXwvg2w",
        "_text": "برای",
        "entities": {
            "intent": [
                {
                    "confidence": 1,
                    "value": "کاری "
                }
            ]
        }
    },
    {
        "msg_id": "0jur6vqRHwR5iULOx",
        "_text": "دانلود",
        "entities": {
            "intent": [
                {
                    "confidence": 1,
                    "value": "کاری "
                }
            ]
        }
    },
    {
        "msg_id": "0bjs6UfOFV5RWxlA6",
        "_text": "این",
        "entities": {
            "intent": [
                {
                    "confidence": 1,
                    "value": "کاری "
                }
            ]
        }
    },
    {
        "msg_id": "0sPszLjV7Emx81ZFo",
        "_text": "کد",
        "entities": {
            "intent": [
                {
                    "confidence": 1,
                    "value": "کاری "
                }
            ]
        }
    },
    {
        "msg_id": "0VUVcyH4DwD3O2rqH",
        "_text": "زیر",
        "entities": {
            "intent": [
                {
                    "confidence": 1,
                    "value": "کاری "
                }
            ]
        }
    },
    {
        "msg_id": "0EqbLSnVxjoIZa3rs",
        "_text": "راه",
        "entities": {
            "intent": [
                {
                    "confidence": 1,
                    "value": "کاری "
                }
            ]
        }
    },
    {
        "msg_id": "0amyxK8K5g1bCqBep",
        "_text": "اسکن",
        "entities": {
            "intent": [
                {
                    "confidence": 1,
                    "value": "کاری "
                }
            ]
        }
    },
    {
        "msg_id": "0Joftm7K5HpGOyNFB",
        "_text": "کنید",
        "entities": {
            "intent": [
                {
                    "confidence": 1,
                    "value": "کاری "
                }
            ]
        }
    }
]

موفق باشید.

 

منبع: وین نویس
 

پسند شده توسط 4 کاربر

به اشتراک گذاری این ارسال


لینک به ارسال
به اشتراک گذاری در سایت های دیگر


Apiای کوچیکی که من ساختم با استفاده از Asp.Net Mvc Web Api بود. اینم آموزش ساختش:

توی فایل WebApiConfig تابع Register کدهای زیر را اضافه کنید:

            config.Formatters.JsonFormatter.SupportedMediaTypes.Add(new System.Net.Http.Headers.MediaTypeHeaderValue("multipart/form-data"));
            config.Formatters.FormUrlEncodedFormatter.SupportedMediaTypes.Add(new System.Net.Http.Headers.MediaTypeHeaderValue("multipart/form-data"));
            config.Formatters.XmlFormatter.SupportedMediaTypes.Add(new System.Net.Http.Headers.MediaTypeHeaderValue("multipart/form-data"));

 

کلاس مورد نیاز :

using System.Collections.Generic;
using System.Linq;
using System.Web.Http;

namespace SoorenaSiteApi.Models.Helpers
{
    public static class HeaderHelper
    {
        public static string GetHeader(ApiController controller, string key)
        {
            try
            {
                IEnumerable<string> headerValues;
                if (controller.Request.Headers.TryGetValues(key, out headerValues))
                    return headerValues.FirstOrDefault();
            }
            catch { }
            return string.Empty;
        }
    }
}

 

کد کنترلر ویت:

using Newtonsoft.Json;
using SoorenaSiteApi.Models.Helpers;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Threading.Tasks;
using System.Web.Http;

namespace SoorenaSiteApi.Controllers
{
    public class WitController : ApiController
    {
        const string defaultAccessToken = "3PLCUPJISQTSUUAV3YLXFY3D3365MUTY";
        string accessToken = string.Empty;
        string audioType = string.Empty;
        [HttpPost, Route("api/wit")]
        public async Task<object> Upload()
        {
            if (!Request.Content.IsMimeMultipartContent())
                return new WitResponseObject { Text = "UnsupportedMediaType" };

            //throw new HttpResponseException(HttpStatusCode.UnsupportedMediaType);
            accessToken = HeaderHelper.GetHeader(this, "Authorization");
            audioType = HeaderHelper.GetHeader(this, "AudioType");

            var provider = new MultipartMemoryStreamProvider();
            await Request.Content.ReadAsMultipartAsync(provider);
            WitResponseList list = new WitResponseList();
            foreach (var file in provider.Contents)
            {
                var filename = file.Headers.ContentDisposition.FileName.Trim('\"');

                var buffer = await file.ReadAsByteArrayAsync();
                if (string.IsNullOrEmpty(audioType))
                    audioType = GetType(filename);
                var wit = await GetCL(buffer, audioType);
                list.Add(wit);

            }
            if (list.Any())
                return list;
            return new WitResponseObject { Text = "ERR" };
        }

        async Task<WitResponseObject> GetCL(byte[] buffer, string audioType)
        {
            using (HttpClient client = new HttpClient())
            {
                //$ curl -XPOST 'https://api.wit.ai/speech?v=20160526' \
                // -i -L \
                // -H "Authorization: Bearer $TOKEN" \
                // -H "Content-Type: audio/wav" \
                // --data-binary "@sample.wav"
                // addresse sende stream be wit
                Uri targetUri = new Uri("https://api.wit.ai/speech?v=20160526");
                Dictionary<string, string> headers = new Dictionary<string, string>();

                headers.Add("Transfer-encoding", "chunked");
                if (string.IsNullOrEmpty(accessToken))
                    headers.Add("Authorization", "Bearer " + defaultAccessToken);
                else
                    headers.Add("Authorization", "Bearer " + accessToken);

                foreach (var item in headers)
                    client.DefaultRequestHeaders.Add(item.Key, item.Value);


                client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue(audioType));

                using (ByteArrayContent byteContent = new ByteArrayContent(buffer))
                {

                    byteContent.Headers.ContentType = new MediaTypeHeaderValue(audioType);

                    HttpResponseMessage response = await client.PostAsync(targetUri, byteContent);


                    var content = new StreamReader(await response.Content.ReadAsStreamAsync()).ReadToEnd();
                    var wit = JsonConvert.DeserializeObject<WitResponseObject>(content);
                    return wit;

                }
            }

        }

        string GetType(string filename)
        {
            var extension = filename.Substring(filename.LastIndexOf(".") + 1);
            if (extension.ToLower() == "mp3")
                return "audio/mpeg3";
            else
                return "audio/wav";
        }
    }
    public class WitResponseList : List<WitResponseObject> { }
    public class WitResponseObject
    {
        [JsonProperty("msg_id")]
        public string MessageId { get; set; }
        [JsonProperty("_text")]
        public string Text { get; set; }
        [JsonProperty("entities")]
        public object Entities { get; set; }
    }
}

موفق باشید.

منبع: وین نویس

پسند شده توسط 3 کاربر

به اشتراک گذاری این ارسال


لینک به ارسال
به اشتراک گذاری در سایت های دیگر

برای ارسال دیدگاه یک حساب کاربری ایجاد کنید یا وارد حساب خود شوید

برای اینکه بتوانید دیدگاهی ارسال کنید نیاز دارید که کاربر سایت شوید

ایجاد یک حساب کاربری

برای حساب کاربری جدید در سایت ما ثبت نام کنید. عضویت خیلی ساده است !


ثبت نام یک حساب کاربری جدید

ورود به حساب کاربری

دارای حساب کاربری هستید؟ از اینجا وارد شوید


ورود به حساب کاربری