树莓派与Stm32通信,生成、播放语音

# -*- coding: utf-8 -*-
# @Author: hzf
# @Date:   2019-12-04 18:57:43
# @Last Modified by:   hzf
# @Last Modified time: 2019-12-09 12:46:49
# coding=utf-8
import sys
import json
import	time
import	serial
import	os

ser = serial.Serial('/dev/ttyACM1', 9600, timeout = 1)#ls /dev/tty*查看具体端口

IS_PY3 = sys.version_info.major == 3
if IS_PY3:
    from urllib.request import urlopen
    from urllib.request import Request
    from urllib.error import URLError
    from urllib.parse import urlencode
    from urllib.parse import quote_plus
else:
    import urllib.request
    from urllib import quote_plus
    from urllib.request import urlopen
    from urllib.request import Request
    from urllib.request import URLError
    from urllib import urlencode

API_KEY = 'i0mqgE9uTRziKXWNbyeblOC6'
SECRET_KEY = 'nj1XxxaBqbVQajD3bkgcTT5YE9in9UGv'

TEXT = "欢迎使用"

# 发音人选择, 0为普通女声,1为普通男生,3为情感合成-度逍遥,4为情感合成-度丫丫,默认为普通女声
PER = 4
# 语速,取值0-15,默认为5中语速
SPD = 5
# 音调,取值0-15,默认为5中语调
PIT = 5
# 音量,取值0-9,默认为5中音量
VOL = 5
# 下载的文件格式, 3:mp3(default) 4: pcm-16k 5: pcm-8k 6. wav
AUE = 3

FORMATS = {3: "mp3", 4: "pcm", 5: "pcm", 6: "wav"}
FORMAT = FORMATS[AUE]

CUID = "123456PYTHON"

TTS_URL = 'http://tsn.baidu.com/text2audio'


class DemoError(Exception):
    pass


"""  TOKEN start """

TOKEN_URL = 'http://openapi.baidu.com/oauth/2.0/token'
SCOPE = 'audio_tts_post'  # 有此scope表示有tts能力,没有请在网页里勾选


def fetch_token():
    print("fetch token begin")
    params = {'grant_type': 'client_credentials',
              'client_id': API_KEY,
              'client_secret': SECRET_KEY}
    post_data = urlencode(params)
    if (IS_PY3):
        post_data = post_data.encode('utf-8')
    req = Request(TOKEN_URL, post_data)
    try:
        f = urlopen(req, timeout=5)
        result_str = f.read()
    except URLError as err:
        print('token http response http code : ' + str(err.code))
        result_str = err.read()
    if (IS_PY3):
        result_str = result_str.decode()

    print(result_str)
    result = json.loads(result_str)
    print(result)
    if ('access_token' in result.keys() and 'scope' in result.keys()):
        if not SCOPE in result['scope'].split(' '):
            raise DemoError('scope is not correct')
        print('SUCCESS WITH TOKEN: %s ; EXPIRES IN SECONDS: %s' % (result['access_token'], result['expires_in']))
        return result['access_token']
    else:
        raise DemoError('MAYBE API_KEY or SECRET_KEY not correct: access_token or scope not found in token response')

def createmp3(TEXT):
	token = fetch_token()
		    tex = quote_plus(TEXT)  # 此处TEXT需要两次urlencode
		    print(tex)
		    params = {'tok': token, 'tex': tex, 'per': PER, 'spd': SPD, 'pit': PIT, 'vol': VOL, 'aue': AUE, 'cuid': CUID,
		              'lan': 'zh', 'ctp': 1}  # lan ctp 固定参数

		    data = urlencode(params)
		    print('test on Web Browser' + TTS_URL + '?' + data)

		    req = Request(TTS_URL, data.encode('utf-8'))
		    has_error = False
		    try:
		        f = urlopen(req)
		        result_str = f.read()

		        headers = dict((name.lower(), value) for name, value in f.headers.items())

		        has_error = ('content-type' not in headers.keys() or headers['content-type'].find('audio/') < 0)
		    except  URLError as err:
		        print('asr http response http code : ' + str(err.code))
		        result_str = err.read()
		        has_error = True

		    save_file = "error.txt" if has_error else 'result.' + FORMAT
		    with open(save_file, 'wb') as of:
		        of.write(result_str)

		    if has_error:
		        if (IS_PY3):
		            result_str = str(result_str, 'utf-8')
		        print("tts api  error:" + result_str)

		    print("result saved as :" + save_file)


def Radio():
	import subprocess
	import shlex
	dir = /home/pi/start.mp3
	command_line = "omxplayer -o local " + dir
	args = shlex.split(command_line)
	print(args)
	subprocess.Popen(args)
	#播放完毕后删除该音频,等待下次重新创建,防止播放错误
	try:
		os.remove(dir)
	except:
		os.rmdir(dir)
"""  TOKEN end """

texts = ['欢迎使用智能升降椅子','请调整坐姿,您可能需要左边一点点','请调整坐姿,您可能需要又边一点点']
if __name__ == '__main__':
	try:
		while 1:
			result_data = str(ser.read())
			if result_data[0:2] == 'A5':#检测到来自于stm32的指令
				height = int(result_data[4])*10+int(result_data[5])+0.1*int(result_data[6])
				weight = int(result_data[7])*10+int(result_data[8])+0.1*int(result_data[9])
				if result_data[2]==1 and result_data[3]==0:
					start_t = time.time()#开始计时
					createmp3(texts[0])
					Radio()
				if result_data[2]==0 and result_data[3]==1:
					stop_t = time.time()#停止计时
					text = '您本次使用时长为:'+str(stop_t-start_t)+'欢迎您下次使用'
					createmp3(text)
					Radio()
				if time.time() - start_t > 20:
					text = '长时间工作对身体不好,亲亲,这边建议您休息呢'
					createmp3(text)
					Radio()
			if result_data[0] == 's':
				if result_data[1] == 'l':
					createmp3(texts[1])
					Radio()
				else if result_data[1] == 'r':
					createmp3(texts[2])
					Radio()

	except:
		ser.close()
发布了31 篇原创文章 · 获赞 43 · 访问量 5234

猜你喜欢

转载自blog.csdn.net/qq_41582910/article/details/103491176