Форум программистов, компьютерный форум, киберфорум
Python: Web
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 Аватар для 15 символов огр
4 / 4 / 3
Регистрация: 12.08.2017
Сообщений: 35

Трансформация голосового сообщения в текст

15.12.2017, 18:54. Показов 6760. Ответов 0
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток, я создал чат-бота сообщества в Вкотанкте (бот функционирует на pythonanywhere.com) и решил добавить функцию распознавания голоса. Для реализации этой функции выбрал API Wit.ai, создал аккаунт, создал приложение, установил модуль Wit. На сервере в файле flask_app.py (где происходит приём сообщений от пользователя к боту), добавил условие, если было отправлено голосовое сообщение, то скачать файл на сервер по ссылке из json-ответа, файл Flask_app.py:

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
from flask import Flask, request, json
from settings import confirmation_token, token
import vkapi
import database
import messagehandler
import urllib.request
import os
 
app = Flask(__name__)
 
@app.route('/', methods=['POST'])
def processing():
    data = json.loads(request.data) #json-ответ
    user_id = data['object']['user_id'] #идентификатор страницы пользователя
    data_str = str(data) #переводим json в строку, чтобы узнать были в сообщении вложения или нет
    attach = None
    if 'attachments' in data_str:
        attach = data['object']['attachments'][0]
    else:
        attach = 'none'
    if 'type' not in data.keys():
        return 'not vk'
    if data['type'] == 'confirmation':
        return confirmation_token
    #если тип сообщения 'новое сообщение'
    elif data['type'] == 'message_new':
        #проверка по базе данных
        ids = database.get_id()
        if str(user_id) in ids:
            #нет вложений
            if attach == 'none':
                messagehandler.create_answer('text', data['object'], user_id, token)
            #если вложение - голосовое сообщение
            elif attach['doc']['title'] == 'Audio Message':
                #скачиваем на сервер
                Download_mp3(attach['doc']['url'], str(user_id))
                if os.path.exists('audio_message_'+ str(user_id) +'.mp3'):
                    #формируем ответ
                    messagehandler.create_answer('audio', 'no data', user_id, token)
                else:
                    vkapi.send_message(user_id, token, 'Голосовое сообщение не загружено на сервер.')
        else:
            vkapi.send_message(user_id, token, 'Вы там бла-бла-бла не может пользоваться ботом.')
    return 'ok'
#функция скачивания
def Download_mp3(url, user_id):
    #изменяем формат скачиваемого файла
    url = url.replace('.ogg', '.mp3')
    audio = urllib.request.urlopen(url).read()
    f = open('audio_message_' + user_id + '.mp3', "wb")
    f.write(audio)
    f.close()
В конечном итоге на сервере вижу файл "audio_message_<идентификатор>.mp3", даже могу его прослушать, то есть скачивание произошло успешно. Следующий этап сформировывание ответа, функция create_answer в файле messagehandler.py:
Python
1
2
3
4
5
6
7
8
9
10
11
def create_answer(type, data, user_id, token):
   load_modules() #загрузка всех .py файлов из папки commands
   message = ''
   attachment = ''
 
   if type == 'text':
       message, attachment = get_answer(data['body'].lower(), user_id)
   if type == 'audio':
       message, attachment = get_answer(audio_to_text(user_id).lower(), user_id)
 
   vkapi.send_message(user_id, token, message, attachment)
Сюда был передан тип сообщения, данные, айди юзера и токен. Затем была вызвана функция get_answer, вот она:
Python
1
2
3
4
5
6
7
8
9
10
11
12
def get_answer(body, user_id):
   message = "Неопознанная команда."
   attachment = ''
   #среди списка команд (список классов)
   for c in command_list:
       #среди списка ключевых слов
       for k in c.keys:
           if k in body:
               message, attachment = c.process(body, user_id)
               return message, attachment
 
   return message, attachment
Сюда передаются текст команды и айди, функция выполняет проверку полученного текса на соответствие ключевым словам (командам), в случае несоответствия вернет "Неопознанная команда". В качестве первого параметра get_answer была передана функция audio_to_text:
Python
1
message, attachment = get_answer(audio_to_text(user_id).lower(), user_id)
Вот она:
Python
1
2
3
4
5
def audio_to_text(user_id):
    client = Wit('мой api ключ приложения')
    with open('audio_message_' + str(user_id) + '.mp3', 'rb') as f:
      resp = client.speech(f, None, {'Content-Type': 'audio/mpeg3'})
    return str(resp['_text'])
Функция должна вернуть строку, однако происходит ошибка на строке
Python
1
resp = client.speech(f, None, {'Content-Type': 'audio/mpeg3'})
Текст ошибки: wit.wit.WitError: Wit responded with status: 400 (Bad Request)
Я подумал, что, может файл как-то не так скачивается (хотя я могу его прослушать), решил проверить локально, на компе. Изменил код Flask_app.py, чтобы на каждое голосовое сообщение бот только отправлял ссылку на скачивание этого сообщения. Скопировал функцию скачивания и перевода голоса в текст, вставил ссылку, проверил, сработало - функция вернула текст. То есть локально код работает, а на сервере нет. Прошу помочь, все упирается в эту ошибку. Писал в тех поддержку Wit, но они сказали, что, мол, если это работает локально, то проблема не на нашей стороне.
P.S. Как-то странно, я могу прослушать файл на сервере, но когда скачиваю файл, то плеер не может его воспроизвести, мол, файл поврежден.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
15.12.2017, 18:54
Ответы с готовыми решениями:

Запись голосового сообщения
Необходимо по нажатию кнопки начать запись голосового сообщения, при нажатии другой кнопки прекратить запись, ну и соответственно, при...

Передача абонентам голосового сообщения
Задача : написать прогу на VB6 которая звонила бы абоненту и когда тот вохмёт трубку проиграла бы wav файл. Дозвон написал с применением...

В файле mail.tpl не выводится заголовок сообщения {$subject} и текст сообщения {$message}
ребят помогите разобраться, изначально у меня все выводилось через функцию popupWindow вот сама функция JS function...

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
15.12.2017, 18:54
Помогаю со студенческими работами здесь

Текст электронного сообщения
здравствуйте, возможно ли в текст электронного сообщения вставить результат запроса в виде таблицы? за ранее спасибо!

Получить из event текст сообщения
Здравствуйте, я начал писать бота на Python для вк. Вот код: from random import random from vk_api import VkApi from...

Вконтакте Текст сообщения в ссылке
Реально в ссылке передать текст сообщения, чтобы, когда переходили по ссылке, сообщение уже было набрано?

Распечатать текст сообщения MsgBox
Здравствуйте Чтобы распечатать сообщение в MsgBox, я его копирую комбинацией Ctrl+C, вставляю в какой нибудь документ и потом...

Gmail отправка сообщения (текст)
Всем добра... Не могу найти нормальный туториал или же исходный код, для отправки сообщения на gmail через приложение. Нужно: при...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Новые блоги и статьи
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru