Голосовой информатор через Skype для 1С: Предприятие

    Обработка для 1С в статье позволяет получить аудиофайл с речью, сгенерированной компьютером на основе текстовой строки, позвонить собеседнику через Skype и произнести его. Функциональность выполнена на основе .Net framework и API для Skype. Разработка будет полезна не только для серьезных бизнес-приложений, но и для домашних опытов и шуток друзьям. Для звонков на реальные номера потребуется пополненный баланс на Skype.

    Предварительная настройка


    Если не предусмотрен в системе русский голос, то его необходимо установить. По умолчанию Windows 7 может читать только английские тексты. Для русификации голоса нужно установить дополнительный русский голос. В Интернете удалось найти только голос ScanSoft Katerina Full 22kHz (до конца не понятна правовая возможность использования этого голоса). Многим может показаться голос медленным. Для его убыстрения необходимо сделать запись в реестре:
    [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Speech\Voices\Tokens\ScanSoftKaterina_Full_22kHz] 
    "pp type"="email"
    

    Скайп позволяет взаимодействовать с собой через библиотеку skype4COM.
    Необходимо скачать эту библиотеку и выполнить ее регистрацию в реестре через regsvr32 skype4COM.dll. Для данной операции могут потребоваться права администратора.
    После попытки использовать Skype в первый раз появится запрос в Skype’е. Нужно дать разрешение программе 1cv8c.exe на использование Skype. Контроль программ, имеющих доступ, можно выполнить через Настройки-Дополнительно-Расширенные настройки-Контроль доступа других программ к Skype.
    Для доступа к .Net framework из 1С необходимо установить .Net Bridge. Сейчас последняя версия 4.0.4.

    Описание кода C#


    Код класса SkypeSpeech разделен на 2 части: генерация звука через класс SpeechSynthesizer и работа со Skype через SKYPE4COMLib.

    Генерация звука:
    SpeechSynthesizer reader = new SpeechSynthesizer();
    if (!String.IsNullOrEmpty(voiceName))
    {
        var voice = reader.GetInstalledVoices().Where(m => m.VoiceInfo.Name == voiceName).FirstOrDefault();
        if (voice != null)
            reader.SelectVoice(voiceName);
    }
    reader.SetOutputToWaveFile(tempFilePath, new SpeechAudioFormatInfo(
        16000,
        AudioBitsPerSample.Sixteen,
        AudioChannel.Mono
    ));
    
    reader.Speak(text);
    reader.SetOutputToNull();
    reader.Dispose(); 

    Особенности кода следующие. На вход в Skype нужно подать wav-файл с определенными параметрами, поэтому параметры устанавливаются явно. Для управления голосами SpeechSynthesizer используются методы GetInstalledVoices и SelectVoice.

    Работа со Skype ведется через Skype4COM. В Сети есть много примеров, например: http://habrahabr.ru/post/139319/. Все примеры, какие я смотрел, отличаются, на мой взгляд, усложненной структурой: логика не умещается в один метод, а распределена между разными методами и событиями. Хотелось уместить всю логику в одну процедуру для наглядности.

    Подключение к Skype. Второй параметр в skype.Attach заменен на true. Это значит, что скайп возвратит управление, когда произойдет подключение.
    Skype skype = new Skype();
    if (!skype.Client.IsRunning)
        skype.Client.Start(true, true);
    
    skype.Attach(8, true); 
    

    Звонок через Skype:
    Call call = skype.PlaceCall(target);
    do
    {
         if (call.Status == TCallStatus.clsBusy
            || call.Status == TCallStatus.clsCancelled
            || call.Status == TCallStatus.clsFailed)
            break;
    
        System.Threading.Thread.Sleep(1);
    } while (call.Status != TCallStatus.clsInProgress);
    
    if (call.Status != TCallStatus.clsInProgress)
        return; 

    Проигрывание звукового файла. Была предпринята попытка определять время звучания по времени, когда файл занят и не доступен для записи.
    call.set_InputDevice(TCallIoDeviceType.callIoDeviceTypeFile, waveFilePath);
    do
    {
        System.Threading.Thread.Sleep(1000);
    } while (IsBusy(waveFilePath)); 
    

    Метод IsBusy выглядит так:
    try
    {
        using (FileStream stream = File.OpenWrite(filePath))
        {
            stream.Close();
            return false;
        }
    }
    catch (IOException)
    {
        return true;
    } 

    Описание кода 1С


    Инициализация происходит в событии формы ПриОткрытии. Создание объекта .Net Bridge.
    ПодключитьВнешнююКомпоненту("Elisy.NetBridge4");
    AddIn = New("AddIn.ElisyNetBridge4");
    net = AddIn.GetNet(); 

    Загрузка сборки из GAC:
    net.LoadAssembly("System.Speech, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35");

    Загрузка сборки из макета к обработке:
    Макет = ПолучитьМакет("Elisy_SkypeSpeech_dll");
    ДвоичныеДанные = Base64String(Макет);
    assemblyBytes = net.CallStatic("System.Convert", "FromBase64String", ДвоичныеДанные);
    net.CallStatic("System.Reflection.Assembly", "Load", assemblyBytes); 

    За генерацию звука и отправку голосового сообщения через Skype отвечает класс Elisy.SkypeSpeech.SkypeSpeech. Поэтому объект этого типа нужно создать для доступа к нему.
    skypeSpeech = net.New("Elisy.SkypeSpeech.SkypeSpeech");

    Команда генерации аудио-файла skypeSpeech.CreateSpeech. Первый параметр – имя файла с полным путем, второй параметр – текст сообщения. Третий параметр – имя голоса.
    skypeSpeech.CreateSpeech(tempFilePath, Объект.Сообщение, "ScanSoft Katerina_Full_22kHz");

    Команда отправки на Skype голосового сообщения skypeSpeech.SendAudioMessage. Первый параметр – номер телефона или имя Skype. Второй параметр – имя аудио-файла.
    skypeSpeech.SendAudioMessage(Объект.НомерТелефона, tempFilePath);

    Известные проблемы и их решения


    Записанный аудиофайл произносит только слова, написанные латинскими буквами, например, Skype. Это означает, что не установлен в систему или не выбран необходимый русский голос. Его необходимо установить. Если это голос не ScanSoft Katerina Full 22kHz, то необходимо подправить вызов skypeSpeech.CreateSpeech(ПутьКФайлу, Объект.Сообщение, «ScanSoft Katerina_Full_22kHz») на нужное имя голоса.

    При нажатии «Позвонить по Skype TargetInvokationException с сообщением «Retrieving the COM class factory for component with CLSID {830690FC-BF2F-47A6-AC2D-330BCB402664} failed due to the following error: 80040154 Класс не зарегистрирован (Exception from HRESULT: 0x80040154 (REGDB_E_CLASSNOTREG)).». Это означает, что должным образом не зарегистрирована библиотека для доступа к Skype skype4COM.dll. Ее нужно скачать и зарегистрировать с правами администратора через regsvr32 skype4COM.dll.

    Что не реализовано


    Обработка работает исходя из предположения, что передача передача голосового сообщения будет вестись стандартным образом: звонок – ответ – передача сообщения – завершение звонка. В текущей версии обработки нет анализа статуса: доставлено или недоставлено. Например, телефон у абонента может быть занят или абонент начал слушать сообщение и самостоятельно прервал разговор.

    В 1С не удалось удалить временный файл в конце обработки. Это странное явление, которое не удалось побороть, потому что в тестовом приложении через C# временный файл нормально удалялся.

    Пример полученного аудио-файла для ScanSoft Katerina_Full_22kHz: audio.wav (180,78 kb)
    Пример полученного аудио-файла для RHVoice Elena (Russian): audio-rhvoice.wav (159,42 kb)
    Пример полученного аудио-файла для RHVoice Aleksandr (Russian): audio-rhvoice-alexandr.wav (196,76 kb)


    Обработка для 1С: Предприятие: SkypeSpeech.epf (14,21 kb)
    Поделиться публикацией
    AdBlock похитил этот баннер, но баннеры не зубы — отрастут

    Подробнее
    Реклама
    Комментарии 26
    • +5
      ужс
      • –1
        1С позвонит тебе!
        • НЛО прилетело и опубликовало эту надпись здесь
          • 0
            По моему опыту напрягает только первые два-три года, потом малость напрягает переключение раскладок при одновременной разработка в 1С и другой среде (тоже годика два). А потом все становится ниже пряжки. Привыкаешь.
            • 0
              А с точки зрения удобства описания бизнес процессов — то да, удобно. Представлен адекватный конструктор из сущностей (ну или прототипов сущностей), хранилищ информации о них.

              Нет ООП, да и пофиг метелки (хотя с ним было бы НАМНОГО проще). Оно работает, и для решения своих задач более чем адекватно.
              • +1
                5 лет адаптации ?!
                Не-не-не-не, нафиг-нафиг!
                • 0
                  Не знаю, мне и пару месяцев хватило для адаптации
              • 0
                если ничего другого не пробовал то мозг видимо считает что удобно, есть коллеги которые считают 1с верхом совершенства
                • 0
                  1С — это инструмент. Все зависит от задач. Разработать интернет-магазин без доп.средств невозможно. А разработать учет на складе или доработать бухгалтерию на отдельно взятом предприятии очень даже удобно. Где-то цифра была об 1 миллионе пользователей 1С. Это внушительная цифра. Значит очень многие находят ее удобной.
                  • 0
                    да не важно миллион пользователей или меньше, (учитывая) что большенству пользователям именно «навязывают» использование 1с. Факт в корявости архитектуры, которую до ума довесту не могут уже какой десяток лет
                    • 0
                      Как можно «навязать» использование 1С? Приходят и говорят: «Используй 1С, а не то изуродуем»? Насколько я знаю, SAP и Dynamics представлены на рынке, но занимают весьма скромную долю. Или «навязывние» имеется в виду предложение более дешевой, легче конфигурированной и более приспособленной к российским законам системы, что отказаться от ипсользования невозможно? Обслуживание тоже очень доступное — в каждом городе минимум по несколько 1С-партнеров. В таком случае мне, как разработчику, тоже навязали 1С, предложив оплату труда в 2 раза выше, чем зарабатывал на C++/C#. Везде бы было такое навязывание.
                      • 0
                        1 миллион разработчиков? Или всё же пользователей/операторов у которых есть выбор с чем работать на рабочем месте??
                        • 0
                          Речь шла о продаже одного миллиона лицензий. Наверняка, это завышенные данные от 1С, включающие разные версии 7.7/8.x, но даже, если в 2 раза меньше, то цифра весьма внушительная.
                      • 0
                        В чем заключается корявость архитектуры в сравнении с конкурентами (программирование на русском не предлагать, это не бага это фича)?
                  • +1
                    Для создания бухгалтерских и приложений по учету быстро и удобно. Для дополнительного функционала подключаю .Net framework, как в данном случае. Удобна масштабируемость от однопользовательской поставки до варианта клиент-сервер. Удобна кроссплатформенность: написанное на 1С с большой вероятностью будет работать на Windows и в новой версии на Linux. Также удобна раскрученность бренда 1С, что позволяет быстрее продать свои разработки: ведь конечная цель любых разработок, чтобы ими пользовались, а не чтобы было удобно разрабатывать.

                    Неудобно отношение 1С к своим разработчикам: компания 1С делает только то, что ей выгодно. При таком подходе система нестройная, развивается в непонятном направлении. А разработчики под 1С чувствуют себя как бедные родственники.
                    Действительно нет ООП, что, на мой взгляд, приводит к избыточности в коде — одни и те же куски кода, например, проходят через все документы.
                  • 0
                    Небольшое уточнение по голосам для заинтересовавшихся:

                    Упомянутый голос ScanSoft Katerina Full 22kHz является проприетарным ПО, к тому же версия, требующая разгона через реестр, не самая новая.

                    Фактически же для работы в систему должен быть установлен синтезатор речи формата Microsoft Speech API 5.x (SAPI 5), поддерживающий интересующий язык.

                    В относительно открытом доступе SAPI5-синтезаторы с поддержкой русского языка есть у таких производителей как Nuance Vocalizer, Acapela Group, Loquendo, Sakrament (это фирмы, а их продукты могут идти под дополнительными брендами, типа ScanSoft, RealSpeak, InfoVox и др.).

                    Существуют и бесплатные русские SAPI5-синтезаторы, в частности RHVoice, Капитан (с возможностью подключения дополнительных голосов), TTS, Chatterbox, Vikno, eSpeak. Отдельные из них являются и open source.

                    Но если исходить из соображений, что потенциальным пользователем text-to-speech функционала будет человек не очень привычный к восприятию синтезированного голоса, то я бы рекомендовал RHVoice, как бесплатный синтезатор с наиболее естественной речью.

                    Коммерческие продукты по естественности в целом несколько выше, чем бесплатные, хотя RHVoice с некоторыми из них вполне может посоревноваться.

                    Если кому-то нужна более подробная информация, то буду рад помочь.
                    • 0
                      Спасибо за один из самых ценных комментариев. Установил RHVoice и в конце статьи привел образцы звучания для 3х голосов. Действительно RHVoice очень хорошо показал себя.
                      Особенностью RHVoice является произношение слов, написанных латинскими буквами на немецкий манер (например, Skype как «скипе»). Поэтому в текстовой строке пришлось заменить «Skype» на «скайп».
                      • 0
                        Как я понимаю, вы используете RHVoice 0.2.161.

                        В принципе в нём содержится четыре голоса: два Александра и две Елены. Сдвоенные варианты как раз и отличаются тем, что один читает латиницу по правилам латыни, а другой пытается это делать по правилам английского языка.

                        Например, фразу «this is a test» вариант Russian прочитает как [тхис ис а тест], а Pseudo-English как [зис из э тэст].

                        Соответственно если вам нужно примерное чтение английского текста, то можно просто использовать Pseudo-English. По крайней мере, с чтением «Skype» как [Скайп] он справится.

                        Кстати, сейчас уже есть RHVoice 0.4.x, переписанный буквально с нуля, и там появился новый русский голос, но это даже ещё не beta, а наверное что-то на уровне alpha, потому что многие возможности 0.2.x там ещё не реализованы, например, вопросительная интонация.
                      • 0
                        Хотел вас спросить еще об одном моменте. В статье используется класс System.Speech.Synthesis.SpeechSynthesizer, стандартно входящий в .Net Framework.
                        Но Microsoft предлагает отдельные дистрибутивы: Microsoft Speech Platform Runtime 11 и Microsoft Speech Platform — Server Runtime.
                        Microsoft Speech Platform Runtime 11 предлагает отдельную сборку, отличающуюся пространством имен и голоса, которые после установки не видны из стандартного класса .Net Framework.
                        Голоса Microsoft Speech Platform — Server Runtime идут отдельными дистрибутивами и также не видны из стандартного класса .Net Framework после установки.
                        Исходя из этого вопросы: чем отличаются отдельные дистрибутивы Microsoft от классов, включенных в .Net framework 3.0 и почему голоса несовместимы между собой? В реестре голоса от Speech Platform создают отдельные ветки, не входящие в
                        HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Speech\Voices\Tokens<code>
                        • 0
                          Дело в том, что Microsoft Speech Platform — это в сущности самостоятельный продукт, не имеющий зависимостей с Microsoft Speech API. То есть фактически речь идёт о совершенно разных технологиях TTS.

                          У Speech Platform и SDK отдельный от SAPI5. Вообще подробнее об этом можете прочитать здесь.

                          Но в принципе не уверен, что вам вообще пока имеет смысл смотреть в сторону Microsoft Speech Platform. Дело в том, что поддержка русского там, конечно, есть, но когда смотрел последний раз, голоса там были в качестве 8 кГц, тогда как RHVoice в 16 кГц, а основные коммерческие варианты вообще в 22 кГц. В итоге голос Елена от Microsoft звучит не очень приятно для уха неподготовленного человека. В сущности он подходит в большей степени для мобильных устройств, где сейчас преимущественно и применяется, в частности в Windows Phone 8, хотя изначально появился кажется в сервисе MS Translator.
                          • 0
                            Да, кстати, как понимаю, поддержка Microsoft Speech Platform в .Net framework началась лишь с версии 4.0. Хотя могу и ошибаться, лучше меня перепроверить.
                        • –1
                          Слышал я эту «Катерину» когда разрабатывал IVR на Nuance SpeechServer… Единственный русский голос у Nuance, и на мой взгляд TTS в его исполнении слышится как будто 45-ти летнюю курящую женщину с большого бодуна попросили через силу чего-то там наговорить.

                          Так что рекомендую действительно поискать какие-то другие голоса генерации text-to-speech — меньше травмировать чуткие души бухгалтеров :)
                          • 0
                            Посмотрел сейчас — в текущей линейке для России только один голос (для RealSpeak) и это «Милена». Как звучит эта женщина сейчас у меня нет возможности проверить :)
                            • 0
                              Милена — это уже новая линейка Vocalizer. По большому счёту, на текущий момент наиболее распространённый пакет синтезаторов под разные языки, так как чаще всех идёт в решениях под основные платформы: Windows, OS X, iOS и др.

                              Послушать можете, например, здесь (это запись HQ-версии из под Mac OS X 10.7, но голос в целом тот же).

                              Вообще, как уже писал, я бы из бесплатных советовал RHVoice, ну а из коммерческих, наверное, Алёну от Acapela Group, пожалуй, она будет наименее травмирующим неподготовленного слушателя вариантом, особенно если перед этим подключить к ней расширенный словарь ударений.
                            • 0
                              В конце статьи привел примеры для схожего текста, который читают 3 голоса.
                            • 0
                              Как раз сейчас мне в тему! Благодарю за труд.

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