Форум программистов, компьютерный форум, киберфорум
Visual Basic
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.52/21: Рейтинг темы: голосов - 21, средняя оценка - 4.52
 Аватар для Power_Basic
46 / 25 / 0
Регистрация: 08.03.2016
Сообщений: 443

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

10.02.2020, 12:12. Показов 4247. Ответов 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
Модератор
10048 / 3894 / 883
Регистрация: 22.02.2013
Сообщений: 5,847
Записей в блоге: 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
Эксперт по электронике
6562 / 3189 / 335
Регистрация: 28.10.2011
Сообщений: 12,470
Записей в блоге: 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
Ответ Создать тему
Новые блоги и статьи
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а привычная функция main(). . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь(не выше 3-го порядка) постоянного тока с элементами R, L, C, k(ключ), U, E, J. Программа находит переходные токи и напряжения на элементах схемы классическим методом(1 и 2 з-ны. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru