Доброго времени суток, дорогие друзья.
Всем знакома ситуация, когда занимаясь чем-то важным получаешь сообщение в ВК, но, как правило, возможности открыть и прочесть нет. Для решения данной проблемы я создал программу.
Давайте более детально разберёмся.
Необходимо сделать 4 вещи:
- Скачать и установить язык программирования Python 2.7
- Установить необходимые модули для Python
- Создать и включить приложение в ВКонтакте.
- Скачать и запустить скрипт.
Может звучит страшно, но делается за 5 минут и по силам даже гуманитарию.
Скачиваем здесь язык программирования Python 2.7 и устанавливаем на компьютере.
Устанавливаем необходимые модули для Python.
Переходим в папку, куда установили Python (по умолчанию устанавливается в C:\Python27), далее в папку Script. Из папки запускаем окно команд (зажимаем shift, далее ПКМ и выбираем Открыть окно команд). Пишем строчку: pip install vk pygame yandex_speech. Нажимаем Enter. Начнется автоматическое скачивание и установка модулей.
Создаем и включаем приложение в ВКонтакте.
Переходим по ссылке -> "Создать приложение" -> Вводим любое название, платформу не меняем -> "Подключить приложение" -> "Подтвердить через SMS" -> Подтверждаем.
Далее появляется информация о приложение. Переходим в настройки -> Меняем критерий Состояние на Приложение включено и видно всем -> "Сохранить изменения".
В настройках видим пункт ID приложения. Запоминаем для дальнейшего использования.Скачиваем и запускаем скрипт.
Скачиваем архив со скриптом и распаковываем в любую папку все файлы архива. Запускаем ListenVK.py.
Готово.
Теперь, получив сообщение в ВКонтакте не надо отвлекаться на переключение между вкладками.
Время разобраться с кодом.
# -*- coding: utf-8 -*-
import vk
import time
import pygame
from yandex_speech import TTS
session = vk.AuthSession('ID приложения','Логин','Пароль', scope='messages' )
api = vk.API(session)
tts = TTS("zahar" , "mp3" , "05808c62-a502-4724-a85c-3b8ac74343e9" )
def say( message ):
tts.generate(mes)
tts.save("speech.mp3")
pygame.mixer.init()
pygame.mixer.music.load("speech.mp3")
pygame.mixer.music.play()
while pygame.mixer.music.get_busy():
time.sleep(1)
pygame.mixer.music.load("some.mp3")
def getName( id ):
name = api.users.get(user_ids=str(id))
return name[0][u'first_name'] + u' ' + name[0][u'last_name']
if __name__ == '__main__':
print "Script ready"
while True:
messages = api.messages.get( time_offset = '3' )
for message in messages[1:]:
mes = message[u'body'].replace(u'
',u'. ')
mes = "{0}.{1}".format( getName(message[u'uid']) , mes )
say(mes)
time.sleep(5)
Код получился компактным. В первых строчках импортируются модули, которые скачиваются в во втором пункте.
vk - Модуль для взаимодействия с ВКонтакте
pygame - Модуль для воспроизведения голоса.
yandex_speech - Модуль для перевода текста в голос.
session = vk.AuthSession('ID приложения','Логин','Пароль', scope='messages' )
api = vk.API(session)
tts = TTS("zahar" , "mp3" , "05808c62-a502-4724-a85c-3b8ac74343e9" )
Здесь происходит инициализация необходимых инструментов: vkapi и tts яндекса. Если объяснить простым языком - инструменты, которыми будем доставать информацию из ВКонтакте и переводить текст в голос.
В первой строке необходимо добавить наши данные. Вместо 'ID приложения', 'Ваш логин' и 'Ваш пароль' пишем свои реальные данные. ID приложения это тот самый ID, который запоминали в 3 пункте.
Получится примерно так:
session = vk.AuthSession( '6310131' , '[email protected]' , 'Qwerty1992' , scope='messages' ).
В третей строке функция TTS имеет три параметра:
- Каким голосом будет зачитываться текст.
Возможные значения Женщин: "jane", "oksana", "alyss", "omazh" или Мужчины: "zahar", "ermil". - Формат сохранения записи: "mp3", "wav", "opus".
- API ключ.
Можно использовать мой. Также стоит добавить параметры:
"emotion" - С какими эмоциями будет зачитан текст. Возможные значения: "neutral" (по умолчанию), "evil", "good". - Скорость чтения ("speed" ).
Возможные значения: от 0.1 (медленно) до 3.0 (быстро).
Идем дальше. Программа имеет две функции:
- say( message ) - функция, которая зачитывает строку message.
- getName( id ) - функция, которая возвращает имя и фамилию аккаунта ВК с id, который передаем.
Их разберём позже.
if __name__ == '__main__':
print "Script ready"
while True:
messages = api.messages.get( time_offset = '5' )
for message in messages[1:]:
mes = message[u'body'].replace(u'
',u'. ')
mes = "{0}.{1}".format( getName(message[u'uid']) , mes )
say(mes)
time.sleep(5)
Как можно заметить, сначала выводится строка "Script ready". Сигнализирует об удачной инициализации скрипта и начале работы.
Затем происходит бесконечный цикл.
messages = api.messages.get( time_offset = '5' )
Получаем сообщения, отправленные в течение 5 последних секунд.
for message in messages[1:]:
Перебираем все полученные сообщения.
mes = message[u'body'].replace(u'
',u'. ')
mes = "{0}.{1}".format( getName(message[u'uid']) , mes )
say(mes)
Формируем текст, который далее будет озвучен. Сначала имя и фамилия человека, который нам написал. Затем текст сообщения.
def say( message ):
tts.generate(mes)
tts.save("speech.mp3")
pygame.mixer.init()
pygame.mixer.music.load("speech.mp3")
pygame.mixer.music.play()
while pygame.mixer.music.get_busy():
time.sleep(1)
pygame.mixer.music.load("some.mp3")
Рассмотрим функцию say( message ).
tts.generate(mes)
tts.save("speech.mp3")
Генерируем запись голоса и сохраняем в файл.
pygame.mixer.init()
pygame.mixer.music.load("speech.mp3")
pygame.mixer.music.play()
Инициализируем pygame, загружаем запись и воспроизводим.
while pygame.mixer.music.get_busy():
time.sleep(1)
Метод get_busy() возвращает True, если запись воспроизводится. В этом случае ждем одну секунду, и проверяем снова, до тех пор, пока get_busy() не вернет False (запись закончит воспроизводится).
pygame.mixer.music.load("some.mp3")
Извиняюсь. Костыль. Если открывать два раза подряд файл speech.mp3 - появляется ошибка. Пытался исправить, но тщетно.
Если знаете как исправить - пишите в комментариях. Буду признателен. =)
def getName( id ):
name = api.users.get(user_ids=str(id))
return name[0][u'first_name'] + u' ' + name[0][u'last_name']
Вторая функция. Здесь все просто: api.users.get(id) - возвращает информацию аккаунта по id.
name[0][u'first_name'] - Имя
name[0][u'last_name'] - Фамилия
Ну вот и всё))
Всего доброго. До свидания =))
Студенты ушли на каникулы, а я продолжаю привлекать авторов в голос. Игрока в Омаху и любителя ставок, бизнесменов из турфирмы и дошли руки до юного кодера из враждебно настроенного университета политехнического. Пока vp-cosmos на каникулах - буду поддерживать авторов через свой блог.
Материал куплен на бирже Протея за 40 GBG, вычитка @sergesfnv, команда @sci-populi
А для чего весь сыр-бор-то? Чтобы сообщения из вк-шечки голосом зачитывались? Это действительно проблема? :)
Давайте лучше что-нибудь более насущное. Например, скрипт для запуливания ставки в первый же после голоса коинбанка блок )))
а он разве блоки сканирует или свое роухистори?
Што за роухистори - знать не знаю. Суть предлагаемого скрипта проста, как бублик: сканировать транзакции от банки, как только пошел апвоут - в след. блок кидать свою ставку.
пистоновский питон кидает в будущий блок 10 по счету от текущего
Ваш пост поддержали следующие Инвесторы Сообщества "Добрый кит":
alex2016, ianboil, vako, rbrown, niiu, korzhimanov, vik, forbon21, ohlamoon, shuler, yurgent71, volv, vasilisapor2, andreyprosto, vict0r, kssenia, svinsent, gromozeka, drim, ladynazgool, ladykosha, karusel1, snaryaga, rubin, ovtretya, stranniksenya, gapel, acidgarry, vika-teplo, oagalakova, borisss, virt, nims55, kis-dikiy, optimist, lushaya, amarizento, dmitrijv, olgaborisova, manavendra, victorskaz, ermakovaolga, makcum52, techofox, lokkie, igrinov, student61, prifix, shenanigan, moranor, skiexpert, zhenek, onegin, ksantoprotein, chimborazo, kakachaca, leminger, karmoputnik, naiger, byurotegov, dunsky, firestarter, dart-ezra, vlad1m1r, shafarevich, kanalex, francuzzz, verdon, kito-boy, metamorfozzz, gogirotsky, vsebudethorosho, sansey, izbushka, alexey77, astramar, goldenriver, solips, mifilin, blog.experta, katherina, andrzhej, carpe-diem, trifler, iot, funt33, jahspear, anandasurya, mister-omortson, apnigrich, keali, cryptostock, eliney, siddxa, cryptobandera, privet, lordarhont, egoryana, lologom, makssib, anykeycheg, molchyn, worthless-man
Поэтому я тоже проголосовал за него!
Так как Вы голосуете за мои посты, я проголосовал на 33% сильнее!
dobryj.kit теперь стал Делегатом! Ваш голос важен для всего сообщества!!!
Поддержите нас:
спасибо за инфу про яндекс спичкит. до этого только с гуглом работал
ага... всегда есть что-то новое