1,6
рейтинг
15 января 2013 в 13:58

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

C#*, .NET*
Обработка для 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)
Карташев Сергей @Elisy
карма
21,0
рейтинг 1,6
IT-менеджер
Реклама помогает поддерживать и развивать наши сервисы

Подробнее
Спецпроект

Самое читаемое Разработка

Комментарии (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
    Как раз сейчас мне в тему! Благодарю за труд.

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