gifts2017

Воспроизведение звука средствами Windows

Опубликовал Sergey (zsrg) в раздел Программирование - Практика программирования

Еще один способ воспроизводить звуки из 1С, средствами Windows без использования внешних программ.

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

Я часто делаю воспроизведение звука в 1С, когда стоит вопрос о сканировании штрих-кодов, чтобы подтвердить факт добавления товара в документ, или сообщить об ошибке. Эта необходимость возникла при большом потоке товаров и работе в терминальном режиме со сканерами через эмуляцию клавиатуры. Дело в том, что из-за проблем с задержками, например WiFi, сканированный код может доходить с задержками до двух секунд, и драйвер некорректно распознает код. Если никак не сообщать об этом менеджеру, то в потоке товаров они не замечают, что товар не был добавлен в документ.

Собственно никогда проблем, с воспроизведением звуков, у меня не возникало. Я использовал встроенный в Windows плеер mplay32.exe и скрипты WScript. Однако в новых версиях Windows этого плеера нет, копирование его ни к чему хорошему не приводит, приходится полностью отключать защиту на уровне пользователей и другие сложности с ошибкой 0x80070002 при работе в терминале на Windows Server 2008 R2.
Были опробованы варианты с проигрыванием через ActiveX или в поле HTML документа. С ними проблема в том, что звук не воспроизводится, если форма с полем не видна. А мне надо звук воспроизводить фоном. Вставлять ActiveX на каждую форму работающую с штрих-кодом не вариант.

Наконец, решение было найдено, простое и 100% работающее. Проверено на Windows 7/2008R2:

oVoice = Новый COMObject("SAPI.SpVoice");

oSpFileStream = Новый COMObject("SAPI.SpFileStream");
oSpFileStream.Open(ПутьДоФайла);
oVoice.SpeakStream(oSpFileStream);
oSpFileStream.Close();

Для 1С 7-ки:

oVoice = СоздатьОбъект("SAPI.SpVoice");
oSpFileStream = СоздатьОбъект("SAPI.SpFileStream");
oSpFileStream.Open(ПутьДоФайла);
oVoice.SpeakStream(oSpFileStream);
oSpFileStream.Close();

Visual Basic (Excel, Word и т.п.)

Dim oVoice As Object
Dim oSpFileStream As Object
Set oVoice = CreateObject("SAPI.SpVoice")
Set oSpFileStream = CreateObject("SAPI.SpFileStream")
oSpFileStream.Open ПутьДоФайла
oVoice.SpeakStream oSpFileStream
oSpFileStream.Close

Проверял на WAV файлах, на счет mp3 сказать не могу, не тестировал.

Сам интерфейс используется для проговаривания строк, поэтому можно пользоваться и основной его функцией:

oVoice.Speak("Hello!");

См. также

Подписаться Добавить вознаграждение

Комментарии

1. andrewks 14.03.13 10:22
уже есть публикация по SAPI.SpVoice, и, по-моему, даже не одна
2. Sergey (zsrg) 14.03.13 10:38
1, Все верно. Но в этих публикациях ничего не сказано про воспроизведение WAV файлов, только про говорилку...
3. Александр Орефков (orefkov) 14.03.13 12:21
Все таки "Новый COMObject" и "без ActiveX" - взаимоисключающие параграфы.
Я бы "без ActiveX" убрал из названия публикации.
А то такое чувство, что повелся на "без голоданий и диет", но понял, что чудес не бывает.
cool.vlad4; +1 Ответить 2
4. Юрий Осипов (yuraos) 14.03.13 12:26
Клево!!!

Сам интерфейс используется для проговаривания строк, поэтому можно пользоваться и основной его функцией:
oVoice.Speak("Hello!");

Что напишешь - то комп и скажет????
5. andrewks 14.03.13 12:30
(4) yuraos, а что в этом сверхординарного? ещё под DOS, помню, была прога, принимающая с ком.строки текст, и озвучивающая его на PC Speaker :-)
6. Юрий Осипов (yuraos) 14.03.13 12:33
(4)
А русский язык понимает? И в частности не нормативную лексику???

А то я нарулю в 1С-ке всяких проверок,
если юзер чё не то нажмет -
- она его тремя буквами и тремя этажами!!!!!

Нет, на нынешней работе не прокатит - тогда придется на все компы колонки покупать...
Фин.директор - удавится.
Он и так всех заставил печатать договора с двух сторон печатать,
не взирая на замяте бумаги и повышенный износ принтеров.
;))))
7. andrewks 14.03.13 12:35
(2) zsrg, ну дык есть же оф.описание объектной модели http://msdn.microsoft.com/en-us/library/ms722561%28v=vs.85%29.aspx
8. andrewks 14.03.13 12:36
(6) yuraos,
А русский язык понимает? И в частности не нормативную лексику???

она и английский-то понимает с трудом, куда уж русский :-)
9. Sergey (zsrg) 14.03.13 12:36
(3) orefkov, Новый COMObject прямого отношения к ActiveX не имеет, но раз смущает, то уберу :)
10. Sergey (zsrg) 14.03.13 12:38
(6) yuraos, у меня русский не держит, на Windows Server, только по английски. Но у меня просто русский MUI установлен. Возможно на полной русской версии и заговорит по русски. Должен, по идее, так как говорилка встроена для поддержки людей с ограниченными возможностями.
11. Ийон Тихий (cool.vlad4) 14.03.13 13:58
(9)как бы имеет. ActiveX суть ком сервер, просто реализующий в довесок пару дополнительных интерфейсов.
12. Санчез Милокко (Milokko) 14.03.13 14:22
(2) zsrg, Шпарит WAV-ки как миленький
13. Игорь Дайнеко (Dnki) 20.03.13 20:51
Проверил. WAV воспроизводит. MP3 - нет. Что-то смешное говорит.
14. Sergey (zsrg) 21.03.13 07:37
Не удивительно. WAV родной форматы винды, а mp3 уже расширение кодека для мультимедиа плеера.
15. Кошки Рулят (Кошки рулят) 25.03.13 11:45
Так чисто для прикола, наверное можно поюзать, но в реальных базах врядли.
Говорилку пользователи отключают или сразу или максимум через день - мешает работать.
Звуковые файлы можно проигрывать
ЗапуститьПриложение(ПутьДоФайла)
и не надо думать какой виндовс, какой формат файла ...
А вот подать сигнал (не работающая почему-то нигде и никогда Сигнал()) я предпочитаю баяном. Например:
Баян=CreateObject("DynamicWrapper");
Баян.Register("KERNEL32.DLL", "Beep", "i=ll", "f=s", "r=l");
Баян.Beep(330*4,300);
Баян.Beep(494*4,200);

Работает тоже в любом виндовсе, звучать будет через все, что сможет, даже через динамик системного блока ...
Не полифония, конечно, но можно довольно затейливые рулады воспроизвести ...
16. Александр Ульянов (Aleks1973) 25.03.13 11:52
(15) {Форма.Форма.Форма(3,6)}: Процедура или функция с указанным именем не определена (CreateObject)
Баян=<<?>>CreateObject("DynamicWrapper"); (Проверка: Толстый клиент (обычное приложение))
17. Кошки Рулят (Кошки рулят) 25.03.13 11:54
(16) Aleks1973, Забудь про снеговик ...
18. Алекс Ю (AlexO) 26.03.13 13:17
(4) yuraos,
Что напишешь - то комп и скажет????

А то! Сейчас такие студенты пошли, что ого-го! Что напишут на русском - то комп и выполняет.
Без дураков.
(9) zsrg,
Новый COMObject прямого отношения к ActiveX не имеет

Браво!
БравО!!!
А к чему COM, реализованный в 1С, имеет отношение?
Автор, а что "опустил", что этот "SAPI.SpVoice" должен быть установлен прежде всего?
И, наконец, "решение простое и 100% работающее" - это воспроизведение звуковых файлов посредством открытия через 1С.
И как в анекдоте с динозавром: "50 на 50 - либо заиграет (если есть драйвера и звуковуха), либо нет" :)
19. V P (Vovus) 12.09.13 17:25
На сервере Управляемые Формы не воспроизводить звук Выдает ошибку что oSpFileStream.Open не определено
20. Sergey (zsrg) 12.09.13 20:32
Все правильно и не должно воспроизводить. Звук должен воспроизводиться на клиенте, а не на сервере!
21. V P (Vovus) 15.09.13 16:56
(20) zsrg,
Скрипт = Новый COMОбъект("MSScriptControl.ScriptControl");
Скрипт.Language="vbscript";
Скрипт.AddCode("
|Function Main()
|Set oVoice = CreateObject(""SAPI.SpVoice"")
|set oSpFileStream = CreateObject(""SAPI.SpFileStream"")
|oSpFileStream.Open ""D:\Muz\1.wav""
|oVoice.SpeakStream oSpFileStream
|End Function");
Скрипт.Run("Main");
Так работает на сервере но вопрос как записать в место жесткой привязки к пути значение например реквизита или константы!?
22. Sergey (zsrg) 15.09.13 17:59
Если я правильно понял:

|oSpFileStream.Open """+ПутьДоФайла+"""
23. Андрей (androidT1C) 25.10.13 09:50
Отлично!

Хоть и выдает ошибку

Ошибка при вызове метода контекста (SpeakStream): Произошла исключительная ситуация (0x80070057)
oVoice.SpeakStream(oSpFileStream);
по причине:
Произошла исключительная ситуация (0x80070057)

но звук воспроизводит!

Но есть одно "но". Как сделать, чтобы 1С не ждала окончания воспроизведения звука, а продолжала работать?

Как, например, через WshShell.Run(,0,0) это замутить?
24. Сергей Кудашкин (sikuda) 09.01.14 09:48
25. Сергей Племянников (Serge_ASB) 29.10.14 12:01
внёс
oVoice = Новый COMObject("SAPI.SpVoice");

oSpFileStream = Новый COMObject("SAPI.SpFileStream");
oSpFileStream.Open(ПутьДоФайла);
oVoice.SpeakStream(oSpFileStream);
oSpFileStream.Close();
...Показать Скрыть

в процедуру.
Вызов ее, как написано выше, производится только &НаКлиенте
Почему-то вызов этой процедуры (&НаКлиенте Посигналить();) не производится: программа не находит ее. А из других клиентских - пожалуйста.
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа