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

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

15.12.2017, 18:54. Показов 6779. Ответов 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
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru