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

Еще один способ воспроизводить звуки из 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!»);

30 Comments

  1. andrewks

    уже есть публикация по SAPI.SpVoice, и, по-моему, даже не одна

    Reply
  2. zsrg

    1, Все верно. Но в этих публикациях ничего не сказано про воспроизведение WAV файлов, только про говорилку…

    Reply
  3. orefkov

    Все таки «Новый COMObject» и «без ActiveX» — взаимоисключающие параграфы.

    Я бы «без ActiveX» убрал из названия публикации.

    А то такое чувство, что повелся на «без голоданий и диет», но понял, что чудес не бывает.

    Reply
  4. yuraos

    Клево!!!


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

    oVoice.Speak(«Hello!»);

    Что напишешь — то комп и скажет????

    Reply
  5. andrewks

    (4) yuraos, а что в этом сверхординарного? ещё под DOS, помню, была прога, принимающая с ком.строки текст, и озвучивающая его на PC Speaker 🙂

    Reply
  6. yuraos

    (4)

    А русский язык понимает? И в частности не нормативную лексику???

    А то я нарулю в 1С-ке всяких проверок,

    если юзер чё не то нажмет —

    она его тремя буквами и тремя этажами!!!!!

    Нет, на нынешней работе не прокатит — тогда придется на все компы колонки покупать…

    Фин.директор — удавится.

    Он и так всех заставил печатать договора с двух сторон печатать,

    не взирая на замяте бумаги и повышенный износ принтеров.

    ;))))

    Reply
  7. andrewks

    (2) zsrg, ну дык есть же оф.описание объектной модели http://msdn.microsoft.com/en-us/library/ms722561%28v=vs.85%29.aspx

    Reply
  8. zsrg

    (3) orefkov, Новый COMObject прямого отношения к ActiveX не имеет, но раз смущает, то уберу 🙂

    Reply
  9. andrewks

    (6) yuraos,

    А русский язык понимает? И в частности не нормативную лексику???

    она и английский-то понимает с трудом, куда уж русский 🙂

    Reply
  10. zsrg

    (6) yuraos, у меня русский не держит, на Windows Server, только по английски. Но у меня просто русский MUI установлен. Возможно на полной русской версии и заговорит по русски. Должен, по идее, так как говорилка встроена для поддержки людей с ограниченными возможностями.

    Reply
  11. cool.vlad4

    (9)как бы имеет. ActiveX суть ком сервер, просто реализующий в довесок пару дополнительных интерфейсов.

    Reply
  12. Milokko

    (2) zsrg, Шпарит WAV-ки как миленький

    Reply
  13. Dnki

    Проверил. WAV воспроизводит. MP3 — нет. Что-то смешное говорит.

    Reply
  14. zsrg

    Не удивительно. WAV родной форматы винды, а mp3 уже расширение кодека для мультимедиа плеера.

    Reply
  15. Кошки рулят

    Так чисто для прикола, наверное можно поюзать, но в реальных базах врядли.

    Говорилку пользователи отключают или сразу или максимум через день — мешает работать.

    Звуковые файлы можно проигрывать

    ЗапуститьПриложение(ПутьДоФайла)

    и не надо думать какой виндовс, какой формат файла …

    А вот подать сигнал (не работающая почему-то нигде и никогда Сигнал()) я предпочитаю баяном. Например:

    Баян=CreateObject(«DynamicWrapper»);

    Баян.Register(«KERNEL32.DLL», «Beep», «i=ll», «f=s», «r=l»);

    Баян.Beep(330*4,300);

    Баян.Beep(494*4,200);

    Работает тоже в любом виндовсе, звучать будет через все, что сможет, даже через динамик системного блока …

    Не полифония, конечно, но можно довольно затейливые рулады воспроизвести …

    Reply
  16. Aleks1973

    (15) {Форма.Форма.Форма(3,6)}: Процедура или функция с указанным именем не определена (CreateObject)

    Баян=<<?>>CreateObject(«DynamicWrapper»); (Проверка: Толстый клиент (обычное приложение))

    Reply
  17. Кошки рулят

    (16) Aleks1973, Забудь про снеговик …

    Reply
  18. AlexO

    (4) yuraos,

    Что напишешь — то комп и скажет????

    А то! Сейчас такие студенты пошли, что ого-го! Что напишут на русском — то комп и выполняет.

    Без дураков.

    (9) zsrg,

    Новый COMObject прямого отношения к ActiveX не имеет

    Браво!

    БравО!!!

    А к чему COM, реализованный в 1С, имеет отношение?

    Автор, а что «опустил», что этот «SAPI.SpVoice» должен быть установлен прежде всего?

    И, наконец, «решение простое и 100% работающее» — это воспроизведение звуковых файлов посредством открытия через 1С.

    И как в анекдоте с динозавром: «50 на 50 — либо заиграет (если есть драйвера и звуковуха), либо нет» 🙂

    Reply
  19. Vovus

    На сервере Управляемые Формы не воспроизводить звук Выдает ошибку что oSpFileStream.Open не определено

    Reply
  20. zsrg

    Все правильно и не должно воспроизводить. Звук должен воспроизводиться на клиенте, а не на сервере!

    Reply
  21. Vovus

    (20) zsrg,

    Скрипт = Новый COMОбъект(«MSScriptControl.ScriptControl»);

    Скрипт.Language=»vbscript»;

    Скрипт.AddCode(»

    |Function Main()

    |Set oVoice = CreateObject(«»SAPI.SpVoice»»)

    |set oSpFileStream = CreateObject(«»SAPI.SpFileStream»»)

    |oSpFileStream.Open «»D:Muz1.wav»»

    |oVoice.SpeakStream oSpFileStream

    |End Function»);

    Скрипт.Run(«Main»);

    Так работает на сервере но вопрос как записать в место жесткой привязки к пути значение например реквизита или константы!?

    Reply
  22. zsrg

    Если я правильно понял:

    |oSpFileStream.Open «»»+ПутьДоФайла+»»»

    Reply
  23. androidT1C

    Отлично!

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

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

    oVoice.SpeakStream(oSpFileStream);

    по причине:

    Произошла исключительная ситуация (0x80070057)

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

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

    Как, например, через WshShell.Run(,0,0) это замутить?

    Reply
  24. sikuda

    (3)orefkov,

    Без ActiveX можно через html bgsound http://infostart.ru/public/248770/

    Reply
  25. Serge_ASB

    внёс

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

    в процедуру.

    Вызов ее, как написано выше, производится только &НаКлиенте

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

    Reply
  26. websamson

    Столкнулся с тем, что при выполнении кода выходила ошибка 0x80045003

    Решение: формат звукового файла .wav обязательно должен быть mono, а не stereo.

    Конвертировали с помощью плагина AIMP.

    Reply
  27. SITR-utyos

    (23) Хороший вопрос! — я сделал так: http://infostart.ru/public/655524/

    Reply
  28. sertak

    Благодарю, чувак! Сэкономил кучу нервов и времени коллеге. Плюс 1 в карму.

    Reply
  29. Lapitskiy

    (15)

    Для восьмерки:

    DW = Новый COMОбъект(«DynamicWrapper»);

    DW.Register(«KERNEL32.DLL», «Beep», «i=ll», «f=s», «r=l»);

    DW.Beep(330*4,300);

    DW.Beep(494*4,200);

    Reply
  30. artjurMV

    (26) Не факт. Стерео тоже может быть, но надо формат семплов устанавливать в 16 бит

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *