1181 / 623 / 160
Регистрация: 19.04.2018
Сообщений: 2,923
1

Реализация синтеза речи

12.06.2019, 18:10. Показов 1096. Ответов 1

Author24 — интернет-сервис помощи студентам
Программа синтеза речи.
Пользователь вводит в Memo(или RichBox, смотря какая среда) какое-то предложение и нажимает на кнопку. Предложение разбивается на слова
C++
1
2
3
4
5
6
7
8
9
10
11
12
    //           Разбивание строки
    AnsiString ss = Memo1->Text;string s = ss.c_str();
    string d = " ,.;!<>|/\\+-=()^%$#@!~&*:{}"; vector<wstring> v;
    int b, e = 0;
    while ((b = s.find_first_not_of(d, e)) != s.npos)
    {
        e = s.find_first_of(d, b);
        v.push_back(toWideChar(s.substr(b, e - b)));
        b = e;
    }
    for (wstring text : v) // итерация по массиву v
        ListBox1->Items->Add(text.c_str());
В векторе v теперь содержатся слова введённые пользователем в memo(richbox)
После чего открывается папка с аудиофайлами и собираются названия файлов без формата.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
    //           Поиск названия файлов
    WIN32_FIND_DATAW fd;
    vector<wstring> filenames;
    HANDLE hFind = FindFirstFileW(L"Alphavit\\*.*", &fd);
    if (INVALID_HANDLE_VALUE != hFind)
    {
        do
        {   filenames.push_back(&fd.cFileName[0]);
        } while (FALSE != FindNextFileW(hFind, &fd));
                FindClose(hFind);
    }
    filenames.erase( filenames.begin() + 0, filenames.begin() + 2);                  //удаление первых элементов, которые не содержат буквы
/*----------------------------------------------------------------------------*/
    for(size_t i =0; i < filenames.size(); ++i )
    {
    //           Удаление расширений файлов
        wstring::size_type npos1 = filenames[i].rfind (L".");
        if(npos1 != std::wstring::npos)
        {   wstring::size_type npos2 = filenames[i].length();
            filenames[i].erase(npos1,  npos2-npos1);
        }
    }
После чего вектор filenames сортируется
C++
1
sort(filenames.begin(), filenames.end());
_
_
_
Далее самое тяжёлое, чего я не могу никак реализовать:
Пусть имеется слово булок и фрагменты "б" "у" "улок" "бул" "лок" "ок". Если выбирать каждый раз самый длинный фрагмент, получится бул+о+к, что несколько хуже, чем б+улок. Но как сделать этот выбор?

Можно попробовать строить слова разной длины, перебирая подходящие фрагменты.

Шаг 0. Изначально есть пустое слово (длины 0). Из него можно получить слова: б[1], бул[3].

Шаг 1. Из имеющегося слова длины 1 аналогичным образом создаем новые слова: б+у[2], б+улок[5].

Шаг 2. Берем слово длины 2 и продолжаем: б+у+лок[5] - такое слово уже есть, оставляем из них только то, что состоит из меньшего числа фрагментов.

Шаг 3. Берем слово длины 3: бул+о[4].

Шаг 4. Берем слово длины 4: бул+о+к[5], снова выбираем более подходящее из двух.

Шаг 5. Последний шаг - взять единственное слово из 5 букв: б+улок.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
12.06.2019, 18:10
Ответы с готовыми решениями:

Нужна программа для синтеза речи
Всем доброго времени суток , ребят , не поможете ли вы мне найти программу , которая бы...

Голосовые данные для синтеза речи
В общем появилась такая проблема. Появилась вечная загрузка голосовых данных для синтеза речи...

Базы русской речи для синтеза и распознавания
Здравствуйте форумчане,есть у кого нибудь базы русского языка для распознавания? куски тимит,...

Использование библиотеки для синтеза русской речи (говорилка)
Посоветуйте библиотеку, для синтеза русской речи. Добавлено через 17 часов 41 минуту У меня...

1
6091 / 3449 / 1402
Регистрация: 07.02.2019
Сообщений: 8,768
12.06.2019, 19:36 2
Цитата Сообщение от abortion error Посмотреть сообщение
Если выбирать каждый раз самый длинный фрагмент, получится бул+о+к, что несколько хуже, чем б+улок. Но как сделать этот выбор?
Ну вот довольно грубое решение в лоб:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
 
int main()
{
    std::locale::global(std::locale{ "" });
 
    std::vector<std::string> file_names{ "б", "у", "улок", "бул", "лок", "ок" };
    std::sort(file_names.begin(), file_names.end(), [](auto const& lh, auto const& rh) { return lh.length() > rh.length(); });
 
    std::string word{ "булок" };
    std::cout << word << std::endl;
 
    for (size_t i{}, w_sz{ word.size() }; i < file_names.size() && w_sz; ++i)
    {
        std::cout << '[' << i << ']' << file_names[i] << std::endl;
 
        if (file_names[i].length() > w_sz) continue;
        auto sub = word.find(file_names[i]);
        if (sub != std::string::npos)
        {
            std::string idx{ '[' + std::to_string(i) + ']' };
            word.replace(sub, file_names[i].length(), idx);
            w_sz -= file_names[i].length();
        }
    }
    std::cout << word << std::endl;
}
0
12.06.2019, 19:36
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
12.06.2019, 19:36
Помогаю со студенческими работами здесь

Запись речи, отправка файла на Google, получение текста речи
Нужна помощь! Нужно написать простую программу. Программа должна при клике на кнопку слушать...

Преобразование МДНФ для синтеза
Помоги пожалуйста преобразовать 4 МДНФ (во вложении) для синтеза схемы управления в базисе на...

технологическая схема производства синтеза аммиака
Здравствуйте. Может кто-нибудь помочь с созданием этой схемы? Либо же объяснить на основе чего...

синтеза функциональной схемы цифрового автомата
в чем заключается задача синтеза функциональной схемы цифрового автомата? _____ Плиз нужна помощь


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru