Аватар для Power_Basic
46 / 25 / 0
Регистрация: 08.03.2016
Сообщений: 443

Как вывести запись аудиопотока TTS в память?

10.02.2020, 12:12. Показов 4377. Ответов 27
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
На сайте Майкрософт имеется вот такой пример:
https://docs.microsoft.com/en-... 3dvs.85%29

Пример кода ISpeechBaseStream (SAPI 5.3)

04/17/2012

Microsoft Speech API 5.3

Интерфейс: ISpeechBaseStream


Следующий код формы Visual Basic демонстрирует использование методов ISpeechBaseStream Read, Write и Seek. Эти методы ISpeechBaseStream наследуются SpCustomStream, SpFileStream и SpMemoryStream. В этом примере используется SpFileStream, но методы работают одинаково во всех трех объектах.

Чтобы запустить этот код, создайте форму со следующими элементами управления:

Две командные кнопки Command1 и Command2

Вставьте этот код в раздел объявлений формы.

Процедура Form_Load создает голосовой объект и два объекта SpFileStream. Процедура Command1_Click произносит слова «один», «точка», «пять» и «SAPI» в первый файловый поток, используя метод Seek, чтобы найти конечную позицию байта каждого слова. Затем он считывает аудиоданные для каждого слова отдельно и записывает новый поток с обратным порядком слов. Процедура Command2_Click воспроизводит два файла, созданные Command1.
В этом коде используется запись аудиопотока в файл, а мне нужно записывать в память. Они говорят, что "методы работают одинаково во всех трёх объектах". Но как именно в память-то записывать?
Просто тупо заменить везде SpFileStream на SpMemoryStream, так что ли?
На самом деле, я сейчас попробовал, VB меня обругал нехорошими словами

Visual Basic
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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
Option Explicit
 
Const FILENAME1 = "c:\First.wav"
Const FILENAME2 = "c:\Second.wav"
 
Dim V As SpeechLib.SpVoice
Dim S1 As SpeechLib.SpFileStream
Dim S2 As SpeechLib.SpFileStream
 
Private Sub Command1_Click()
 
    Dim varT(3) As Variant      'text to be spoken
    Dim varP(3) As Variant      'positions in output stream
    Dim varD(3) As Variant      'audio data chunks
    Dim varStart As Variant
    Dim ii As Integer
 
    On Error GoTo EH
 
    varT(0) = "one": varT(1) = "point": varT(2) = "five": varT(3) = "SAPI"
 
    'Create WAV file of "one point five SAPI"
    'Speak the words into a single filestream object,
    'and remember the end-of-stream position of each word.
 
    S1.Open FILENAME1, SSFMCreateForWrite
    Set V.AudioOutputStream = S1
    For ii = 0 To UBound(varT)
        V.Speak varT(ii)
        varP(ii) = S1.Seek(0, SSSPTRelativeToCurrentPosition)
    Next ii
    S1.Close
 
    'Read the words from the first file into the variant array;
    'Write them back into the second file in reverse order.
 
    S1.Open FILENAME1, SSFMOpenForRead
    S2.Open FILENAME2, SSFMCreateForWrite
 
    varStart = 0
    For ii = 0 To UBound(varT)
        S1.Read varD(ii), varP(ii) - varStart
        varStart = varP(ii)
    Next ii
 
    For ii = UBound(varT) To 0 Step -1
        S2.Write varD(ii)
    Next ii
 
    S2.Close
    S1.Close
 
    'After using AudioOutputStream, reset voice AudioOutput property
    Set V.AudioOutput = V.GetAudioOutputs("").Item(0)
 
    Command1.Enabled = False
    Command2.Enabled = True
 
EH:
    If Err.Number Then ShowErrMsg
End Sub
 
Private Sub Command2_Click()
    On Error GoTo EH
 
    S1.Open FILENAME1, SSFMOpenForRead
    S2.Open FILENAME2, SSFMOpenForRead
 
    'Use first male voice to announce the results
    Set V.Voice = V.GetVoices("gender=male").Item(0)
 
    V.Speak "This is the first sound file", SVSFlagsAsync
    V.SpeakStream S1, SVSFlagsAsync
 
    V.Speak "This is the second sound file", SVSFlagsAsync
    V.SpeakStream S2, SVSFlagsAsync
 
    Do
        DoEvents
    Loop Until V.WaitUntilDone(1)
 
    S1.Close
    S2.Close
 
EH:
    If Err.Number Then ShowErrMsg
End Sub
 
 
Private Sub Form_Load()
    On Error GoTo EH
 
    Set V = New SpeechLib.SpVoice
    Set S1 = New SpFileStream       'Create stream1
    Set S2 = New SpFileStream       'Create stream2
    Command2.Enabled = False
 
EH:
    If Err.Number Then ShowErrMsg
End Sub
 
Private Sub ShowErrMsg()
 
    ' Declare identifiers:
    Const NL = vbNewLine
    Dim T As String
 
    T = "Desc: " & Err.Description & NL
    T = T & "Err #: " & Err.Number
    MsgBox T, vbExclamation, "Run-Time Error"
    End
 
End Sub
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
10.02.2020, 12:12
Ответы с готовыми решениями:

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

Запись аудиопотока с системы
Здарвствуйте. Подскажите пожалуйста как можно считать аудиопоток с винды, например в файл, средствами QT. Заранее спасибо.

Как заставить Google TTS правильно ставить ударения?
Добрый день! Использую Google TTS в приложении для Android. ...

27
21.02.2020, 14:12
Студворк — интернет-сервис помощи студентам

Не по теме:

Цитата Сообщение от Power_Basic Посмотреть сообщение
Должен признаться, что я Юникод не люблю вообще в принципе и всеми силами стараюсь его избегать по мере возможности.
Почему?
Все давно перешли на юникод. Винда 20 лет уже полностью юникодная.

0
 Аватар для Power_Basic
46 / 25 / 0
Регистрация: 08.03.2016
Сообщений: 443
21.02.2020, 16:30  [ТС]
Цитата Сообщение от locm Посмотреть сообщение
Почему?
Все давно перешли на юникод. Винда 20 лет уже полностью юникодная.
Ну значит я остался в пролшом веке

А если серьёзно, то Юникод ведь придуман специально для тех наций и народностей, у которых алфавит не умещается в 128 знаков. Иероглифическое письмо и всё такое. А для нас (у кого всё умещается) это только лишняя головная боль, я это так понимаю


Цитата Сообщение от The trick Посмотреть сообщение
Не знаю баг ли это Power Basic'а или какую-то инициализацию нужно делать, но баг заключается в следующем. Когда идет присвоение Variant массива массиву байт MyArray то MyArray еще неинициализирован и его дескриптор содержит одни нули.
Ну да, точно баг. Сейчас специально ещё раз перечитал в спаравочной системе описание этого процесса. По идее, всё должно быть легко и просто, и без дополнительных танцев
Миниатюры
Как вывести запись аудиопотока TTS в память?  
0
Модератор
10057 / 3902 / 884
Регистрация: 22.02.2013
Сообщений: 5,853
Записей в блоге: 79
22.02.2020, 09:38
Цитата Сообщение от Power_Basic Посмотреть сообщение
А если серьёзно, то Юникод ведь придуман специально для тех наций и народностей, у которых алфавит не умещается в 128 знаков. Иероглифическое письмо и всё такое. А для нас (у кого всё умещается) это только лишняя головная боль, я это так понимаю
Нет. Юникод придуман чтобы забыть о кодовых страницах и иметь один набор символов для всех локалей. Иероглифы и так представлены в ANSI.
1
 Аватар для Power_Basic
46 / 25 / 0
Регистрация: 08.03.2016
Сообщений: 443
22.02.2020, 12:30  [ТС]
Цитата Сообщение от The trick Посмотреть сообщение
Нет. Юникод придуман чтобы забыть о кодовых страницах и иметь один набор символов для всех локалей. Иероглифы и так представлены в ANSI.
Не, ну а мне-то - любителю - какая проблема со сменой кодовых страниц, если у меня на компе всегда одна и та же кодовая страница сразу же выставлена по умолчанию. Это вам - профессионалам - приходится задумываться о локализации своего софта, и здесь, да, юникод, наверное, очень удобен, поскольку универсален. А я-то пишу программы исключительно для самого себя, и, следовательно, с локализацией проблем никогда не возникает

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

1. Регулярные выражения в Power Basic'е категорически отказываются работать с текстами в юникоде. Хотя, возможно я что-то делаю неправильно, возможно. Но когда стремишься к скорейшему выполнению поставленной перед собой задачи спотыкаться на таких препятствиях ну очень неприятно. А старый добрый АНСИ никогда не подводит

2. Фуккция поиска подстроки (INSTR) в Power Basic'е (а в Визуальном уже не помню) тоже вроде бы работает только с АНСИ-строками. Ну по крайней мере, я несколько раз не получал быстрого надёжного результата. А стоит только перейти на АНСИ и сразу чувствуешь себя как рыбка в воде, ну или как лягушка в своём уютном тёплом болотце

На самом деле, у меня сейчас на повестке дня стоит задача усовершенствования уже хорошо работающей простенькой программы, которая с определённой периодичностью заходит на мой любимый новостной сайт, скачивает оттуда одну и ту же страницу с "шапками" новостей, находит свежие "шапки" и озвучивает их с помощью движка TTS. Ну а потом, если шапка меня "зацепила", я уже без программы ("вручную" ) захожу на сайт и читаю новость полностью.
А в перспективе задумано так, что по определённым ключевым словам в "шапках" новости будут автоматически "разворачиваться" и озвучиваться.
Ну вот поэтому для меня сейчас особенно важно, чтобы безотказно работали именно регулярные выражения и функция INSTR в (более простых случаях).

И, наконец, пожалуй, самый важный третий пункт
Ну просто привычно и приятно мне иметь дело именно с АНСИ-строками. Ну это же как со старым добрым знакомым, который тебя никогда не подводит, и от которого ты всегда знаешь чего можно ожидать
0
Эксперт по электронике
6866 / 3289 / 340
Регистрация: 28.10.2011
Сообщений: 12,878
Записей в блоге: 7
22.02.2020, 14:34
Цитата Сообщение от Power_Basic Посмотреть сообщение
Не, ну а мне-то - любителю - какая проблема со сменой кодовых страниц, если у меня на компе всегда одна и та же кодовая страница сразу же выставлена по умолчанию.
То есть ни разу не выкладывали свои программы в сеть? У других может быть винда без русской локализации.
0
 Аватар для Power_Basic
46 / 25 / 0
Регистрация: 08.03.2016
Сообщений: 443
22.02.2020, 17:29  [ТС]
Цитата Сообщение от locm Посмотреть сообщение
То есть ни разу не выкладывали свои программы в сеть? У других может быть винда без русской локализации.
На самом деле, выкладывал разочек, был такой грех

Но это было уже очень-очень давно в 2006-ом году. Так что за давностью можно считать, что вообще ни разу не выкладывал
Для форума одного смастерил тогда серию однотипных незатейливых программок на Визуальном Бэйсике. Там смысл был в том, что из фотографий, которые присылают на форум, делал что-то вроде "кино"
Ну просто с помощью функции LoadPicture картинки с большой скоростью (которую пользователь мог менять, кстати) загружались, сменяя друг друга, в PictureBox, ну или в Image, сейчас уже точно не помню, создавая иллюзию мультипликации, ну и плюс музыку подкладывал подходящую. Смотрелось неплохо, честное слово
Ну и всё там было по-взрослому аж вплоть до справочной системы
И ещё из фичей, настройки пользователя сохранялись в текстовом .INI файле

Некоторым нравилось, но большинству было пофиг, поэтому тот "проект" довольно быстро зачах

География того форума была не очень широкой - Россия, Украина, Белоруссия, Казахстан, Латвия, Израиль, ну вот, пожалуй и всё. Претензий по поводу того, что, например, пункты меню у кого-то нечитабельны ни разу не было.
Некоторые жаловались на то, что их антивирусы с подозрением смотрят на плоды моего творчества, это, да, было
Но у меня была уважительная причина: все EXE-шники приходилось сжимать с помощью UPX, поскольку на том форуме было строгое ограничение на размер загружаемых файлов - до 1 Мб, ну вот и приходилось "втискиваться" в эти рамки. А там же было всё вместе с картинками в одном EXE-шнике, поэтому задача была нетривиальной
А поскольку этот упаковщик был популярен так же и среди хакеров той поры, нетрудно понять возбуждённую бдительность антивирусов
0
 Аватар для Power_Basic
46 / 25 / 0
Регистрация: 08.03.2016
Сообщений: 443
22.02.2020, 21:58  [ТС]
Цитата Сообщение от The trick Посмотреть сообщение
Не знаю баг ли это Power Basic'а или какую-то инициализацию нужно делать, но баг заключается в следующем. Когда идет присвоение Variant массива массиву байт MyArray то MyArray еще неинициализирован и его дескриптор содержит одни нули.
Кому-то может за державу обидно, а мне за Power Basic

Поразмыслил я, поразмыслил и пришёл к выводу, что это всё-таки была моя грубая ошибка, а вовсе не баг компилятора. Мы же обычно всегда сначала объявляем размерность массива с помощью, например,

Visual Basic
1
DIM MyMassive (1 TO 5)
или

Visual Basic
1
REDIM MyMassive (1000)
и только потом "населяем" его значениями отдельных (или всех) членов.

На самом деле, обычно-то именно так я всегда и поступаю. А здесь меня смутило то, что никогда раньше как-то не приходилось на практике извлекать целый массив из варианта, это раз. А ещё почти всё внимание сосредоточилось на возможных проблемах, связанных с COM-функционалом, ну вот и прозевал этот момент.

Получилось, что массив как бы резиновый, сам-собой растянется до необходимого размера
Короче говоря, как я понял, самый корректный подход это вот такой:
Миниатюры
Как вывести запись аудиопотока TTS в память?  
0
 Аватар для Power_Basic
46 / 25 / 0
Регистрация: 08.03.2016
Сообщений: 443
22.02.2020, 22:02  [ТС]
Этот пост ошибочно отправил, а как удалить не знаю
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
22.02.2020, 22:02
Помогаю со студенческими работами здесь

Как вытащить звук из аудиопотока?
Доброго времени суток всем! Я работаю во Flex 4 (новичек). Можно лиимея видеопоток, воспроизводить один звук (без изображения) ? Есть...

После того, как вытянул/вставил оперативную память высветилась странная запись.
День добрый или ночь. Умная голова не удержала шустрые руки.Теперь о главном: Хочу повысить оперативку,Вытащил оперативку прочесть номер...

Как проверить, если запись есть в таблице, то вывести ошибку "Запись существует"
как проверить если запись есть в таблице (datagridview) то вывести ошибку "Запись существует", использую access Точнее: например в...

Речевое воспроизведение текста! TTS
Помогите с поиском информации по речевому воспроизведению текста. Может где движок такой можно скачать?

Синтез голоса из строки (TTS)
Доброго времени суток, форумчаны. Интересует тема синтеза речи из текста на микроконтроллера из архитектурой ARM CORTEX M3. (Английский) ...


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

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

Новые блоги и статьи
Благородство как наказание
Maks 24.04.2026
У хорошего человека отношения с женщинами всегда складываются трудно. А я человек хороший. Заявляю без тени смущения, потому что гордиться тут нечем. От хорошего человека ждут соответствующего. . .
Валидация и контроль данных табличной части документа перед записью
Maks 22.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в КА2. Задача: контроль и валидация данных табличной части документа перед записью с учетом регламента компании. . .
Отчёт о затраченных материалах за определенный период с макетом печатной формы
Maks 21.04.2026
Отчёт из решения ниже размещён в конфигурации КА2. Задача: разработка отчёта по затраченным материалам за определённый период, с возможностью вывода печатной формы отчёта с шапкой и подвалом. В. . .
Отчёт о спецтехнике находящейся в ремонте
Maks 20.04.2026
Отчёт из решения ниже размещен в конфигурации КА2. Задача: отобразить спецтехнику, которая на данный момент находится в ремонте. Есть нетиповой документ "Заявка на ремонт спецтехники" который. . .
Памятка для бота и "визитка" для читателей "Semantic Universe Layer (Слой семантической вселенной)"
Hrethgir 19.04.2026
Сгенерировано для краткого описания по случаю сборки и компиляции скелета серверного приложения. И пусть после этого скажут, что статьи сгенерированные AI - туфта и не интересно. И это не реклама -. . .
Запрет удаления строк ТЧ документа при определённом условии
Maks 19.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "Аккумуляторы", разработанного в конфигурации КА2. У данного документа есть ТЧ, в которой в зависимости от прав доступа. . .
Модель заражения группы наркоманов
alhaos 17.04.2026
Условия задачи сформулированы тут Суть: - Группа наркоманов из 10 человек. - Только один инфицирован ВИЧ. - Колются одной иглой. - Колются раз в день. - Колются последовательно через. . .
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru